1 dojo.require('fieldmapper.AutoIDL');
2 dojo.require('fieldmapper.Fieldmapper');
3 dojo.require('fieldmapper.OrgUtils');
4 dojo.require('openils.Event');
6 var myPackageDir = 'open_ils_staff_client'; var IAMXUL = true; var g = {};
7 var FETCH_CLOSED_DATES = 'open-ils.actor:open-ils.actor.org_unit.closed.retrieve.all';
8 var FETCH_CLOSED_DATE = 'open-ils.actor:open-ils.actor.org_unit.closed.retrieve';
9 var CREATE_CLOSED_DATE = 'open-ils.actor:open-ils.actor.org_unit.closed.create';
10 var DELETE_CLOSED_DATE = 'open-ils.actor:open-ils.actor.org_unit.closed.delete';
14 var cdAllMultiDayTemplate;
27 'actor.org_unit.closed_date.delete',
28 'actor.org_unit.closed_date.create',
31 function cdEditorInit() {
33 /* set the various template rows */
34 cdTbody = $('cd_tbody');
35 cdRowTemplate = cdTbody.removeChild($('cd_row'));
36 cdAllDayTemplate = cdTbody.removeChild($('cd_allday_row'));
37 cdAllMultiDayTemplate = cdTbody.removeChild($('cd_allmultiday_row'));
42 $('cd_user').appendChild(text(USER.usrname()));
46 fetchHighestPermOrgs( SESSION, USER.id(), myPerms );
54 function cdCurrentOrg() {
55 var selector = $('cd_orgs');
56 return getSelectorVal(selector);
59 function cdBuildOrgs() {
60 var org = findOrgUnit(PERMS['actor.org_unit.closed_date.create']);
61 if( !org || org == -1 ) org = findOrgUnit(USER.ws_ou());
62 var type = findOrgType(org.ou_type()) ;
64 var selector = $('cd_orgs');
65 buildOrgSel(selector, org, type.depth());
66 if(!type.can_have_users()) selector.options[0].disabled = true;
69 selector.onchange = function() { cdDrawRange(); };
73 if( cdBaseOrg.children() && cdBaseOrg.children().length > 0 )
74 unHideMe($('cd_apply_all_div'));
76 var gotoOrg = USER.ws_ou();
77 if( ! setSelector( selector, gotoOrg ) ) {
78 gotoOrg = USER.home_ou();
79 setSelector( selector, gotoOrg );
82 var neworg = findOrgUnit(PERMS['actor.org_unit.closed_date.create']);
83 if(!neworg || neworg == -1 || !orgIsMine(neworg, findOrgUnit(cdCurrentOrg()))) {
84 $('cd_new_allday').disabled = true;
85 $('cd_new_multiday').disabled = true;
86 $('cd_new').disabled = true;
92 function cdInitCals() {
95 inputField : "cd_edit_allday_start_date",
96 ifFormat : "%Y-%m-%d",
97 button : "cd_edit_allday_start_date_img",
103 inputField : "cd_edit_allmultiday_start_date",
104 ifFormat : "%Y-%m-%d",
105 button : "cd_edit_allmultiday_start_date_img",
111 inputField : "cd_edit_allmultiday_end_date",
112 ifFormat : "%Y-%m-%d",
113 button : "cd_edit_allmultiday_end_date_img",
119 inputField : "cd_edit_end_date",
120 ifFormat : "%Y-%m-%d",
121 button : "cd_edit_end_date_img",
127 inputField : "cd_edit_start_date",
128 ifFormat : "%Y-%m-%d",
129 button : "cd_edit_start_date_img",
137 function cdDrawRange( start, end, alertSuccess ) {
138 start = (start) ? start : new Date().getYear() + 1899 + '-01-01'; /* include last year's closed info for comparison */
139 end = (end) ? end : '3001-01-01';
141 if(alertSuccess) alertId('cd_update_success');
143 selectedStart = start;
146 var req = new Request(
147 FETCH_CLOSED_DATES, SESSION,
149 orgid : cdCurrentOrg(),
156 req.callback( cdBuild );
160 /* adds one row in the display table per date */
161 function cdBuild(r) {
162 var dates = r.getResultObject();
163 removeChildren(cdTbody);
164 for( var d = 0; d < dates.length; d++ ) {
168 cdGetTZ(date.org_unit(), function () {
169 var row = cdBuildRow( date );
170 cdTbody.appendChild(row);
176 function cdDateToHours(date, org) {
177 var date_obj = moment(date).tz(orgTZ[org]);
178 var hrs = date_obj.hours();
179 var mins = date_obj.minutes();
181 if (hrs < 10) hrs = '0' + hrs;
182 if (mins < 10) mins = '0' + mins;
183 return hrs + ':' + mins;
186 function cdDateToDate(date, org) {
187 var date_obj = moment(date).tz(orgTZ[org]);
188 return date_obj.format('YYYY-MM-DD');
191 function cdGetTZ(org, callback) {
193 if (callback) callback();
197 fieldmapper.standardRequest(
199 'open-ils.actor.ou_setting.ancestor_default.batch'],
201 params: [org, ['lib.timezone'], SESSION],
202 oncomplete: function(r) {
203 var data = r.recv().content();
204 if(e = openils.Event.parse(data))
206 orgTZ[org] = data['lib.timezone'].value || OpenSRF.tz;
207 if (callback) callback();
214 /* fleshes a single date */
215 function cdBuildRow( date ) {
217 cdDateCache[date.id()] = date;
219 var sh = cdDateToHours(date.close_start(), date.org_unit());
220 var sd = cdDateToDate(date.close_start(), date.org_unit());
221 var eh = cdDateToHours(date.close_end(), date.org_unit());
222 var ed = cdDateToDate(date.close_end(), date.org_unit());
227 if( isTrue(date.full_day()) ) {
229 if( !isTrue(date.multi_day()) ) {
230 row = cdAllDayTemplate.cloneNode(true);
231 $n(row, 'start_date').appendChild(text(sd));
234 row = cdAllMultiDayTemplate.cloneNode(true);
235 $n(row, 'start_date').appendChild(text(sd));
236 $n(row, 'end_date').appendChild(text(ed));
241 row = cdRowTemplate.cloneNode(true);
242 cdEditFleshRow(row, date);
245 $n(row,'delete').onclick = function() { cdDelete(row, date); };
246 $n(row, 'note').appendChild(text(date.reason()));
248 /* if we don't have delete perms for this location, disable the button */
249 var delorg = findOrgUnit(PERMS['actor.org_unit.closed_date.delete']);
250 if(!orgIsMine(delorg, findOrgUnit(cdCurrentOrg()))) $n(row,'delete').disabled = true;
255 function cdEditFleshRow(row, date) {
256 $n(row, 'start_time').appendChild(text(cdDateToHours(date.close_start(), date.org_unit())));
257 $n(row, 'start_date').appendChild(text(cdDateToDate(date.close_start(), date.org_unit())));
258 $n(row, 'end_time').appendChild(text(cdDateToHours(date.close_end(), date.org_unit())));
259 $n(row, 'end_date').appendChild(text(cdDateToDate(date.close_end(), date.org_unit())));
263 function cdShowEditRow(id) {
266 unHideMe($('cd_edit_submit'));
267 unHideMe($('cd_edit_note_row'));
270 function cdCancelEdit() {
271 hideMe($('cd_edit_row'));
272 hideMe($('cd_edit_allday_row'));
273 hideMe($('cd_edit_allmultiday_row'));
274 hideMe($('cd_edit_submit'));
275 hideMe($('cd_edit_note_row'));
281 function cdDelete(row, date) {
282 if(!confirmId('cd_confirm_delete')) return;
283 var req = new Request(DELETE_CLOSED_DATE, SESSION, date.id() );
286 var res = r.getResultObject();
287 if( checkILSEvent(res) ) alertILSEvent(res);
288 cdDrawRange(selectedStart, selectedEnd, true);
295 function cdVerifyDate(d) {
296 return d && d.match(/\d{4}-\d{2}-\d{2}/);
299 function cdVerifyTime(t) {
300 return t && t.match(/\d{2}:\d{2}:\d{2}/);
303 function cdDateStrToDate( str, org, callback ) {
304 if (!org) org = cdCurrentOrg();
306 if (callback) { // async mode
307 if (!orgTZ[org]) { // fetch then call again
308 return cdGetTZ(org, function () {
309 cdDateStrToDate( str, org, callback );
312 var d = cdDateStrToDate( str, org );
319 date = moment(new Date()).tz(orgTZ[org]);
321 date = moment(new Date());
324 var data = str.replace(/\s+/, 'T').split(/T/);
329 if(!cdVerifyDate(year)) return alertId('cd_invalid_date');
330 if(!cdVerifyTime(time)) return alertId('cd_invalid_time');
332 var yeardata = year.split(/-/);
333 var timedata = time.split(/:/);
335 /* seed the date with day = 1, which is a valid day for any month.
336 this prevents automatic date correction by the date code for days that
337 fall outside of the current or target month */
340 date.year(new Number(yeardata[0]));
341 date.month(new Number(yeardata[1]) - 1);
342 date.date(new Number(yeardata[2]));
344 date.hour(new Number(timedata[0]));
345 date.minute(new Number(timedata[1]));
346 date.second(new Number(timedata[2]));
358 if( ! $('cd_edit_allday_row').className.match(/hide_me/) ) {
360 var date = $('cd_edit_allday_start_date').value;
362 start = cdDateStrToDate(date + 'T00:00:00');
363 end = cdDateStrToDate(date + 'T23:59:59');
366 } else if( ! $('cd_edit_allmultiday_row').className.match(/hide_me/) ) {
368 var sdate = $('cd_edit_allmultiday_start_date').value;
369 var edate = $('cd_edit_allmultiday_end_date').value;
370 start = cdDateStrToDate(sdate + 'T00:00:00');
371 end = cdDateStrToDate(edate + 'T23:59:59');
377 var sdate = $('cd_edit_start_date').value;
378 var edate = $('cd_edit_end_date').value;
382 if($('cd_edit_start_time_allday').checked) {
385 stime = $('cd_edit_start_time').value;
390 if($('cd_edit_end_time_allday').checked) {
393 etime = $('cd_edit_end_time').value;
397 start = cdDateStrToDate(sdate + 'T' + stime);
398 end = cdDateStrToDate(edate + 'T' + etime);
401 if (end.unix() < start.unix()) {
402 alertId('cd_invalid_date_span');
406 cdCreate(start, end, $('cd_edit_note').value, full_day, multi_day);
409 function cdCreate(start, end, note, full_day, multi_day) {
411 if( $('cd_apply_all').checked ) {
412 var list = cdGetOrgList();
413 for( var o = 0; o < list.length; o++ ) {
414 var id = list[o].id();
415 cdCreateOne( id, start, end, note, full_day, multi_day, (id == cdCurrentOrg()) );
420 cdCreateOne( cdCurrentOrg(), start, end, note, full_day, multi_day, true );
424 function cdGetOrgList(org) {
425 if(!org) org = cdBaseOrg;
428 var type = findOrgType(org.ou_type()) ;
429 if( type.can_have_users() ) list.push(org);
431 if( org.children() ) {
432 for( var i = 0; i < org.children().length; i++ ) {
433 var child = org.children()[i];
435 var l = cdGetOrgList(child);
436 for( var j = 0; j < l.length; j++ )
445 function cdCreateOne( org, start, end, note, full_day, multi_day, refresh ) {
446 var date = new aoucd();
448 // force TZ normalization
449 cdDateStrToDate(start.format('YYYY-MM-DD HH:mm:ss'), org, function (s) {
451 cdDateStrToDate(end.format('YYYY-MM-DD HH:mm:ss'), org, function (e) {
454 date.close_start(start.toISOString());
455 date.close_end(end.toISOString());
458 date.full_day(full_day);
459 date.multi_day(multi_day);
461 var req = new Request(CREATE_CLOSED_DATE, SESSION, date);
464 var res = r.getResultObject();
465 if( checkILSEvent(res) ) alertILSEvent(res);
466 if(refresh) cdDrawRange(selectedStart, selectedEnd, true);