]> git.evergreen-ils.org Git - Evergreen.git/blob - Open-ILS/xul/staff_client/server/admin/closed_dates.js
new and improved classic. Pull lists and hold lists should probably include filters...
[Evergreen.git] / Open-ILS / xul / staff_client / server / admin / closed_dates.js
1 var FETCH_CLOSED_DATES  = 'open-ils.actor:open-ils.actor.org_unit.closed.retrieve.all';
2 var FETCH_CLOSED_DATE   = 'open-ils.actor:open-ils.actor.org_unit.closed.retrieve';
3 var CREATE_CLOSED_DATE  = 'open-ils.actor:open-ils.actor.org_unit.closed.create';
4 var DELETE_CLOSED_DATE  = 'open-ils.actor:open-ils.actor.org_unit.closed.delete';
5
6 var cdRowTemplate;
7 var cdAllDayTemplate;
8 var cdAllMultiDayTemplate;
9
10 var cdTbody;
11 var cdDateCache = {};
12
13 var selectedStart;
14 var selectedEnd;
15
16 var cdBaseOrg;
17
18
19 var myPerms = [ 
20         'actor.org_unit.closed_date.delete',
21         'actor.org_unit.closed_date.create',
22         ];
23
24 function cdEditorInit() {
25
26         /* set the various template rows */
27         cdTbody = $('cd_tbody');
28         cdRowTemplate                                   = cdTbody.removeChild($('cd_row'));
29         cdAllDayTemplate                                = cdTbody.removeChild($('cd_allday_row'));
30         cdAllMultiDayTemplate           = cdTbody.removeChild($('cd_allmultiday_row'));
31
32         cdInitCals();
33
34         fetchUser();
35         $('cd_user').appendChild(text(USER.usrname()));
36
37         setTimeout( 
38                 function() { 
39                         fetchHighestPermOrgs( SESSION, USER.id(), myPerms );
40                         cdBuildOrgs();
41                         cdDrawRange();
42                 }, 
43                 20 
44         );
45 }
46
47 function cdCurrentOrg() {
48         var selector = $('cd_orgs');
49         return getSelectorVal(selector);
50 }
51
52 function cdBuildOrgs() {
53         var org = findOrgUnit(PERMS['actor.org_unit.closed_date.create']);
54         if( !org || org == -1 ) org = findOrgUnit(USER.ws_ou());
55         var type = findOrgType(org.ou_type()) ;
56
57         var selector = $('cd_orgs');
58         buildOrgSel(selector, org, type.depth());
59         if(!type.can_have_users()) selector.options[0].disabled = true;
60
61
62         selector.onchange = function() { cdDrawRange(); };
63
64         cdBaseOrg = org;
65
66         if( cdBaseOrg.children() && cdBaseOrg.children().length > 0 )
67                 unHideMe($('cd_apply_all_div'));
68
69         var gotoOrg = USER.ws_ou();
70         if( ! setSelector( selector, gotoOrg ) ) {
71                 gotoOrg = USER.home_ou();
72                 setSelector( selector, gotoOrg );
73         }
74
75         var neworg = findOrgUnit(PERMS['actor.org_unit.closed_date.create']);
76         if(!neworg || neworg == -1 || !orgIsMine(neworg, findOrgUnit(cdCurrentOrg()))) {
77                 $('cd_new_allday').disabled = true;
78                 $('cd_new_multiday').disabled = true;
79                 $('cd_new').disabled = true;
80         }
81
82         return gotoOrg;
83 }
84
85 function cdInitCals() {
86
87         Calendar.setup({
88                 inputField  : "cd_edit_allday_start_date",
89                 ifFormat    : "%Y-%m-%d",
90                 button      : "cd_edit_allday_start_date_img",
91                 align       : "Tl",
92                 singleClick : true
93         });
94
95         Calendar.setup({
96                 inputField  : "cd_edit_allmultiday_start_date",
97                 ifFormat    : "%Y-%m-%d",
98                 button      : "cd_edit_allmultiday_start_date_img",
99                 align       : "Tl",
100                 singleClick : true
101         });
102
103         Calendar.setup({
104                 inputField  : "cd_edit_allmultiday_end_date",
105                 ifFormat    : "%Y-%m-%d",
106                 button      : "cd_edit_allmultiday_end_date_img",
107                 align       : "Tl",
108                 singleClick : true
109         });
110
111         Calendar.setup({
112                 inputField  : "cd_edit_end_date",
113                 ifFormat    : "%Y-%m-%d",
114                 button      : "cd_edit_end_date_img",
115                 align       : "Tl",
116                 singleClick : true
117         });
118
119         Calendar.setup({
120                 inputField  : "cd_edit_start_date",
121                 ifFormat    : "%Y-%m-%d",
122                 button      : "cd_edit_start_date_img",
123                 align       : "Tl",
124                 singleClick : true
125         });
126
127
128 }
129
130 function cdDrawRange( start, end ) {
131         start = (start) ? start : new Date().getYear() + 1900 + '-01-01';
132         end = (end) ? end : '3001-01-01';
133
134         selectedStart = start;
135         selectedEnd = end;
136
137         var req = new Request(
138                 FETCH_CLOSED_DATES, SESSION, 
139                 {
140                         orgid                   : cdCurrentOrg(),
141                         start_date      : start,
142                         end_date                : end,
143                         idlist          : 0
144                 }
145         );
146
147         req.callback( cdBuild );
148         req.send();  
149 }
150
151 /* adds one row in the display table per date */
152 function cdBuild(r) {
153         var dates = r.getResultObject();
154         removeChildren(cdTbody);
155         for( var d = 0; d < dates.length; d++ ) {
156                 var date = dates[d];
157                 var row = cdBuildRow( date );
158                 cdTbody.appendChild(row);
159         }
160 }
161
162 function cdDateToHours(date) {
163         var d = new Date.W3CDTF();
164         d.setW3CDTF(date.replace(/\.\d+/,'') + ":00");
165
166         var h = d.getHours() +'';
167         var m = d.getMinutes() +'';
168         var s = d.getSeconds() +'';
169
170         if(h.length == 1) h = '0'+h;
171         if(m.length == 1) m = '0'+m;
172         if(s.length == 1) s = '0'+s;
173
174         return  h + ':' + m + ':' + s;
175 }
176
177 function cdDateToDate(date) {
178         var d = new Date.W3CDTF();
179         d.setW3CDTF(date.replace(/\.\d+/,'') + ":00");
180
181         var y = d.getFullYear()+'';
182         var m = (d.getMonth() + 1)+'';
183         var d = d.getDate()+'';
184
185         if(m.length == 1) m = '0'+m;
186         if(d.length == 1) d = '0'+d;
187
188         return  y + '-' + m + '-' + d;
189 }
190
191
192 /* fleshes a single date */
193 function cdBuildRow( date ) {
194
195         cdDateCache[date.id()] = date;
196
197         var sh = cdDateToHours(date.close_start());
198         var sd = cdDateToDate(date.close_start());
199         var eh = cdDateToHours(date.close_end());
200         var ed = cdDateToDate(date.close_end());
201
202         var row;
203         var flesh = false;
204
205         if( sh == '00:00:00' && eh == '23:59:59' ) {
206
207                 if( sd == ed ) {
208                         row = cdAllDayTemplate.cloneNode(true);
209                         $n(row, 'start_date').appendChild(text(sd));
210
211                 } else {
212                         row = cdAllMultiDayTemplate.cloneNode(true);
213                         $n(row, 'start_date').appendChild(text(sd));
214                         $n(row, 'end_date').appendChild(text(ed));
215                 }
216
217         } else {
218
219                 row = cdRowTemplate.cloneNode(true);    
220                 cdEditFleshRow(row, date);
221         }
222
223         $n(row,'delete').onclick = function() { cdDelete(row, date); };
224         $n(row, 'note').appendChild(text(date.reason()));
225
226         /* if we don't have delete perms for this location, disable the button */
227         var delorg = findOrgUnit(PERMS['actor.org_unit.closed_date.delete']);
228         if(!orgIsMine(delorg, findOrgUnit(cdCurrentOrg()))) $n(row,'delete').disabled = true;
229
230         return row;
231 }
232
233 function cdEditFleshRow(row, date) {
234         $n(row, 'start_time').appendChild(text(cdDateToHours(date.close_start())));
235         $n(row, 'start_date').appendChild(text(cdDateToDate(date.close_start())));
236         $n(row, 'end_time').appendChild(text(cdDateToHours(date.close_end())));
237         $n(row, 'end_date').appendChild(text(cdDateToDate(date.close_end())));
238 }
239
240
241 function cdShowEditRow(id) {
242         cdCancelEdit();
243         unHideMe($(id));
244         unHideMe($('cd_edit_submit'));
245         unHideMe($('cd_edit_note_row'));
246 }
247
248 function cdCancelEdit() {
249         hideMe($('cd_edit_row'));
250         hideMe($('cd_edit_allday_row'));
251         hideMe($('cd_edit_allmultiday_row'));
252         hideMe($('cd_edit_submit'));
253         hideMe($('cd_edit_note_row'));
254 }
255
256
257
258
259 function cdDelete(row, date) {
260         if(!confirmId('cd_confirm_delete')) return;
261         var req = new Request(DELETE_CLOSED_DATE, SESSION, date.id() );
262         req.callback(
263                 function(r) {
264                         var res = r.getResultObject();
265                         if( checkILSEvent(res) ) alertILSEvent(res);
266                         cdDrawRange(selectedStart, selectedEnd);
267                 }
268         )
269         req.send();
270 }
271
272
273 /* getW3CDTF */
274
275 function cdVerifyDate(d) {
276         return d && d.match(/\d{4}-\d{2}-\d{2}/);
277 }
278
279 function cdVerifyTime(t) {
280         return t && t.match(/\d{2}:\d{2}:\d{2}/);
281 }
282
283 function cdDateStrToDate( str ) {
284
285         var date = new Date.W3CDTF();
286         var data = str.split(/ /);
287
288         var year = data[0];
289         var time        = data[1];
290
291         if(!cdVerifyDate(year)) return alertId('cd_invalid_date');
292         if(!cdVerifyTime(time)) return alertId('cd_invalid_time');
293
294         var yeardata = year.split(/-/);
295         var timedata = time.split(/:/);
296
297         date.setFullYear(yeardata[0]);
298         date.setMonth(yeardata[1] - 1);
299         date.setDate(yeardata[2]);
300
301         date.setHours(timedata[0]);
302         date.setMinutes(timedata[1]);
303         date.setSeconds(timedata[2]);
304
305         return date;
306 }
307
308 function cdNew() {
309
310         var start;
311         var end;
312
313         if( ! $('cd_edit_allday_row').className.match(/hide_me/) ) {
314
315                 var date = $('cd_edit_allday_start_date').value;
316                 start = cdDateStrToDate(date + ' 00:00:00');
317                 end = cdDateStrToDate(date + ' 23:59:59');
318
319         } else if( ! $('cd_edit_allmultiday_row').className.match(/hide_me/) ) {
320
321                 var sdate = $('cd_edit_allmultiday_start_date').value;
322                 var edate = $('cd_edit_allmultiday_end_date').value;
323                 start = cdDateStrToDate(sdate + ' 00:00:00');
324                 end = cdDateStrToDate(edate + ' 23:59:59');
325
326         } else {
327
328                 var sdate = $('cd_edit_start_date').value;
329                 var edate = $('cd_edit_end_date').value;
330                 var stime;
331                 var etime;
332
333                 if($('cd_edit_start_time_allday').checked) {
334                         stime = '00:00';
335                 } else {
336                         stime = $('cd_edit_start_time').value;
337                 }
338
339                 stime += ':00';
340
341                 if($('cd_edit_end_time_allday').checked) {
342                         etime = '23:59:59';
343                 } else {
344                         etime = $('cd_edit_end_time').value;
345                         etime += ':00';
346                 }
347
348                 start = cdDateStrToDate(sdate + ' ' + stime);
349                 end = cdDateStrToDate(edate + ' ' + etime);
350         }
351
352         cdCreate(start, end, $('cd_edit_note').value);
353 }
354
355 function cdCreate(start, end, note) {
356
357         if( $('cd_apply_all').checked ) {
358                 var list = cdGetOrgList();
359                 for( var o = 0; o < list.length; o++ ) {
360                         var id = list[o].id();
361                         cdCreateOne( id, start, end, note, (id == cdCurrentOrg()) );
362                 }
363
364         } else {
365
366                 cdCreateOne( cdCurrentOrg(), start, end, note, true );
367         }
368 }
369
370 function cdGetOrgList(org) {
371         if(!org) org = cdBaseOrg;
372
373         var list = [];
374         var type = findOrgType(org.ou_type()) ;
375         if( type.can_have_users() ) list.push(org);
376
377         if( org.children() ) {
378                 for( var i = 0; i < org.children().length; i++ ) {
379                         var child = org.children()[i];
380                         if( child ) {
381                                 var l = cdGetOrgList(child);
382                                 for( var j = 0; j < l.length; j++ )
383                                         list.push(l[j]);
384                         }
385                 }
386         }
387
388         return list;
389 }
390
391
392 function cdCreateOne( org, start, end, note, refresh ) {
393         var date = new aoucd();
394
395         date.close_start(start.getW3CDTF());
396         date.close_end(end.getW3CDTF());
397         date.org_unit(org);
398         date.reason(note);
399
400         var req = new Request(CREATE_CLOSED_DATE, SESSION, date);
401         req.callback(
402                 function(r) {
403                         var res = r.getResultObject();
404                         if( checkILSEvent(res) ) alertILSEvent(res);
405                         if(refresh) cdDrawRange(selectedStart, selectedEnd);
406                 }
407         );
408         req.send();
409 }
410
411
412