1 var OILS_TEMPLATE_INTERFACE = 'xul/template_builder.xul';
2 var OILS_LEGACY_TEMPLATE_INTERFACE = 'oils_rpt_builder.xhtml';
5 /* generic folder window class */
6 oilsRptSetSubClass('oilsRptFolderWindow', 'oilsRptObject');
7 function oilsRptFolderWindow(type, folderId) {
9 var node = oilsRptCurrentFolderManager.findNode(type, folderId);
10 this.selector = DOM.oils_rpt_folder_contents_selector;
11 this.folderNode = node;
16 oilsRptFolderWindow.prototype.draw = function() {
18 _debug('drawing folder window for ' + this.folderNode.folder.name() );
21 setSelector(DOM.oils_rpt_output_limit_selector, oilsRptOutputLimit);
22 setSelector(DOM.oils_rpt_output_limit_selector_2, oilsRptOutputLimit2);
24 DOM.oils_rpt_output_limit_selector.onchange = function() {
25 oilsRptOutputLimit = getSelectorVal(DOM.oils_rpt_output_limit_selector);
29 DOM.oils_rpt_output_limit_selector_2.onchange = function() {
30 oilsRptOutputLimit2 = getSelectorVal(DOM.oils_rpt_output_limit_selector_2);
34 var mine = ( this.folderNode.folder.owner().id() == USER.id() );
36 _debug('drawing folder window with type '+this.type);
37 if(mine) _debug('folder is mine...');
39 if( mine && this.type == 'template')
40 unHideMe(DOM.oils_rpt_folder_window_contents_new_template.parentNode);
41 else hideMe(DOM.oils_rpt_folder_window_contents_new_template.parentNode);
43 unHideMe(DOM.oils_rpt_folder_window_contents_div);
44 hideMe(DOM.oils_rpt_folder_manager_div);
45 hideMe(DOM.oils_rpt_top_folder);
47 DOM.oils_rpt_folder_window_manage_tab.onclick = function() {
48 unHideMe(DOM.oils_rpt_folder_window_contents_div);
49 hideMe(DOM.oils_rpt_folder_manager_div);
51 DOM.oils_rpt_folder_window_edit_tab.onclick = function() {
52 hideMe(DOM.oils_rpt_folder_window_contents_div);
53 unHideMe(DOM.oils_rpt_folder_manager_div);
56 this.setFolderEditActions();
58 hideMe(DOM.oils_rpt_template_folder_new_report);
59 unHideMe(DOM.oils_rpt_folder_table_right_td);
60 hideMe(DOM.oils_rpt_folder_table_alt_td);
61 this.drawFolderDetails();
63 DOM.oils_rpt_folder_content_action_go.onclick =
64 function() {obj.doFolderAction()}
66 this.fetchFolderData();
68 var sel = DOM.oils_rpt_folder_contents_action_selector;
70 for( var i = 0; i < sel.options.length; i++ ) {
71 var opt = sel.options[i];
73 if( !mine && opt.getAttribute('value').match(/move/) ) {
78 if( opt.getAttribute('type') == this.type ) {
79 if(x && !opt.disabled) {
87 this.drawEditActions();
89 var porg = PERMS.SHARE_REPORT_FOLDER;
91 DOM.oils_rpt_folder_manager_share_opt.disabled = true;
94 oilsRptFolderWindow.prototype.drawEditActions = function() {
96 DOM.oils_rpt_folder_window_contents_new_template.onclick = function() {
97 var s = location.search+'';
98 s = s.replace(/\&folder=\d+/g,'');
99 s = s.replace(/\&ct=\d+/g,'');
100 goTo( OILS_TEMPLATE_INTERFACE+s+'&folder='+obj.folderNode.folder.id());
104 if( this.folderNode.folder.owner().id() != USER.id() )
105 hideMe(DOM.oils_rpt_folder_manager_tab_table);
107 unHideMe(DOM.oils_rpt_folder_manager_tab_table);
109 if( isTrue(this.folderNode.folder.shared())) {
110 DOM.oils_rpt_folder_manager_share_opt.disabled = true;
111 DOM.oils_rpt_folder_manager_unshare_opt.disabled = false;
113 DOM.oils_rpt_folder_manager_share_opt.disabled = false;
114 DOM.oils_rpt_folder_manager_unshare_opt.disabled = true;
117 this.hideFolderActions();
120 DOM.oils_rpt_folder_manager_actions_submit.onclick = function() {
121 var act = getSelectorVal(DOM.oils_rpt_folder_manager_actions);
122 _debug("doing folder action: " + act);
123 obj.hideFolderActions();
126 unHideMe(DOM.oils_rpt_folder_manager_change_name_div);
128 case 'create_sub_folder':
129 var porg = PERMS.SHARE_REPORT_FOLDER;
131 DOM.oils_rpt_folder_manager_sub_shared.disabled = true;
132 removeChildren(DOM.oils_rpt_folder_manager_sub_lib_picker);
133 unHideMe(DOM.oils_rpt_folder_manager_create_sub);
134 obj.myOrgSelector = new oilsRptMyOrgsWidget(
135 DOM.oils_rpt_folder_manager_sub_lib_picker, USER.ws_ou(), porg)
136 obj.myOrgSelector.draw();
139 obj.doFolderDelete();
153 oilsRptFolderWindow.prototype.shareFolder = function() {
154 var folder = this.folderNode.folder;
155 if(isTrue(folder.shared()))
156 return alertId('oils_rpt_folder_already_shared');
157 unHideMe(DOM.oils_rpt_folder_manager_share_div);
160 var orgsel = new oilsRptMyOrgsWidget(
161 DOM.oils_rpt_folder_manager_share_lib_picker,
162 USER.ws_ou(), PERMS.SHARE_REPORT_FOLDER);
165 var type = this.type;
166 DOM.oils_rpt_folder_manager_share_submit.onclick = function() {
168 folder.share_with(orgsel.getValue());
169 oilsRptUpdateFolder( folder, type,
172 oilsRptAlertSuccess();
173 oilsRptCurrentFolderManager.draw();
180 oilsRptFolderWindow.prototype.unShareFolder = function() {
181 var folder = this.folderNode.folder;
182 if(!isTrue(folder.shared()))
183 return alertId('oils_rpt_folder_already_unshared');
184 if(!confirmId('oils_rpt_folder_unshare_confirm')) return;
186 var type = this.type;
187 oilsRptUpdateFolder( folder, type,
190 oilsRptAlertSuccess();
191 oilsRptCurrentFolderManager.draw();
198 oilsRptFolderWindow.prototype.hideFolderActions = function() {
199 hideMe(DOM.oils_rpt_folder_manager_change_name_div);
200 hideMe(DOM.oils_rpt_folder_manager_create_sub);
201 hideMe(DOM.oils_rpt_folder_manager_share_div);
205 oilsRptFolderWindow.prototype.doFolderAction = function() {
206 var objs = (this.fmTable) ? this.fmTable.getSelected() : [];
208 if( this.type == 'output' && this.fmTable2 )
209 objs = objs.concat( this.fmTable2.getSelected() );
211 if( objs.length == 0 )
212 return alert('Please select an item from the list');
213 var action = getSelectorVal(DOM.oils_rpt_folder_contents_action_selector);
216 var successCallback = function(errid) {
217 if(errid) alertId(errid)
218 else oilsRptAlertSuccess();
225 case 'create_report' :
226 hideMe(DOM.oils_rpt_folder_table_right_td);
227 unHideMe(DOM.oils_rpt_folder_table_alt_td);
228 unHideMe(DOM.oils_rpt_editor_div);
229 new oilsRptReportEditor(new oilsReport(objs[0]), this);
231 case 'delete_report' :
232 if(!confirmId('oils_rpt_verify_report_delete')) return;
233 this.deleteReports(objs, 0, successCallback);
236 case 'delete_template' :
237 if(!confirmId('oils_rpt_verify_template_delete')) return;
238 this.deleteTemplates(objs, 0, successCallback);
242 this.showOutput(objs[0]);
245 case 'delete_output':
246 if(!confirmId('oils_rpt_folder_contents_confirm_delete')) return;
247 this.deleteOutputs(objs,0, successCallback);
250 case 'move_template':
251 this.changeBatchFolder(objs, 'template', successCallback);
255 this.changeBatchFolder(objs, 'report', successCallback);
259 this.changeBatchFolder(objs, 'output', successCallback);
262 case 'clone_template':
263 this.cloneTemplate(objs[0]);
267 oilsRptFolderWindow.prototype.changeBatchFolder = function(objs, type, callback) {
268 hideMe(DOM.oils_rpt_folder_window_contents_table);
269 unHideMe(DOM.oils_rpt_move_folder_div)
271 this.drawFolderOptions(type,
273 obj.changeFolderList(objs, type, folderid, 0, callback);
274 hideMe(DOM.oils_rpt_move_folder_div)
275 unHideMe(DOM.oils_rpt_folder_window_contents_table);
280 oilsRptFolderWindow.prototype.cloneTemplate = function(template) {
281 hideMe(DOM.oils_rpt_folder_window_contents_table);
282 unHideMe(DOM.oils_rpt_move_folder_div)
284 this.drawFolderOptions('template',
286 var s = location.search+'';
287 s = s.replace(/\&folder=\d+/g,'');
288 s = s.replace(/\&ct=\d+/g,'');
289 version = JSON2js(template.data()).version;
290 if(version && version >= 2) {
291 _debug('entering new template building interface with template version ' + version);
292 goTo(OILS_TEMPLATE_INTERFACE+s+'&folder='+folderid+'&ct='+template.id());
294 goTo(OILS_LEGACY_TEMPLATE_INTERFACE+s+'&folder='+folderid+'&ct='+template.id());
301 oilsRptFolderWindow.prototype.changeFolderList = function(list, type, folderid, idx, callback, errid) {
302 if( idx >= list.length ) return callback(errid);
303 var item = list[idx];
305 var rcback = function(){obj.changeFolderList(list,type,folderid,++idx,callback,errid)};
307 item.folder(folderid);
311 oilsRptUpdateTemplate(item,rcback);
314 oilsRptUpdateReport(item,rcback);
317 oilsRptUpdateSchedule(item,rcback);
322 oilsRptFolderWindow.prototype.drawFolderOptions = function(type, callback) {
323 //var oilsRptChangeFolderTree;
327 DOM.oils_rpt_move_folder_picker,
331 appendClear(DOM.oils_rpt_move_folder_selected, node.folder.name());
332 selectedFolder = node.folder.id();
336 DOM.oils_rpt_change_folder_submit.onclick = function() {
337 if(selectedFolder) callback(selectedFolder);
340 DOM.oils_rpt_change_folder_cancel.onclick = function() {
341 hideMe(DOM.oils_rpt_move_folder_div)
342 unHideMe(DOM.oils_rpt_folder_window_contents_table);
347 oilsRptFolderWindow.prototype.deleteOutputs = function(list, idx, callback, errid) {
348 if( idx >= list.length ) return callback(errid);
349 var output = list[idx];
351 if( output.runner().id() != USER.id() ) {
352 this.deleteOutputs(list, ++idx,
353 callback, 'oils_rpt_folder_contents_no_delete');
356 _debug('deleting output ' + output.id());
357 var req = new Request(OILS_RPT_DELETE_SCHEDULE,SESSION,output.id());
359 req.callback(function(){obj.deleteOutputs(list, ++idx, callback, errid);});
364 oilsRptFolderWindow.prototype.showOutput = function(sched) {
365 oilsRptFetchReport(sched.report().id(),
367 var url = oilsRptBuildOutputLink(r.template(), r.id(), sched.id());
368 _debug("launching report output view at URL: " + url);
370 xulG.new_tab('/xul/server/util/rbrowser.xul?url=' + url, /* this comes from urls.XUL_REMOTE_BROWSER */
371 {tab_name:'Report Output: ' + r.name(), browser:true},
372 {no_xulG:false, show_nav_buttons:true, show_print_button:true});
375 var win = window.open(url,r.name(), 'resizable,width=800,height=600,scrollbars=1');
382 oilsRptFolderWindow.prototype.deleteReports = function(list, idx, callback, errid) {
383 if( idx >= list.length ) return callback(errid);
384 var report = list[idx];
387 if( report.owner().id() != USER.id() ) {
388 this.deleteReports(list, ++idx,
389 callback, 'oils_rpt_folder_contents_no_delete');
393 // var req0 = new Request(OILS_RPT_REPORT_HAS_OUTS, SESSION, report.id());
396 // var r0es = r0.getResultObject();
397 // if( r0es != '0' ) {
398 // obj.deleteReports(list, ++idx,
399 // callback, 'oils_rpt_folder_contents_report_no_delete');
401 _debug('deleting report ' + report.id());
402 var req = new Request(OILS_RPT_DELETE_REPORT, SESSION, report.id());
403 req.callback(function(r) {
404 var res = r.getResultObject();
405 if( res == 0 ) return oilsRptAlertFailure();
406 obj.deleteReports(list, ++idx, callback, errid)
417 oilsRptFolderWindow.prototype.deleteTemplates = function(list, idx, callback, errid) {
418 if( idx >= list.length ) return callback(errid);
419 var tmpl = list[idx];
422 if( tmpl.owner().id() != USER.id() ) {
423 this.deleteTemplates(list, ++idx,
424 callback, 'oils_rpt_folder_contents_no_delete');
429 // var req0 = new Request( OILS_RPT_TEMPLATE_HAS_RPTS, SESSION, tmpl.id() );
432 // var resp = r0.getResultObject();
434 // if( resp != '0' ) {
435 // obj.deleteTemplates(list, ++idx,
436 // callback, 'oils_rpt_folder_contents_template_no_delete');
439 _debug('deleting template ' + tmpl.id());
440 var req = new Request(OILS_RPT_DELETE_TEMPLATE, SESSION, tmpl.id());
441 req.callback(function(r) {
442 var res = r.getResultObject();
443 if( res == 0 ) return oilsRptAlertFailure();
444 obj.deleteTemplates(list, ++idx, callback, errid)
456 oilsRptFolderWindow.prototype.drawFolderDetails = function() {
457 appendClear(DOM.oils_rpt_folder_creator_label,
458 text(this.folderNode.folder.owner().usrname()));
459 appendClear(DOM.oils_rpt_folder_name_label,
460 text(this.folderNode.folder.name()));
464 oilsRptFolderWindow.prototype.fetchFolderData = function(callback) {
466 hideMe(DOM.oils_rpt_content_count_row_2);
467 hideMe(DOM.oils_rpt_content_row_2);
469 removeChildren(this.selector);
470 var req = new Request(OILS_RPT_FETCH_FOLDER_DATA,
471 SESSION, this.type, this.folderNode.folder.id(), oilsRptOutputLimit);
473 hideMe(DOM.oils_rpt_pending_output);
475 if(this.type == 'output') {
476 unHideMe(DOM.oils_rpt_pending_output);
477 /* first fetch the non-complete schedules */
478 req = new Request(OILS_RPT_FETCH_OUTPUT,
479 SESSION, this.folderNode.folder.id(), oilsRptOutputLimit, 0);
483 removeChildren(obj.selector);
486 var res = r.getResultObject();
488 if( res.length == 0 ) {
489 //hideMe(DOM.oils_rpt_content_count_row); /* this also hides the new-template link.. fix me */
490 hideMe(DOM.oils_rpt_content_row);
491 unHideMe(DOM.oils_rpt_content_row_empty);
493 unHideMe(DOM.oils_rpt_content_count_row);
494 unHideMe(DOM.oils_rpt_content_row);
495 hideMe(DOM.oils_rpt_content_row_empty);
498 if( obj.type == 'output' ) {
499 obj.fleshSchedules(res, 0, obj.selector);
503 obj.fmTable = drawFMObjectTable(
508 selectColName : 'Select',
509 selectAllName : 'All',
510 selectNoneName : 'None'
518 if( this.type != 'output' ) return;
521 unHideMe(DOM.oils_rpt_content_count_row_2);
522 unHideMe(DOM.oils_rpt_content_row_2);
525 /* now fetch the completed schedules */
526 req = new Request(OILS_RPT_FETCH_OUTPUT,
527 SESSION, this.folderNode.folder.id(), oilsRptOutputLimit2, 1);
529 _debug("TRYING: fleshing finished scheds with div: " + DOM.oils_rpt_folder_contents_selector_2);
530 removeChildren(DOM.oils_rpt_folder_contents_selector_2);
533 var res = r.getResultObject();
535 if( res.length == 0 ) {
536 hideMe(DOM.oils_rpt_content_count_row_2);
537 hideMe(DOM.oils_rpt_content_row_2);
539 unHideMe(DOM.oils_rpt_content_count_row_2);
540 unHideMe(DOM.oils_rpt_content_row_2);
543 _debug("fleshing finished scheds with div: " + DOM.oils_rpt_folder_contents_selector_2);
544 obj.fleshSchedules(res, 0, DOM.oils_rpt_folder_contents_selector_2, true);
551 oilsRptFolderWindow.prototype.fleshSchedules = function(list, idx, selector, isSecond) {
553 if( idx >= list.length ) return;
555 var sched = list[idx];
558 oilsRptFetchUser(sched.runner(),
562 oilsRptFetchTemplate(sched.report().template(),
565 sched.report().template(template);
567 _debug("drawing schedule with output: "+selector);
568 var t = drawFMObjectTable(
573 selectColName : 'Select',
574 selectAllName : 'All',
575 selectNoneName : 'None'
579 if( isSecond ) obj.fmTable2 = t;
580 else obj.fmTable = t;
583 //obj.fmTable.add(sched);
584 if( isSecond ) obj.fmTable2.add(sched);
585 else obj.fmTable.add(sched);
588 obj.fleshSchedules(list, ++idx, selector, isSecond);
596 oilsRptFolderWindow.prototype.setSelected = function(folderNode) {
597 this.selectedFolder = folderNode;
600 oilsRptFolderWindow.prototype.setFolderEditActions = function() {
601 var folder = this.folderNode.folder;
604 DOM.oils_rpt_folder_manager_name_input.value = folder.name();
605 DOM.oils_rpt_folder_manager_change_name_submit.onclick = function() {
606 var name = DOM.oils_rpt_folder_manager_name_input.value;
609 if(confirmId('oils_rpt_folder_manager_change_name_confirm')) {
610 oilsRptUpdateFolder(folder, obj.type,
613 oilsRptAlertSuccess();
614 oilsRptCurrentFolderManager.draw();
622 DOM.oils_rpt_folder_manager_sub_lib_create.onclick = function() {
625 if( obj.type == 'report' ) folder = new rrf();
626 if( obj.type == 'template' ) folder = new rtf();
627 if( obj.type == 'output' ) folder = new rof();
629 folder.owner(USER.id());
630 folder.parent(obj.folderNode.folder.id());
631 folder.name(DOM.oils_rpt_folder_manager_sub_name.value);
632 var shared = getSelectorVal(DOM.oils_rpt_folder_manager_sub_shared);
633 folder.shared( (shared == 'yes') ? 't' : 'f');
634 if( folder.shared() == 't' )
635 folder.share_with( obj.myOrgSelector.getValue() );
637 oilsRptCreateFolder(folder, obj.type,
640 oilsRptAlertSuccess();
641 oilsRptCurrentFolderManager.draw();
649 oilsRptFolderWindow.prototype.doFolderDelete = function() {
651 var cache = oilsRptFolderNodeCache[this.type];
652 /* let's see if this folder has any children */
653 for( var c in cache )
654 if( cache[c].folder.parent() == this.folderNode.folder.id() )
655 return alertId('oils_rpt_folder_cannot_delete');
657 /* lets see if the folder has contents */
658 var req = new Request(OILS_RPT_FETCH_FOLDER_DATA,
659 SESSION, this.type, this.folderNode.folder.id(), 1);
661 if(this.type == 'output') {
662 req = new Request(OILS_RPT_FETCH_OUTPUT,
663 SESSION, this.folderNode.folder.id(), 1);
672 var contents = r.getResultObject();
673 if( contents.length > 0 )
674 return alertId('oils_rpt_folder_cannot_delete');
676 if( confirmId('oils_rpt_folder_manager_delete_confirm') ) {
677 var req2 = new Request(OILS_RPT_DELETE_FOLDER,
678 SESSION, obj.type, obj.folderNode.folder.id());
682 var res = r2.getResultObject();
684 oilsRptAlertSuccess();
685 oilsRptCurrentFolderManager.draw();
687 else alert('error: '+js2JSON(res));