Path: blob/master/webroot/rsrc/js/application/calendar/behavior-day-view.js
12242 views
/**1* @provides javelin-behavior-day-view2* @requires phuix-icon-view3*/4JX.behavior('day-view', function(config) {56function findTodayClusters() {7var events = today_events.sort(function(x, y){8return (x.eventStartEpoch - y.eventStartEpoch);9});1011var clusters = [];1213for (var i=0; i < events.length; i++) {14var today_event = events[i];1516var destination_cluster_index = null;17var event_start = today_event.eventStartEpoch - (60);18var event_end = today_event.eventEndEpoch + (60);1920for (var j=0; j < clusters.length; j++) {21var cluster = clusters[j];2223for(var k=0; k < cluster.length; k++) {24var clustered_event = cluster[k];25var compare_event_start = clustered_event.eventStartEpoch;26var compare_event_end = clustered_event.eventEndEpoch;2728if (event_start < compare_event_end &&29event_end > compare_event_start) {30destination_cluster_index = j;31break;32}33}3435if (destination_cluster_index !== null) {36break;37}38}3940if (destination_cluster_index !== null) {41clusters[destination_cluster_index].push(today_event);42destination_cluster_index = null;43} else {44var next_cluster = [];45next_cluster.push(today_event);46clusters.push(next_cluster);47}48}4950return clusters;51}5253function updateEventsFromCluster(cluster) {54var cluster_size = cluster.length;55var n = 0;56for(var i=0; i < cluster.length; i++) {57var cluster_member = cluster[i];5859var event_id = cluster_member.eventID;60var offset = ((n / cluster_size) * 100) + '%';61var width = ((1 / cluster_size) * 100) + '%';6263for (var j=0; j < today_events.length; j++) {64if (today_events[j].eventID == event_id) {6566today_events[j]['offset'] = offset;67today_events[j]['width'] = width;68}69}70n++;71}7273return today_events;74}7576function drawEvent(e) {77var name = e['eventName'];78var eventID = e['eventID'];79var viewerIsInvited = e['viewerIsInvited'];80var offset = e['offset'];81var width = e['width'];82var top = e['top'];83var height = e['height'];84var uri = e['uri'];8586var sigil = 'phui-calendar-day-event';87var link_class = 'phui-calendar-day-event-link';8889if (viewerIsInvited) {90link_class = link_class + ' viewer-invited-day-event';91}9293var icon = new JX.PHUIXIconView()94.setIcon(e.displayIcon)95.setColor(e.displayIconColor)96.getNode();9798var content = [icon, ' ', name];99100var name_link = JX.$N(101'a',102{103className : link_class,104href: uri105},106content);107108var class_name = 'phui-calendar-day-event';109if (e.canEdit) {110class_name = class_name + ' can-drag';111}112113var div = JX.$N(114'div',115{116className: class_name,117sigil: sigil,118meta: {eventID: eventID, record: e, uri: uri},119style: {120left: offset,121width: width,122top: top,123height: height124}125},126name_link);127128return div;129}130131function drawAllDayEvent(e) {132var class_name = 'day-view-all-day';133134var icon = new JX.PHUIXIconView()135.setIcon(e.displayIcon)136.setColor(e.displayIconColor)137.getNode();138var content = [icon, ' ', e.name];139140var name = JX.$N(141'a',142{143className: class_name,144href: e.uri145},146content);147148var all_day_label = JX.$N(149'span',150{className: 'phui-calendar-all-day-label'},151'All Day');152153var div_all_day = JX.$N(154'div',155{className: 'phui-calendar-day-event all-day'},156[all_day_label, name]);157158return div_all_day;159}160161function drawRows() {162var rows = [];163var early_hours = [8];164if (first_event_hour) {165early_hours.push(first_event_hour);166}167var min_early_hour = Math.min(early_hours[0], early_hours[1]);168169170for(var i=0; i < hours.length; i++) {171if (hours[i]['hour'] < min_early_hour) {172continue;173}174var cell_time = JX.$N(175'td',176{className: 'phui-calendar-day-hour'},177hours[i].displayTime);178179var cell_event = JX.$N(180'td',181{182meta: {183time: hours[i].displayTime184},185className: 'phui-calendar-day-events',186sigil: 'phui-calendar-day-event-cell'187});188189var row = JX.$N(190'tr',191{},192[cell_time, cell_event]);193rows.push(row);194}195return rows;196}197198function clusterAndDrawEvents() {199var today_clusters = findTodayClusters();200for(var i=0; i < today_clusters.length; i++) {201today_events = updateEventsFromCluster(today_clusters[i]);202}203var drawn_hourly_events = [];204for (i=0; i < today_events.length; i++) {205drawn_hourly_events.push(drawEvent(today_events[i]));206}207208JX.DOM.setContent(hourly_events_wrapper, drawn_hourly_events);209210}211212var year = config.year;213var month = config.month;214var day = config.day;215var query = config.query;216217var hours = config.hours;218var first_event_hour = config.firstEventHour;219var first_event_hour_epoch = parseInt(config.firstEventHourEpoch, 10);220var today_events = config.todayEvents;221var today_all_day_events = config.allDayEvents;222var table_wrapper = JX.$(config.tableID);223var rows = drawRows();224225var all_day_events = [];226for(i=0; i < today_all_day_events.length; i++) {227var all_day_event = today_all_day_events[i];228all_day_events.push(drawAllDayEvent(all_day_event));229}230231var table = JX.$N(232'table',233{className: 'phui-calendar-day-view'},234rows);235236var dragging = false;237var origin = null;238239var offset_top = null;240var new_top = null;241242var click_time = null;243244JX.DOM.listen(245table_wrapper,246'mousedown',247'phui-calendar-day-event',248function(e){249250if (!e.isNormalMouseEvent()) {251return;252}253var data = e.getNodeData('phui-calendar-day-event');254if (!data.record.canEdit) {255return;256}257e.kill();258dragging = e.getNode('phui-calendar-day-event');259JX.DOM.alterClass(dragging, 'phui-drag', true);260261click_time = new Date();262263origin = JX.$V(e);264265var outer = JX.Vector.getPos(table);266var inner = JX.Vector.getPos(dragging);267268offset_top = inner.y - outer.y;269new_top = offset_top;270271dragging.style.top = offset_top + 'px';272});273JX.Stratcom.listen('mousemove', null, function(e){274if (!dragging) {275return;276}277var cursor = JX.$V(e);278279new_top = cursor.y - origin.y + offset_top;280new_top = Math.min(new_top, 1320);281new_top = Math.max(new_top, 0);282new_top = Math.floor(new_top/15) * 15;283284dragging.style.top = new_top + 'px';285});286JX.Stratcom.listen('mouseup', null, function(){287if (!dragging) {288return;289}290291var data = JX.Stratcom.getData(dragging);292var record = data.record;293294if (new_top == offset_top) {295var now = new Date();296if (now.getTime() - click_time.getTime() < 250) {297JX.$U(record.uri).go();298}299300JX.DOM.alterClass(dragging, 'phui-drag', false);301dragging = false;302return;303}304var new_time = first_event_hour_epoch + (new_top * 60);305var id = data.eventID;306var duration = record.eventEndEpoch - record.eventStartEpoch;307record.eventStartEpoch = new_time;308record.eventEndEpoch = new_time + duration;309record.top = new_top + 'px';310311new JX.Workflow(312'/calendar/event/drag/' + id + '/',313{start: new_time})314.start();315316JX.DOM.alterClass(dragging, 'phui-drag', false);317dragging = false;318319clusterAndDrawEvents();320});321322JX.DOM.listen(table_wrapper, 'click', 'phui-calendar-day-event', function(e){323if (e.isNormalClick()) {324e.kill();325}326});327328JX.DOM.listen(table, 'click', 'phui-calendar-day-event-cell', function(e){329if (!e.isNormalClick()) {330return;331}332var data = e.getNodeData('phui-calendar-day-event-cell');333var time = data.time;334335new JX.Workflow(336'/calendar/event/edit/',337{338start_d: year + '-' + month + '-' + day,339start_t: time,340end_d: year + '-' + month + '-' + day,341end_t: time + ' +1 hour'342})343.start();344});345346var hourly_events_wrapper = JX.$N(347'div',348{style: {349position: 'absolute',350left: '69px',351right: 0352}});353354clusterAndDrawEvents();355356var daily_wrapper = JX.$N(357'div',358{style: {position: 'relative'}},359[hourly_events_wrapper, table]);360361JX.DOM.setContent(table_wrapper, [all_day_events, daily_wrapper]);362363});364365366