]> git.evergreen-ils.org Git - working/Evergreen.git/blob - Open-ILS/web/reports/oils_rpt_folder_window.js
wired up folder share/unshare actions, got folder delete working for all the types...
[working/Evergreen.git] / Open-ILS / web / reports / oils_rpt_folder_window.js
1
2
3
4
5 /* generic folder window class */
6 oilsRptSetSubClass('oilsRptFolderWindow', 'oilsRptObject');
7 function oilsRptFolderWindow(type, folderId) { 
8         this.init();
9         var node = oilsRptCurrentFolderManager.findNode(type, folderId);
10         this.selector = DOM.oils_rpt_folder_contents_selector;
11         this.folderNode = node;
12         this.type = type;
13 }
14
15
16 oilsRptFolderWindow.prototype.draw = function() {
17
18         _debug(this.folderNode.folder.owner().id() + ' : ' + USER.id());
19
20         var obj = this;
21         setSelector(DOM.oils_rpt_output_limit_selector, oilsRptOutputLimit);
22         DOM.oils_rpt_output_limit_redraw.onclick = function() {
23                 oilsRptOutputLimit = getSelectorVal(DOM.oils_rpt_output_limit_selector);
24                 obj.draw();
25         }
26
27         if( this.folderNode.folder.owner().id() == USER.id() && this.type == 'template') 
28                 unHideMe(DOM.oils_rpt_folder_window_contents_new_template.parentNode);
29         else hideMe(DOM.oils_rpt_folder_window_contents_new_template.parentNode);
30
31         unHideMe(DOM.oils_rpt_folder_window_contents_div);
32         hideMe(DOM.oils_rpt_folder_manager_div);
33         hideMe(DOM.oils_rpt_top_folder);
34
35         DOM.oils_rpt_folder_window_manage_tab.onclick = function() {
36                 unHideMe(DOM.oils_rpt_folder_window_contents_div);
37                 hideMe(DOM.oils_rpt_folder_manager_div);
38         }
39         DOM.oils_rpt_folder_window_edit_tab.onclick = function() {
40                 hideMe(DOM.oils_rpt_folder_window_contents_div);
41                 unHideMe(DOM.oils_rpt_folder_manager_div);
42         }
43
44         this.setFolderEditActions();
45
46         hideMe(DOM.oils_rpt_template_folder_new_report);
47         unHideMe(DOM.oils_rpt_folder_table_right_td);
48         hideMe(DOM.oils_rpt_folder_table_alt_td);
49         this.drawFolderDetails();
50
51         DOM.oils_rpt_folder_content_action_go.onclick = 
52                 function() {obj.doFolderAction()}
53
54         this.fetchFolderData();
55
56         var sel = DOM.oils_rpt_folder_contents_action_selector;
57         var x = true;
58         for( var i = 0; i < sel.options.length; i++ ) {
59                 var opt = sel.options[i];
60                 if( opt.getAttribute('type') == this.type ) {
61                         if(x) opt.selected = true;
62                         x = false;
63                         unHideMe(opt);
64                 }
65                 else hideMe(opt);
66         }
67         sel.options[0].selected = true;
68
69         /*
70         hideMe(DOM.oils_rpt_output_limit_selector.parentNode);
71         if( this.type == 'output' )
72                 unHideMe(DOM.oils_rpt_output_limit_selector.parentNode);
73                 */
74
75         this.drawEditActions();
76 }
77
78 oilsRptFolderWindow.prototype.drawEditActions = function() {
79
80         DOM.oils_rpt_folder_window_contents_new_template.onclick = function() {
81                 var s = location.search+'';
82                 s = s.replace(/\&folder=\d+/,'');
83                 goTo( 'oils_rpt_builder.xhtml'+s+'&folder='+obj.folderNode.folder.id());
84         }
85
86
87         if( this.folderNode.folder.owner().id() != USER.id() )
88                 hideMe(DOM.oils_rpt_folder_manager_tab_table);
89         else
90                 unHideMe(DOM.oils_rpt_folder_manager_tab_table);
91
92         if( isTrue(this.folderNode.folder.shared())) {
93                 DOM.oils_rpt_folder_manager_share_opt.disabled = true;
94                 DOM.oils_rpt_folder_manager_unshare_opt.disabled = false;
95         } else {
96                 DOM.oils_rpt_folder_manager_share_opt.disabled = false;
97                 DOM.oils_rpt_folder_manager_unshare_opt.disabled = true;
98         }
99
100         this.hideFolderActions();
101         var obj = this;
102
103         DOM.oils_rpt_folder_manager_actions_submit.onclick = function() {
104                 var act = getSelectorVal(DOM.oils_rpt_folder_manager_actions);
105                 _debug("doing folder action: " + act);
106                 obj.hideFolderActions();
107                 switch(act) {
108                         case 'change_name':
109                                 unHideMe(DOM.oils_rpt_folder_manager_change_name_div);
110                                 break;
111                         case 'create_sub_folder':
112                                 unHideMe(DOM.oils_rpt_folder_manager_create_sub);
113                                 obj.myOrgSelector = new oilsRptMyOrgsWidget(
114                                         DOM.oils_rpt_folder_manager_sub_lib_picker, USER.ws_ou());
115                                 obj.myOrgSelector.draw();
116                                 break;
117                         case 'delete':
118                                 obj.doFolderDelete();
119                                 break;
120                         case 'share':
121                                 obj.shareFolder();
122                                 break;
123                         case 'unshare':
124                                 obj.unShareFolder();
125                                 break;
126                 }
127         }
128
129 }
130
131
132 oilsRptFolderWindow.prototype.shareFolder = function() {
133         var folder = this.folderNode.folder;
134         if(isTrue(folder.shared()))
135                 return alertId('oils_rpt_folder_already_shared');
136         unHideMe(DOM.oils_rpt_folder_manager_share_div);
137
138         var orgsel = new oilsRptMyOrgsWidget(
139                 DOM.oils_rpt_folder_manager_share_lib_picker, USER.ws_ou());
140         orgsel.draw();
141
142         var type = this.type;
143         DOM.oils_rpt_folder_manager_share_submit.onclick = function() {
144                 folder.shared('t');
145                 folder.share_with(orgsel.getValue());
146                 oilsRptUpdateFolder( folder, type, 
147                         function(success) {
148                                 if(success) {
149                                         oilsRptAlertSuccess();
150                                         oilsRptCurrentFolderManager.draw();
151                                 }
152                         }
153                 );
154         }
155 }
156
157 oilsRptFolderWindow.prototype.unShareFolder = function() {
158         var folder = this.folderNode.folder;
159         if(!isTrue(folder.shared()))
160                 return alertId('oils_rpt_folder_already_unshared');
161         if(!confirmId('oils_rpt_folder_unshare_confirm')) return;
162         folder.shared('f');
163         var type = this.type;
164         oilsRptUpdateFolder( folder, type, 
165                 function(success) {
166                         if(success) {
167                                 oilsRptAlertSuccess();
168                                 oilsRptCurrentFolderManager.draw();
169                         }
170                 }
171         );
172 }
173
174
175 oilsRptFolderWindow.prototype.hideFolderActions = function() {
176         hideMe(DOM.oils_rpt_folder_manager_change_name_div);
177         hideMe(DOM.oils_rpt_folder_manager_create_sub);
178         hideMe(DOM.oils_rpt_folder_manager_share_div);
179 }
180
181
182 oilsRptFolderWindow.prototype.doFolderAction = function() {
183         var objs = this.fmTable.getSelected();
184         if( objs.length == 0 ) 
185                 return alert('Please select an item from the list');
186         var action = getSelectorVal(DOM.oils_rpt_folder_contents_action_selector);
187
188         var obj = this;
189         switch(action) {
190                 case 'create_report' :
191                         hideMe(DOM.oils_rpt_folder_table_right_td);
192                         unHideMe(DOM.oils_rpt_folder_table_alt_td);
193                         unHideMe(DOM.oils_rpt_editor_div);
194                         new oilsRptReportEditor(new oilsReport(objs[0]), this);
195                         break;
196                 case 'delete_report' :
197                         for(var r = 0; r < objs.length; r++) 
198                                 this.deleteReport(objs[r]);
199                         break;
200                 case 'delete_template' :
201                         for(var r = 0; r < objs.length; r++) 
202                                 this.deleteTemplate(objs[r]);
203                         break;
204                 case 'show_output':
205                         this.showOutput(objs[0]);
206                         break;
207                 case 'delete_output':
208                         this.deleteOutputs(objs,0, 
209                                 function(){
210                                         oilsRptAlertSuccess();
211                                         obj.draw();
212                                 }
213                         );
214                         break;
215
216         }
217 }
218
219
220 oilsRptFolderWindow.prototype.deleteOutputs = function(list, idx, callback) {
221         if( idx >= list.length ) return callback();
222         var req = new Request(OILS_RPT_DELETE_SCHEDULE,SESSION,list[idx].id());
223         var obj = this;
224         req.callback(function(){obj.deleteOutputs(list, ++idx, callback);});
225         req.send();
226 }
227
228 oilsRptFolderWindow.prototype.showOutput = function(sched) {
229         oilsRptFetchReport(sched.report(), 
230                 function(r) {
231                         var url = oilsRptBuildOutputLink(r.template(), r.id(), sched.id());
232                         goTo(url);
233                 }
234         );
235 }
236
237
238 oilsRptFolderWindow.prototype.deleteReport = function(report) {
239         if(!confirmId('oils_rpt_folder_contents_confirm_report_delete')) return;
240         var req = new Request(OILS_RPT_DELETE_REPORT, SESSION, report.id());
241         req.callback(
242                 function(r) {
243                         var res = r.getResultObject();
244                         if( res == 1 ) {
245                                 oilsRptAlertSuccess();
246                                 oilsRptCurrentFolderManager.draw();
247                         }
248                 }
249         );
250         req.send();
251 }
252
253 oilsRptFolderWindow.prototype.deleteTemplate = function(tmpl) {
254         var req0 = new Request( OILS_RPT_TEMPLATE_HAS_RPTS, SESSION, tmpl.id() );
255         req0.callback(
256                 function(r0) {
257                         var resp = r0.getResultObject();
258                         if( resp != '0' )
259                                 return alertId('oils_rpt_folder_contents_template_no_delete');
260                         if(!confirmId('oils_rpt_folder_contents_confirm_template_delete')) return;
261                         var req = new Request(OILS_RPT_DELETE_TEMPLATE, SESSION, tmpl.id());
262                         req.callback(
263                                 function(r) {
264                                         var res = r.getResultObject();
265                                         if( res == 1 ) {
266                                                 oilsRptAlertSuccess();
267                                                 oilsRptCurrentFolderManager.draw();
268                                         }
269                                 }
270                         );
271                         req.send();
272                 }
273         );
274         req0.send();
275 }
276
277
278
279 oilsRptFolderWindow.prototype.drawFolderDetails = function() {
280         appendClear(DOM.oils_rpt_folder_creator_label, 
281                 text(this.folderNode.folder.owner().usrname()));
282         appendClear(DOM.oils_rpt_folder_name_label, 
283                 text(this.folderNode.folder.name()));
284 }
285
286
287 oilsRptFolderWindow.prototype.fetchFolderData = function(callback) {
288         removeChildren(this.selector);
289         var req = new Request(OILS_RPT_FETCH_FOLDER_DATA, 
290                 SESSION, this.type, this.folderNode.folder.id(), oilsRptOutputLimit);
291
292         if(this.type == 'output') {
293                 req = new Request(OILS_RPT_FETCH_OUTPUT, 
294                         SESSION, this.folderNode.folder.id(), oilsRptOutputLimit);
295         }
296
297         var obj = this;
298         removeChildren(obj.selector);
299         req.callback(
300                 function(r) {
301                         var res = r.getResultObject();
302                         if( obj.type == 'output' ) {
303                                 obj.fleshSchedules(res, 0);
304                         } else {
305                                 obj.fmTable = drawFMObjectTable( 
306                                         { 
307                                                 dest : obj.selector, 
308                                                 obj : res,
309                                                 selectCol : true,
310                                                 selectColName : 'Select',
311                                                 selectAllName : 'All',
312                                                 selectNoneName : 'None'
313                                         }
314                                 );
315                         }
316                 }
317         );
318         req.send();
319 }
320
321
322 oilsRptFolderWindow.prototype.fleshSchedules = function(list, idx) {
323         if( idx >= list.length ) {
324                 this.fmTable = drawFMObjectTable( 
325                         { 
326                                 dest : this.selector, 
327                                 obj : list,
328                                 selectCol : true,
329                                 selectColName : 'Select',
330                                 selectAllName : 'All',
331                                 selectNoneName : 'None'
332                         }
333                 );
334                 return;
335         }
336
337         var sched = list[idx];
338         var obj = this;
339         oilsRptFetchUser(sched.runner(),
340                 function(user) {
341                         sched.runner(user);
342                         oilsRptFetchReport(sched.report(),
343                                 function(report) {
344                                         sched.report(report);
345                                         oilsRptFetchTemplate(report.template(),
346                                                 function(template) {
347                                                         report.template(template);
348                                                         obj.fleshSchedules(list, ++idx);
349                                                 }
350                                         );
351                                 }
352                         );
353                 }
354         );
355 }
356
357
358 oilsRptFolderWindow.prototype.setSelected = function(folderNode) {
359         this.selectedFolder = folderNode;
360 }
361
362 oilsRptFolderWindow.prototype.setFolderEditActions = function() {
363         var folder = this.folderNode.folder;
364
365         var obj = this;
366         DOM.oils_rpt_folder_manager_name_input.value = folder.name();
367         DOM.oils_rpt_folder_manager_change_name_submit.onclick = function() {
368                 var name = DOM.oils_rpt_folder_manager_name_input.value;
369                 if(name) {
370                         folder.name( name );
371                         if(confirmId('oils_rpt_folder_manager_change_name_confirm')) {
372                                 oilsRptUpdateFolder(folder, obj.type,
373                                         function(success) {
374                                                 if(success) {
375                                                         oilsRptAlertSuccess();
376                                                         oilsRptCurrentFolderManager.draw();
377                                                 }
378                                         }
379                                 );
380                         }
381                 }
382         }
383
384         DOM.oils_rpt_folder_manager_sub_lib_create.onclick = function() {
385                 var folder;
386
387                 if( obj.type == 'report' ) folder = new rrf();
388                 if( obj.type == 'template' ) folder = new rtf();
389                 if( obj.type == 'output' ) folder = new rof();
390
391                 folder.owner(USER.id());
392                 folder.parent(obj.folderNode.folder.id());
393                 folder.name(DOM.oils_rpt_folder_manager_sub_name.value);
394                 var shared = getSelectorVal(DOM.oils_rpt_folder_manager_sub_shared);
395                 folder.shared( (shared == 'yes') ? 't' : 'f');
396                 if( folder.shared() == 't' )
397                         folder.share_with( obj.myOrgSelector.getValue() );
398
399                 oilsRptCreateFolder(folder, obj.type,
400                         function(success) {
401                                 if(success) {
402                                         oilsRptAlertSuccess();
403                                         oilsRptCurrentFolderManager.draw();
404                                 }
405                         }
406                 );
407         }
408 }
409
410
411 oilsRptFolderWindow.prototype.doFolderDelete = function() {
412         
413         var cache = oilsRptFolderNodeCache[this.type];
414         /* let's see if this folder has any children */
415         for( var c in cache ) 
416                 if( cache[c].folder.parent() == this.folderNode.folder.id() )
417                         return alertId('oils_rpt_folder_cannot_delete');
418
419         /* lets see if the folder has contents */
420         var req = new Request(OILS_RPT_FETCH_FOLDER_DATA, 
421                 SESSION, this.type, this.folderNode.folder.id(), 1);
422
423         if(this.type == 'output') {
424                 req = new Request(OILS_RPT_FETCH_OUTPUT, 
425                         SESSION, this.folderNode.folder.id(), 1);
426         }
427
428         var obj = this;
429         req.send();
430
431         req.callback( 
432                 function(r) {
433
434                         var contents = r.getResultObject();
435                         if( contents.length > 0 ) 
436                                 return alertId('oils_rpt_folder_cannot_delete');
437
438                         if( confirmId('oils_rpt_folder_manager_delete_confirm') ) {
439                                 var req2 = new Request(OILS_RPT_DELETE_FOLDER, 
440                                         SESSION, obj.type, obj.folderNode.folder.id());
441         
442                                 req2.callback( 
443                                         function(r2) {
444                                                 var res = r2.getResultObject();
445                                                 if( res == 1 ) {
446                                                         oilsRptAlertSuccess();
447                                                         oilsRptCurrentFolderManager.draw();
448                                                 }
449                                                 else alert('error: '+js2JSON(res));
450                                         }
451                                 );
452
453                                 req2.send();
454                         }
455                 }
456         );
457 }
458
459