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