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