]> git.evergreen-ils.org Git - Evergreen.git/blob - Open-ILS/web/reports/oils_rpt_folders.js
alias/relation is now encoded to prevent from-clause aliases from becoming too large
[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         oilsRptCreateFolder(folder, type,
143                 function(success) {
144                         if(success) {
145                                 oilsRptAlertSuccess();
146                                 oilsRptCurrentFolderManager.draw();
147                                 hideMe(DOM.oils_rpt_top_folder);
148                                 hideMe(DOM.oils_rpt_folder_table_alt_td);
149                                 unHideMe(DOM.oils_rpt_editor_div);
150                         }
151                 }
152         );
153 }
154
155
156 oilsRptFolderManager.prototype.fetchFolders = function(auth) {
157         var obj = this;
158         var req = new Request(OILS_RPT_FETCH_FOLDERS, auth, 'template');
159         req.callback( function(r) { obj.drawFolders('template', r.getResultObject()); } );
160         req.send();
161
162         var req = new Request(OILS_RPT_FETCH_FOLDERS, auth, 'report');
163         req.callback( function(r) { obj.drawFolders('report', r.getResultObject()); } );
164         req.send();
165
166         var req = new Request(OILS_RPT_FETCH_FOLDERS, auth, 'output');
167         req.callback( function(r) { obj.drawFolders('output', r.getResultObject()); } );
168         req.send();
169 }
170
171
172 oilsRptFolderManager.prototype.drawFolders = function(type, folders) {
173         var tree;
174
175         folders = folders.sort(
176                 function(a,b) {
177                         var asw = a.share_with();
178                         var bsw = b.share_with();
179                         if( asw ) asw = findOrgDepth(findOrgUnit(asw.id()));
180                         else asw = -1;
181                         if( bsw ) bsw = findOrgDepth(findOrgUnit(bsw.id()));
182                         else bsw = -1;
183                         if( asw < bsw ) return 1;
184                         if( asw > bsw ) return -1;
185                         return 0;
186                 }
187         );
188
189
190         for( var i = 0; i < folders.length; i++ ) {
191                 var folder = folders[i];
192                 var id = oilsNextId();
193                 var node = { folder : folder, treeId : id };
194                 oilsRptFolderNodeCache[type][folder.id()] = node;
195                 node.folderWindow = new oilsRptFolderWindow(type, folder.id())
196                 /*
197                 _debug("creating folder node for "+folder.name()+" : id = "+
198                         folder.id()+' treeId = '+id + ' window id = ' + node.folderWindow.id);
199                         */
200         }
201
202
203         for( var i = 0; i < folders.length; i++ ) {
204
205                 var folder = folders[i];
206                 var mine = (folder.owner().id() == USER.id());
207                 var pid;
208                 var treename;
209
210                 switch(type) {
211                         case 'template': 
212                                 if(mine) {
213                                         tree = oilsRptTemplateFolderTree;
214                                         treename = 'oilsRptTemplateFolderTree';
215                                         pid = this.tId;
216                                 } else {
217                                         tree = oilsRptSharedTemplateFolderTree;
218                                         treename = 'oilsRptSharedTemplateFolderTree';
219                                         pid = this.stId;
220                                 }
221                                 break;
222                         case 'report': 
223                                 if(mine) {
224                                         tree = oilsRptTemplateFolderTree;
225                                         treename = 'oilsRptTemplateFolderTree';
226                                         pid = this.rId;
227                                 } else {
228                                         tree = oilsRptSharedTemplateFolderTree;
229                                         treename = 'oilsRptSharedTemplateFolderTree';
230                                         pid = this.srId;
231                                 }
232                                 break;
233                         case 'output': 
234                                 if(mine) {
235                                         tree = oilsRptTemplateFolderTree;
236                                         treename = 'oilsRptTemplateFolderTree';
237                                         pid = this.oId;
238                                 } else {
239                                         tree = oilsRptSharedTemplateFolderTree;
240                                         treename = 'oilsRptSharedTemplateFolderTree';
241                                         pid = this.soId;
242                                 }
243                 }
244
245                 node = this.findNode(type, folder.id());
246                 id = node.treeId;
247                 if( folder.parent() ) 
248                         pid = this.findNode(type, folder.parent()).treeId;
249
250                 /*
251                 if(!mine) {
252                         if(!this.orgTrail[type][folder.share_with().id()]) {
253                                 tree.addNode(id, pid, folder.share_with().shortname());
254                                 tree.close(pid);
255                                 pid = id;
256                                 id = oilsNextId();
257                                 this.orgTrail[type][folder.share_with().id()] = pid;
258                         } else {
259                                 pid = this.orgTrail[type][folder.share_with().id()];
260                                 id = oilsNextId();
261                         }
262                 }
263                 */
264
265                 var fname = folder.name();
266
267                 if(!mine) {
268                         fname = folder.name() + ' ('+folder.share_with().shortname()+')';
269                         if(!this.ownerFolders[type][folder.owner().id()]) {
270                                 tree.addNode(id, pid, folder.owner().usrname());
271                                 tree.close(pid);
272                                 pid = id;
273                                 id = oilsNextId();
274                                 this.ownerFolders[type][folder.owner().id()] = pid;
275                         } else {
276                                 pid = this.ownerFolders[type][folder.owner().id()];
277                                 id = oilsNextId();
278                         }
279                 } else {
280                         if(isTrue(folder.shared()))
281                                 fname = folder.name() + ' ('+folder.share_with().shortname()+')';
282                 }
283
284                 var action = 'javascript:oilsRptObject.find('+node.folderWindow.id+').draw();';
285                 /*
286                 _debug('adding node '+fname+' id = ' + id + ' pid = '
287                         +pid + ' parent = ' + folder.parent() + ' folder-window = ' + node.folderWindow.id );
288                         */
289
290                 tree.addNode(id, pid, fname, action);
291                 tree.close(pid);
292         }
293 }
294
295
296 oilsRptFolderManager.prototype.findNode = function(type, id) {
297         return oilsRptFolderNodeCache[type][id];
298 }
299
300
301
302
303
304
305 /* this only works if the initial folder tree has been drawn 
306         if defined, "action" must be a function pointer that takes the
307         folder node as the param */
308 var __someid;
309 function oilsRptBuildFolder(type, node, treeVar, rootName, action) {
310         removeChildren(node);
311         var tree = new SlimTree(node, treeVar);
312         this.treeId = oilsNextId();
313         tree.addNode(this.treeId, -1, rootName);
314
315         __someid = oilsNextId();
316
317         var cache = oilsRptFolderNodeCache[type];
318
319         for( var c in cache ) {
320                 var tid = cache[c].treeId + __someid;
321                 var pid = this.treeId;
322                 var f = cache[c].folder;
323
324                 if(f.parent()) {
325                         /* find the parent's tree id so we can latch on to it */
326                         var pnode = cache[f.parent()];
327                         var pid = pnode.treeId + __someid;
328                 }
329
330                 tree.addNode(tid, pid, f.name(), __setFolderCB(tree, tid, action, cache[c]));
331         }
332         eval(treeVar +' = tree;');
333 }
334
335 function __setFolderCB(tree, id, action, node) {
336         var act;
337         if( action ) 
338                 act = function() { action( node ); };
339         return act;
340 }
341