1 dojo.requireLocalization("openils.reports", "reports");
3 var rpt_strings = dojo.i18n.getLocalization("openils.reports", "reports");
5 var oilsRptFolderNodeCache = {};
6 oilsRptFolderNodeCache.template = {};
7 oilsRptFolderNodeCache.report = {};
8 oilsRptFolderNodeCache.output = {};
9 // ephemeral template search results folder needs an ID.
10 var oilsRptSearchResultFolderId = -1000;
11 var oilsRptSearchResultFolderWindowId = null;
13 oilsRptSetSubClass('oilsRptFolderManager','oilsRptObject');
15 function oilsRptFolderManager() { this.init(); }
17 oilsRptFolderManager.prototype.draw = function(auth) {
19 if(!auth) auth = SESSION;
22 this.tId = oilsNextId();
23 this.rId = oilsNextId();
24 this.oId = oilsNextId();
25 this.stId = oilsNextId();
26 this.srId = oilsNextId();
27 this.soId = oilsNextId();
29 this.ownerFolders = {};
30 this.ownerFolders.template = {};
31 this.ownerFolders.report = {};
32 this.ownerFolders.output = {};
34 removeChildren(DOM.oils_rpt_template_folder_tree);
35 removeChildren(DOM.oils_rpt_report_folder_tree);
36 removeChildren(DOM.oils_rpt_output_folder_tree);
37 removeChildren(DOM.oils_rpt_template_shared_folder_tree);
38 removeChildren(DOM.oils_rpt_report_shared_folder_tree);
39 removeChildren(DOM.oils_rpt_output_shared_folder_tree);
41 var porg = PERMS.SHARE_REPORT_FOLDER;
43 DOM.oils_rpt_top_folder_shared.disabled = true;
46 var orgsel = new oilsRptMyOrgsWidget(
47 DOM.oils_rpt_top_folder_lib_picker, USER.ws_ou(), porg)
50 oilsRptTemplateFolderTree =
52 DOM.oils_rpt_template_folder_tree,
53 'oilsRptTemplateFolderTree');
54 //'images/template-page.gif');
56 oilsRptTemplateFolderTree.addNode(this.tId, -1, rpt_strings.FOLDERS_TEMPLATES,
58 unHideMe(DOM.oils_rpt_folder_table_alt_td);
59 unHideMe(DOM.oils_rpt_top_folder);
60 hideMe(DOM.oils_rpt_editor_div);
61 appendClear(DOM.oils_rpt_top_folder_type,text(rpt_strings.FOLDERS_TEMPLATE));
62 hideMe(DOM.oils_rpt_folder_table_right_td);
63 DOM.oils_rpt_top_folder_create.onclick = function() {
64 obj.createTopFolder('template', orgsel);
69 oilsRptReportFolderTree =
71 DOM.oils_rpt_report_folder_tree,
72 'oilsRptReportFolderTree');
73 //'images/report-page.gif');
76 oilsRptReportFolderTree.addNode(this.rId, -1, rpt_strings.FOLDERS_REPORTS,
78 unHideMe(DOM.oils_rpt_folder_table_alt_td);
79 unHideMe(DOM.oils_rpt_top_folder);
80 hideMe(DOM.oils_rpt_editor_div);
81 hideMe(DOM.oils_rpt_folder_table_right_td);
82 appendClear(DOM.oils_rpt_top_folder_type,text(rpt_strings.FOLDERS_REPORT));
83 DOM.oils_rpt_top_folder_create.onclick = function() {
84 obj.createTopFolder('report', orgsel);
91 oilsRptOutputFolderTree =
93 DOM.oils_rpt_output_folder_tree,
94 'oilsRptOutputFolderTree');
95 //'images/output-page.gif');
97 oilsRptOutputFolderTree.addNode(this.oId, -1, rpt_strings.FOLDERS_OUTPUT,
99 unHideMe(DOM.oils_rpt_folder_table_alt_td);
100 unHideMe(DOM.oils_rpt_top_folder);
101 hideMe(DOM.oils_rpt_editor_div);
102 hideMe(DOM.oils_rpt_folder_table_right_td);
103 appendClear(DOM.oils_rpt_top_folder_type,text(rpt_strings.FOLDERS_OUTPUT));
104 DOM.oils_rpt_top_folder_create.onclick = function() {
105 obj.createTopFolder('output', orgsel);
111 oilsRptSharedTemplateFolderTree =
113 DOM.oils_rpt_template_shared_folder_tree,
114 'oilsRptSharedTemplateFolderTree');
115 //'images/template-page.gif');
117 oilsRptSharedTemplateFolderTree.addNode(this.stId, -1, rpt_strings.FOLDERS_TEMPLATES)
120 oilsRptSharedReportFolderTree =
122 DOM.oils_rpt_report_shared_folder_tree,
123 'oilsRptSharedReportFolderTree');
124 //'images/report-page.gif');
126 oilsRptSharedReportFolderTree.addNode(this.srId, -1, rpt_strings.FOLDERS_REPORTS)
128 oilsRptSharedOutputFolderTree =
130 DOM.oils_rpt_output_shared_folder_tree,
131 'oilsRptSharedOutputFolderTree');
132 //'images/output-page.gif');
134 oilsRptSharedOutputFolderTree.addNode(this.soId, -1, rpt_strings.FOLDERS_OUTPUT)
136 DOM.template_search_submit_button.onclick = function() {
137 oilsRptObject.find(oilsRptSearchResultFolderWindowId).draw();
140 this.fetchFolders(auth);
143 oilsRptFolderManager.prototype.createTopFolder = function(type, orgsel) {
145 if( type == 'report' ) folder = new rrf();
146 if( type == 'template' ) folder = new rtf();
147 if( type == 'output' ) folder = new rof();
149 folder.owner(USER.id());
152 /* Protect against empty folder names */
153 if (!DOM.oils_rpt_top_folder_name.value) {
157 folder.name(DOM.oils_rpt_top_folder_name.value);
158 folder.shared(getSelectorVal(DOM.oils_rpt_top_folder_shared));
160 if( folder.shared() == 't' )
161 folder.share_with( orgsel.getValue() );
163 oilsRptCreateFolder(folder, type,
166 oilsRptAlertSuccess();
167 oilsRptCurrentFolderManager.draw();
168 hideMe(DOM.oils_rpt_top_folder);
169 hideMe(DOM.oils_rpt_folder_table_alt_td);
170 unHideMe(DOM.oils_rpt_editor_div);
177 oilsRptFolderManager.prototype.fetchFolders = function(auth) {
179 if(PERMS.RUN_REPORTS != -1) {
180 var req = new Request(OILS_RPT_FETCH_FOLDERS, auth, 'template');
181 req.callback( function(r) { obj.drawFolders('template', r.getResultObject()); } );
184 var req = new Request(OILS_RPT_FETCH_FOLDERS, auth, 'report');
185 req.callback( function(r) { obj.drawFolders('report', r.getResultObject()); } );
189 var req = new Request(OILS_RPT_FETCH_FOLDERS, auth, 'output');
190 req.callback( function(r) { obj.drawFolders('output', r.getResultObject()); } );
195 oilsRptFolderManager.prototype.drawFolders = function(type, folders) {
200 // Special search results folders ; not added to folder tree.
201 if (type == 'template') {
202 var resFolder = new rtf();
203 resFolder.id(oilsRptSearchResultFolderId);
204 resFolder.name(''); // not shown
205 resFolder.owner(USER);
206 folders.unshift(resFolder);
209 for( var i = 0; i < folders.length; i++ ) {
211 var folder = folders[i];
212 var id = oilsNextId();
213 var node = { folder : folder, treeId : id };
215 oilsRptFolderNodeCache[type][folder.id()] = node;
216 node.folderWindow = new oilsRptFolderWindow(type, folder.id())
218 if (folder.id() == oilsRptSearchResultFolderId)
219 oilsRptSearchResultFolderWindowId = node.folderWindow.id;
222 _debug("creating folder node for "+folder.name()+" : id = "+
223 folder.id()+' treeId = '+id + ' window id = ' + node.folderWindow.id);
226 /* shared folders get a folder for the usrname of the
227 owner as the parent node for the folders in the tree */
228 if(!folder.parent() && folder.owner().id() != USER.id()) {
229 if(owners[folder.owner().id()]) {
230 node.ownerNode = owners[folder.owner().id()];
234 _debug("building usrname node "+type+" -> " +folder.owner().usrname());
236 var id = oilsNextId();
238 var tree = oilsRptSharedTemplateFolderTree;
239 var treename = 'oilsRptSharedTemplateFolderTree';
242 tree = oilsRptSharedReportFolderTree;
243 treename = 'oilsRptSharedReportFolderTree';
248 tree = oilsRptSharedOutputFolderTree;
249 treename = 'oilsRptSharedOutputFolderTree';
253 tree.addNode(id, pid, folder.owner().usrname());
255 owners[folder.owner().id()] = id;
260 var search_folders = [];
261 for( var i = 0; i < folders.length; i++ ) {
263 var folder = folders[i];
264 var mine = (folder.owner().id() == USER.id());
271 tree = oilsRptTemplateFolderTree;
272 treename = 'oilsRptTemplateFolderTree';
275 tree = oilsRptSharedTemplateFolderTree;
276 treename = 'oilsRptSharedTemplateFolderTree';
282 tree = oilsRptTemplateFolderTree;
283 treename = 'oilsRptTemplateFolderTree';
286 tree = oilsRptSharedTemplateFolderTree;
287 treename = 'oilsRptSharedTemplateFolderTree';
293 tree = oilsRptTemplateFolderTree;
294 treename = 'oilsRptTemplateFolderTree';
297 tree = oilsRptSharedTemplateFolderTree;
298 treename = 'oilsRptSharedTemplateFolderTree';
303 node = this.findNode(type, folder.id());
305 if( folder.parent() ) {
306 var pnode = this.findNode(type, folder.parent());
308 node.depth = pnode.depth + 1;
313 var fname = folder.name();
316 fname = folder.name() + ' ('+folder.share_with().shortname()+')';
317 if( node.ownerNode ) pid = node.ownerNode;
320 if(isTrue(folder.shared()))
321 fname = folder.name() + ' ('+folder.share_with().shortname()+')';
324 var action = 'javascript:oilsRptObject.find('+node.folderWindow.id+').draw();';
327 _debug('adding node '+fname+' id = ' + id + ' pid = '
328 +pid + ' parent = ' + folder.parent() + ' folder-window = ' + node.folderWindow.id );
331 if (folder.id() != oilsRptSearchResultFolderId) {
332 search_folders.push({id : folder.id(), pid: folder.parent(), fname : fname, depth : node.depth});
333 tree.addNode(id, pid, fname, action);
338 // search only applies to templates
339 if (type != 'template') return;
341 // Sort the list of search folders from top to bottom of the folder tree.
342 var depth_cache = {};
343 function add_folder(node) {
346 var label = node.fname;
347 // Left-pad the selector options by depth with U+2003 'EM SPACE'
348 // characters so the browser won't collapse the space.
349 for (var i = 0; i < node.depth; i++) label = ' ' + label;
352 DOM.template_search_folder_selector, -1, label, node.id);
354 var children = search_folders.filter(
355 function(f) { return (f.pid == node.id) });
356 dojo.forEach(children, add_folder);
359 // start with the parent-less folders
361 search_folders.filter(
362 function(f) {return f.pid == null}), add_folder);
366 oilsRptFolderManager.prototype.findNode = function(type, id) {
367 return oilsRptFolderNodeCache[type][id];
375 /* this only works if the initial folder tree has been drawn
376 if defined, "action" must be a function pointer that takes the
377 folder node as the param
379 eachFolder - optional callback called with each folder
380 node after its added to the folder list.
383 function oilsRptBuildFolder(type, node, treeVar, rootName, action, shared, eachFolder) {
384 removeChildren(node);
385 var tree = new SlimTree(node, treeVar);
386 this.treeId = oilsNextId();
387 tree.addNode(this.treeId, -1, rootName);
389 __someid = oilsNextId();
391 var cache = oilsRptFolderNodeCache[type];
393 for( var c in cache ) {
394 var tid = cache[c].treeId + __someid;
395 var pid = this.treeId;
396 var f = cache[c].folder;
398 if( !shared && (f.owner().id() != USER.id()) ) continue;
401 /* find the parent's tree id so we can latch on to it */
402 var pnode = cache[f.parent()];
403 var pid = pnode.treeId + __someid;
406 tree.addNode(tid, pid, f.name(), __setFolderCB(tree, tid, action, cache[c]));
408 if (eachFolder) eachFolder(cache[c]);
410 eval(treeVar +' = tree;');
413 function __setFolderCB(tree, id, action, node) {
416 act = function() { action( node ); };