Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
freebsd
GitHub Repository: freebsd/phabricator
Path: blob/master/webroot/rsrc/js/application/calendar/behavior-day-view.js
12242 views
1
/**
2
* @provides javelin-behavior-day-view
3
* @requires phuix-icon-view
4
*/
5
JX.behavior('day-view', function(config) {
6
7
function findTodayClusters() {
8
var events = today_events.sort(function(x, y){
9
return (x.eventStartEpoch - y.eventStartEpoch);
10
});
11
12
var clusters = [];
13
14
for (var i=0; i < events.length; i++) {
15
var today_event = events[i];
16
17
var destination_cluster_index = null;
18
var event_start = today_event.eventStartEpoch - (60);
19
var event_end = today_event.eventEndEpoch + (60);
20
21
for (var j=0; j < clusters.length; j++) {
22
var cluster = clusters[j];
23
24
for(var k=0; k < cluster.length; k++) {
25
var clustered_event = cluster[k];
26
var compare_event_start = clustered_event.eventStartEpoch;
27
var compare_event_end = clustered_event.eventEndEpoch;
28
29
if (event_start < compare_event_end &&
30
event_end > compare_event_start) {
31
destination_cluster_index = j;
32
break;
33
}
34
}
35
36
if (destination_cluster_index !== null) {
37
break;
38
}
39
}
40
41
if (destination_cluster_index !== null) {
42
clusters[destination_cluster_index].push(today_event);
43
destination_cluster_index = null;
44
} else {
45
var next_cluster = [];
46
next_cluster.push(today_event);
47
clusters.push(next_cluster);
48
}
49
}
50
51
return clusters;
52
}
53
54
function updateEventsFromCluster(cluster) {
55
var cluster_size = cluster.length;
56
var n = 0;
57
for(var i=0; i < cluster.length; i++) {
58
var cluster_member = cluster[i];
59
60
var event_id = cluster_member.eventID;
61
var offset = ((n / cluster_size) * 100) + '%';
62
var width = ((1 / cluster_size) * 100) + '%';
63
64
for (var j=0; j < today_events.length; j++) {
65
if (today_events[j].eventID == event_id) {
66
67
today_events[j]['offset'] = offset;
68
today_events[j]['width'] = width;
69
}
70
}
71
n++;
72
}
73
74
return today_events;
75
}
76
77
function drawEvent(e) {
78
var name = e['eventName'];
79
var eventID = e['eventID'];
80
var viewerIsInvited = e['viewerIsInvited'];
81
var offset = e['offset'];
82
var width = e['width'];
83
var top = e['top'];
84
var height = e['height'];
85
var uri = e['uri'];
86
87
var sigil = 'phui-calendar-day-event';
88
var link_class = 'phui-calendar-day-event-link';
89
90
if (viewerIsInvited) {
91
link_class = link_class + ' viewer-invited-day-event';
92
}
93
94
var icon = new JX.PHUIXIconView()
95
.setIcon(e.displayIcon)
96
.setColor(e.displayIconColor)
97
.getNode();
98
99
var content = [icon, ' ', name];
100
101
var name_link = JX.$N(
102
'a',
103
{
104
className : link_class,
105
href: uri
106
},
107
content);
108
109
var class_name = 'phui-calendar-day-event';
110
if (e.canEdit) {
111
class_name = class_name + ' can-drag';
112
}
113
114
var div = JX.$N(
115
'div',
116
{
117
className: class_name,
118
sigil: sigil,
119
meta: {eventID: eventID, record: e, uri: uri},
120
style: {
121
left: offset,
122
width: width,
123
top: top,
124
height: height
125
}
126
},
127
name_link);
128
129
return div;
130
}
131
132
function drawAllDayEvent(e) {
133
var class_name = 'day-view-all-day';
134
135
var icon = new JX.PHUIXIconView()
136
.setIcon(e.displayIcon)
137
.setColor(e.displayIconColor)
138
.getNode();
139
var content = [icon, ' ', e.name];
140
141
var name = JX.$N(
142
'a',
143
{
144
className: class_name,
145
href: e.uri
146
},
147
content);
148
149
var all_day_label = JX.$N(
150
'span',
151
{className: 'phui-calendar-all-day-label'},
152
'All Day');
153
154
var div_all_day = JX.$N(
155
'div',
156
{className: 'phui-calendar-day-event all-day'},
157
[all_day_label, name]);
158
159
return div_all_day;
160
}
161
162
function drawRows() {
163
var rows = [];
164
var early_hours = [8];
165
if (first_event_hour) {
166
early_hours.push(first_event_hour);
167
}
168
var min_early_hour = Math.min(early_hours[0], early_hours[1]);
169
170
171
for(var i=0; i < hours.length; i++) {
172
if (hours[i]['hour'] < min_early_hour) {
173
continue;
174
}
175
var cell_time = JX.$N(
176
'td',
177
{className: 'phui-calendar-day-hour'},
178
hours[i].displayTime);
179
180
var cell_event = JX.$N(
181
'td',
182
{
183
meta: {
184
time: hours[i].displayTime
185
},
186
className: 'phui-calendar-day-events',
187
sigil: 'phui-calendar-day-event-cell'
188
});
189
190
var row = JX.$N(
191
'tr',
192
{},
193
[cell_time, cell_event]);
194
rows.push(row);
195
}
196
return rows;
197
}
198
199
function clusterAndDrawEvents() {
200
var today_clusters = findTodayClusters();
201
for(var i=0; i < today_clusters.length; i++) {
202
today_events = updateEventsFromCluster(today_clusters[i]);
203
}
204
var drawn_hourly_events = [];
205
for (i=0; i < today_events.length; i++) {
206
drawn_hourly_events.push(drawEvent(today_events[i]));
207
}
208
209
JX.DOM.setContent(hourly_events_wrapper, drawn_hourly_events);
210
211
}
212
213
var year = config.year;
214
var month = config.month;
215
var day = config.day;
216
var query = config.query;
217
218
var hours = config.hours;
219
var first_event_hour = config.firstEventHour;
220
var first_event_hour_epoch = parseInt(config.firstEventHourEpoch, 10);
221
var today_events = config.todayEvents;
222
var today_all_day_events = config.allDayEvents;
223
var table_wrapper = JX.$(config.tableID);
224
var rows = drawRows();
225
226
var all_day_events = [];
227
for(i=0; i < today_all_day_events.length; i++) {
228
var all_day_event = today_all_day_events[i];
229
all_day_events.push(drawAllDayEvent(all_day_event));
230
}
231
232
var table = JX.$N(
233
'table',
234
{className: 'phui-calendar-day-view'},
235
rows);
236
237
var dragging = false;
238
var origin = null;
239
240
var offset_top = null;
241
var new_top = null;
242
243
var click_time = null;
244
245
JX.DOM.listen(
246
table_wrapper,
247
'mousedown',
248
'phui-calendar-day-event',
249
function(e){
250
251
if (!e.isNormalMouseEvent()) {
252
return;
253
}
254
var data = e.getNodeData('phui-calendar-day-event');
255
if (!data.record.canEdit) {
256
return;
257
}
258
e.kill();
259
dragging = e.getNode('phui-calendar-day-event');
260
JX.DOM.alterClass(dragging, 'phui-drag', true);
261
262
click_time = new Date();
263
264
origin = JX.$V(e);
265
266
var outer = JX.Vector.getPos(table);
267
var inner = JX.Vector.getPos(dragging);
268
269
offset_top = inner.y - outer.y;
270
new_top = offset_top;
271
272
dragging.style.top = offset_top + 'px';
273
});
274
JX.Stratcom.listen('mousemove', null, function(e){
275
if (!dragging) {
276
return;
277
}
278
var cursor = JX.$V(e);
279
280
new_top = cursor.y - origin.y + offset_top;
281
new_top = Math.min(new_top, 1320);
282
new_top = Math.max(new_top, 0);
283
new_top = Math.floor(new_top/15) * 15;
284
285
dragging.style.top = new_top + 'px';
286
});
287
JX.Stratcom.listen('mouseup', null, function(){
288
if (!dragging) {
289
return;
290
}
291
292
var data = JX.Stratcom.getData(dragging);
293
var record = data.record;
294
295
if (new_top == offset_top) {
296
var now = new Date();
297
if (now.getTime() - click_time.getTime() < 250) {
298
JX.$U(record.uri).go();
299
}
300
301
JX.DOM.alterClass(dragging, 'phui-drag', false);
302
dragging = false;
303
return;
304
}
305
var new_time = first_event_hour_epoch + (new_top * 60);
306
var id = data.eventID;
307
var duration = record.eventEndEpoch - record.eventStartEpoch;
308
record.eventStartEpoch = new_time;
309
record.eventEndEpoch = new_time + duration;
310
record.top = new_top + 'px';
311
312
new JX.Workflow(
313
'/calendar/event/drag/' + id + '/',
314
{start: new_time})
315
.start();
316
317
JX.DOM.alterClass(dragging, 'phui-drag', false);
318
dragging = false;
319
320
clusterAndDrawEvents();
321
});
322
323
JX.DOM.listen(table_wrapper, 'click', 'phui-calendar-day-event', function(e){
324
if (e.isNormalClick()) {
325
e.kill();
326
}
327
});
328
329
JX.DOM.listen(table, 'click', 'phui-calendar-day-event-cell', function(e){
330
if (!e.isNormalClick()) {
331
return;
332
}
333
var data = e.getNodeData('phui-calendar-day-event-cell');
334
var time = data.time;
335
336
new JX.Workflow(
337
'/calendar/event/edit/',
338
{
339
start_d: year + '-' + month + '-' + day,
340
start_t: time,
341
end_d: year + '-' + month + '-' + day,
342
end_t: time + ' +1 hour'
343
})
344
.start();
345
});
346
347
var hourly_events_wrapper = JX.$N(
348
'div',
349
{style: {
350
position: 'absolute',
351
left: '69px',
352
right: 0
353
}});
354
355
clusterAndDrawEvents();
356
357
var daily_wrapper = JX.$N(
358
'div',
359
{style: {position: 'relative'}},
360
[hourly_events_wrapper, table]);
361
362
JX.DOM.setContent(table_wrapper, [all_day_events, daily_wrapper]);
363
364
});
365
366