]> git.evergreen-ils.org Git - Evergreen.git/blob - Open-ILS/web/reports/oils_rpt_folders.js
LP#1329503 View Edit Reports
[Evergreen.git] / Open-ILS / web / reports / oils_rpt_folders.js
1 dojo.requireLocalization("openils.reports", "reports");
2
3 var rpt_strings = dojo.i18n.getLocalization("openils.reports", "reports");
4
5 var oilsRptFolderNodeCache = {};
6 oilsRptFolderNodeCache.template = {};
7 oilsRptFolderNodeCache.report  = {};
8 oilsRptFolderNodeCache.output  = {};
9
10 oilsRptSetSubClass('oilsRptFolderManager','oilsRptObject');
11
12 function oilsRptFolderManager() { this.init(); }
13
14 oilsRptFolderManager.prototype.draw = function(auth) {
15
16         if(!auth) auth = SESSION;
17
18         this.folderTree = {};
19         this.tId = oilsNextId();
20         this.rId = oilsNextId();
21         this.oId = oilsNextId();
22         this.stId = oilsNextId();
23         this.srId = oilsNextId();
24         this.soId = oilsNextId();
25
26         this.ownerFolders = {};
27         this.ownerFolders.template = {};
28         this.ownerFolders.report = {};
29         this.ownerFolders.output = {};
30
31         removeChildren(DOM.oils_rpt_template_folder_tree); 
32         removeChildren(DOM.oils_rpt_report_folder_tree); 
33         removeChildren(DOM.oils_rpt_output_folder_tree); 
34         removeChildren(DOM.oils_rpt_template_shared_folder_tree); 
35         removeChildren(DOM.oils_rpt_report_shared_folder_tree); 
36         removeChildren(DOM.oils_rpt_output_shared_folder_tree); 
37
38         var porg = PERMS.SHARE_REPORT_FOLDER;
39         if( porg < 1 ) 
40                 DOM.oils_rpt_top_folder_shared.disabled = true;
41
42         var obj = this;
43         var orgsel = new oilsRptMyOrgsWidget(
44                 DOM.oils_rpt_top_folder_lib_picker, USER.ws_ou(), porg)
45         orgsel.draw();
46
47         oilsRptTemplateFolderTree = 
48                 new SlimTree(
49                         DOM.oils_rpt_template_folder_tree, 
50                         'oilsRptTemplateFolderTree');
51                         //'images/template-page.gif');
52
53         oilsRptTemplateFolderTree.addNode(this.tId, -1, rpt_strings.FOLDERS_TEMPLATES,
54                 function() {
55                         unHideMe(DOM.oils_rpt_folder_table_alt_td);
56                         unHideMe(DOM.oils_rpt_top_folder);
57                         hideMe(DOM.oils_rpt_editor_div);
58                         appendClear(DOM.oils_rpt_top_folder_type,text(rpt_strings.FOLDERS_TEMPLATE));
59                         hideMe(DOM.oils_rpt_folder_table_right_td);
60                         DOM.oils_rpt_top_folder_create.onclick = function() {
61                                 obj.createTopFolder('template', orgsel);
62                         }
63                 }
64         );
65
66         oilsRptReportFolderTree = 
67                 new SlimTree(
68                         DOM.oils_rpt_report_folder_tree, 
69                         'oilsRptReportFolderTree');
70                         //'images/report-page.gif');
71
72
73         oilsRptReportFolderTree.addNode(this.rId, -1, rpt_strings.FOLDERS_REPORTS,
74                 function() {
75                         unHideMe(DOM.oils_rpt_folder_table_alt_td);
76                         unHideMe(DOM.oils_rpt_top_folder);
77                         hideMe(DOM.oils_rpt_editor_div);
78                         hideMe(DOM.oils_rpt_folder_table_right_td);
79                         appendClear(DOM.oils_rpt_top_folder_type,text(rpt_strings.FOLDERS_REPORT));
80                         DOM.oils_rpt_top_folder_create.onclick = function() {
81                                 obj.createTopFolder('report', orgsel);
82                         }
83                 }
84         );
85
86
87
88         oilsRptOutputFolderTree = 
89                 new SlimTree(
90                         DOM.oils_rpt_output_folder_tree, 
91                         'oilsRptOutputFolderTree');
92                         //'images/output-page.gif');
93
94         oilsRptOutputFolderTree.addNode(this.oId, -1, rpt_strings.FOLDERS_OUTPUT,
95                 function() {
96                         unHideMe(DOM.oils_rpt_folder_table_alt_td);
97                         unHideMe(DOM.oils_rpt_top_folder);
98                         hideMe(DOM.oils_rpt_editor_div);
99                         hideMe(DOM.oils_rpt_folder_table_right_td);
100                         appendClear(DOM.oils_rpt_top_folder_type,text(rpt_strings.FOLDERS_OUTPUT));
101                         DOM.oils_rpt_top_folder_create.onclick = function() {
102                                 obj.createTopFolder('output', orgsel);
103                         }
104                 }
105         );
106
107
108         oilsRptSharedTemplateFolderTree = 
109                 new SlimTree(
110                         DOM.oils_rpt_template_shared_folder_tree, 
111                         'oilsRptSharedTemplateFolderTree');
112                         //'images/template-page.gif');
113
114         oilsRptSharedTemplateFolderTree.addNode(this.stId, -1, rpt_strings.FOLDERS_TEMPLATES)
115
116
117         oilsRptSharedReportFolderTree = 
118                 new SlimTree(
119                         DOM.oils_rpt_report_shared_folder_tree, 
120                         'oilsRptSharedReportFolderTree');
121                         //'images/report-page.gif');
122
123         oilsRptSharedReportFolderTree.addNode(this.srId, -1, rpt_strings.FOLDERS_REPORTS)
124
125         oilsRptSharedOutputFolderTree = 
126                 new SlimTree(
127                         DOM.oils_rpt_output_shared_folder_tree, 
128                         'oilsRptSharedOutputFolderTree');
129                         //'images/output-page.gif');
130
131         oilsRptSharedOutputFolderTree.addNode(this.soId, -1, rpt_strings.FOLDERS_OUTPUT)
132
133         this.fetchFolders(auth);
134 }
135
136 oilsRptFolderManager.prototype.createTopFolder = function(type, orgsel) {
137
138         if( type == 'report' ) folder = new rrf();
139         if( type == 'template' ) folder = new rtf();
140         if( type == 'output' ) folder = new rof();
141
142         folder.owner(USER.id());
143         folder.parent(null);
144
145         /* Protect against empty folder names */
146         if (!DOM.oils_rpt_top_folder_name.value) {
147                 return;
148         }
149
150         folder.name(DOM.oils_rpt_top_folder_name.value);
151         folder.shared(getSelectorVal(DOM.oils_rpt_top_folder_shared));
152
153         if( folder.shared() == 't' )
154                 folder.share_with( orgsel.getValue() );
155
156         oilsRptCreateFolder(folder, type,
157                 function(success) {
158                         if(success) {
159                                 oilsRptAlertSuccess();
160                                 oilsRptCurrentFolderManager.draw();
161                                 hideMe(DOM.oils_rpt_top_folder);
162                                 hideMe(DOM.oils_rpt_folder_table_alt_td);
163                                 unHideMe(DOM.oils_rpt_editor_div);
164                         }
165                 }
166         );
167 }
168
169
170 oilsRptFolderManager.prototype.fetchFolders = function(auth) {
171         var obj = this;
172         if(PERMS.RUN_REPORTS != -1) {
173                 var req = new Request(OILS_RPT_FETCH_FOLDERS, auth, 'template');
174                 req.callback( function(r) { obj.drawFolders('template', r.getResultObject()); } );
175                 req.send();
176
177                 var req = new Request(OILS_RPT_FETCH_FOLDERS, auth, 'report');
178                 req.callback( function(r) { obj.drawFolders('report', r.getResultObject()); } );
179                 req.send();
180         }
181
182         var req = new Request(OILS_RPT_FETCH_FOLDERS, auth, 'output');
183         req.callback( function(r) { obj.drawFolders('output', r.getResultObject()); } );
184         req.send();
185 }
186
187
188 oilsRptFolderManager.prototype.drawFolders = function(type, folders) {
189
190         var tree;
191         var owners = {};
192
193         for( var i = 0; i < folders.length; i++ ) {
194
195                 var folder = folders[i];
196                 var id = oilsNextId();
197                 var node = { folder : folder, treeId : id };
198
199                 oilsRptFolderNodeCache[type][folder.id()] = node;
200                 node.folderWindow = new oilsRptFolderWindow(type, folder.id())
201
202                 /*
203                 _debug("creating folder node for "+folder.name()+" : id = "+
204                         folder.id()+' treeId = '+id + ' window id = ' + node.folderWindow.id);
205                         */
206
207                 /* shared folders get a folder for the usrname of the 
208                         owner as the parent node for the folders in the tree */
209                 if(!folder.parent() && folder.owner().id() != USER.id()) {
210                         if(owners[folder.owner().id()]) {
211                                 node.ownerNode = owners[folder.owner().id()];
212                                 continue;
213                         }
214
215                         _debug("building usrname node "+type+" -> " +folder.owner().usrname());
216
217                         var id = oilsNextId();
218                         var pid = this.stId;
219                         var tree = oilsRptSharedTemplateFolderTree;
220                         var treename = 'oilsRptSharedTemplateFolderTree';
221
222                         if(type=='report') {
223                                 tree = oilsRptSharedReportFolderTree;
224                                 treename = 'oilsRptSharedReportFolderTree';
225                                 pid = this.srId;
226                         }
227
228                         if(type=='output') {
229                                 tree = oilsRptSharedOutputFolderTree;
230                                 treename = 'oilsRptSharedOutputFolderTree';
231                                 pid = this.soId;
232                         }
233
234                         tree.addNode(id, pid, folder.owner().usrname());
235                         tree.close(pid);
236                         owners[folder.owner().id()] = id;
237                         node.ownerNode = id;
238                 }
239         }
240
241         for( var i = 0; i < folders.length; i++ ) {
242
243
244                 var folder = folders[i];
245                 var mine = (folder.owner().id() == USER.id());
246                 var pid;
247                 var treename;
248
249                 switch(type) {
250                         case 'template': 
251                                 if(mine) {
252                                         tree = oilsRptTemplateFolderTree;
253                                         treename = 'oilsRptTemplateFolderTree';
254                                         pid = this.tId;
255                                 } else {
256                                         tree = oilsRptSharedTemplateFolderTree;
257                                         treename = 'oilsRptSharedTemplateFolderTree';
258                                         pid = this.stId;
259                                 }
260                                 break;
261                         case 'report': 
262                                 if(mine) {
263                                         tree = oilsRptTemplateFolderTree;
264                                         treename = 'oilsRptTemplateFolderTree';
265                                         pid = this.rId;
266                                 } else {
267                                         tree = oilsRptSharedTemplateFolderTree;
268                                         treename = 'oilsRptSharedTemplateFolderTree';
269                                         pid = this.srId;
270                                 }
271                                 break;
272                         case 'output': 
273                                 if(mine) {
274                                         tree = oilsRptTemplateFolderTree;
275                                         treename = 'oilsRptTemplateFolderTree';
276                                         pid = this.oId;
277                                 } else {
278                                         tree = oilsRptSharedTemplateFolderTree;
279                                         treename = 'oilsRptSharedTemplateFolderTree';
280                                         pid = this.soId;
281                                 }
282                 }
283
284                 node = this.findNode(type, folder.id());
285                 id = node.treeId;
286                 if( folder.parent() ) 
287                         pid = this.findNode(type, folder.parent()).treeId;
288
289                 var fname = folder.name();
290
291                 if(!mine) {
292                         fname = folder.name() + ' ('+folder.share_with().shortname()+')';
293                         if( node.ownerNode ) pid = node.ownerNode;
294
295                 } else {
296                         if(isTrue(folder.shared()))
297                                 fname = folder.name() + ' ('+folder.share_with().shortname()+')';
298                 }
299
300                 var action = 'javascript:oilsRptObject.find('+node.folderWindow.id+').draw();';
301
302                 /*
303                 _debug('adding node '+fname+' id = ' + id + ' pid = '
304                         +pid + ' parent = ' + folder.parent() + ' folder-window = ' + node.folderWindow.id );
305                         */
306
307                 tree.addNode(id, pid, fname, action);
308                 tree.close(pid);
309         }
310 }
311
312
313 oilsRptFolderManager.prototype.findNode = function(type, id) {
314         return oilsRptFolderNodeCache[type][id];
315 }
316
317
318
319
320
321
322 /* this only works if the initial folder tree has been drawn 
323         if defined, "action" must be a function pointer that takes the
324         folder node as the param 
325
326     eachFolder - optional callback called with each folder
327     node after its added to the folder list.
328 */
329 var __someid;
330 function oilsRptBuildFolder(type, node, treeVar, rootName, action, shared, eachFolder) {
331         removeChildren(node);
332         var tree = new SlimTree(node, treeVar);
333         this.treeId = oilsNextId();
334         tree.addNode(this.treeId, -1, rootName);
335
336         __someid = oilsNextId();
337
338         var cache = oilsRptFolderNodeCache[type];
339
340         for( var c in cache ) {
341                 var tid = cache[c].treeId + __someid;
342                 var pid = this.treeId;
343                 var f = cache[c].folder;
344
345                 if( !shared && (f.owner().id() != USER.id()) ) continue;
346
347                 if(f.parent()) {
348                         /* find the parent's tree id so we can latch on to it */
349                         var pnode = cache[f.parent()];
350                         var pid = pnode.treeId + __someid;
351                 }
352
353                 tree.addNode(tid, pid, f.name(), __setFolderCB(tree, tid, action, cache[c]));
354
355         if (eachFolder) eachFolder(cache[c]);
356         }
357         eval(treeVar +' = tree;');
358 }
359
360 function __setFolderCB(tree, id, action, node) {
361         var act;
362         if( action ) 
363                 act = function() { action( node ); };
364         return act;
365 }
366