]> git.evergreen-ils.org Git - working/Evergreen.git/blob - Open-ILS/web/reports/oils_rpt_report_editor.js
a36a820550f266574d45fa1dc10460d530f6035c
[working/Evergreen.git] / Open-ILS / web / reports / oils_rpt_report_editor.js
1 dojo.requireLocalization("openils.reports", "reports");
2
3 var rpt_strings = dojo.i18n.getLocalization("openils.reports", "reports");
4
5 oilsRptSetSubClass('oilsRptReportEditor', 'oilsRptObject');
6 var oilsRptReportEditorFolderTree;
7
8 function oilsRptReportEditor(rptObject, folderWindow) {
9         var tmpl = rptObject.templateObject;
10         var rpt = rptObject.reportObject;
11         this.folderWindow = folderWindow;
12
13         this.template = tmpl;
14         this.report = rpt;
15
16         appendClear(DOM.oils_rpt_report_editor_template_name, tmpl.name());
17         appendClear(DOM.oils_rpt_report_editor_template_creator, tmpl.owner().usrname());
18         appendClear(DOM.oils_rpt_report_editor_template_description, tmpl.description());
19
20     if (rptObject.def.version >= 4) {
21         if (URL = rptObject.def.doc_url) {
22             var link = DOM.oils_rpt_report_editor_template_doc_url;
23             link.innerHTML = URL;
24             if (typeof xulG == 'undefined') {
25                 link.setAttribute('href', URL);
26                 link.setAttribute('target', '_blank');
27             } else {
28                 link.onclick = function() {xulG.new_tab(URL); return false}
29             }
30         }
31     } else {
32         hideMe(DOM.oils_rpt_report_editor_template_doc_url_row);
33     }
34     
35     appendClear(DOM.oils_rpt_report_editor_cols,'');
36         iterate(rptObject.def.select, 
37                 function(i) {
38                         if(i)
39                                 DOM.oils_rpt_report_editor_cols.appendChild(text(i.alias));
40                 if (i.field_doc) {
41                                     DOM.oils_rpt_report_editor_cols.appendChild(
42                         elem('span', {'class':'oils_rpt_field_hint'}, i.field_doc));
43                 }
44                                 DOM.oils_rpt_report_editor_cols.appendChild(document.createElement('br'));
45                 }
46         );
47
48 /*
49 oils_rpt_editor_pivot_label
50 oils_rpt_editor_pivot_data
51 */
52
53     var hasAgg = false;
54     iterate(rptObject.def.select, 
55         function(i) {
56             if(OILS_RPT_TRANSFORMS[i.column.transform].aggregate) 
57                 hasAgg = true; 
58         }
59     );
60
61     while(DOM.oils_rpt_editor_pivot_label.getElementsByTagName('option').length > 1)
62         DOM.oils_rpt_editor_pivot_label.removeChild(DOM.oils_rpt_editor_pivot_label.lastChild);
63
64     while(DOM.oils_rpt_editor_pivot_data.lastChild)
65         DOM.oils_rpt_editor_pivot_data.removeChild(DOM.oils_rpt_editor_pivot_data.lastChild);
66
67     if(hasAgg) {
68         unHideMe(DOM.oils_rpt_editor_pivot_label_row);
69         unHideMe(DOM.oils_rpt_editor_pivot_data_row);
70
71         for(var i in rptObject.def.select) {
72             var col = rptObject.def.select[i];
73             if(OILS_RPT_TRANSFORMS[col.column.transform].aggregate) 
74                insertSelectorVal(DOM.oils_rpt_editor_pivot_data, -1, col.alias, parseInt(i)+1);
75             else
76                insertSelectorVal(DOM.oils_rpt_editor_pivot_label, -1, col.alias, parseInt(i)+1);
77         }
78
79     } else {
80         hideMe(DOM.oils_rpt_editor_pivot_label_row);
81         hideMe(DOM.oils_rpt_editor_pivot_data_row);
82     }
83  
84
85         if( rpt ) {
86                 DOM.oils_rpt_report_editor_name.value = rpt.name();
87                 DOM.oils_rpt_report_editor_description.value = rpt.description();
88         }
89
90         this.paramEditor = new oilsRptParamEditor(
91                 rptObject, DOM.oils_rpt_param_editor_tbody);
92         this.paramEditor.draw();
93
94         removeChildren(DOM.oils_rpt_report_editor_selected_folder);
95         removeChildren(DOM.oils_rpt_output_selected_folder);
96
97         var obj = this;
98         oilsRptBuildFolder(
99                 'report',
100                 DOM.oils_rpt_report_editor_dest_folder,
101                 'oilsRptReportEditorFolderTree',
102                 rpt_strings.REPORT_EDITOR_REPORT_FOLDERS,
103                 function(node) { 
104                         appendClear(DOM.oils_rpt_report_editor_selected_folder, node.folder.name());
105                         obj.selectedFolder = node; });
106
107
108         oilsRptBuildFolder(
109                 'output',
110                 DOM.oils_rpt_output_dest_folder,
111                 'oilsRptReportEditorOutputTree',
112                 rpt_strings.REPORT_EDITOR_OUTPUT_FOLDERS,
113                 function(node) { 
114                         appendClear(DOM.oils_rpt_output_selected_folder, node.folder.name());
115                         obj.selectedOutputFolder = node; });
116
117
118         var obj = this;
119         DOM.oils_rpt_report_editor_save.onclick = function(){obj.save();}
120         DOM.oils_rpt_param_editor_sched_email.value = USER.email();
121         DOM.oils_rpt_param_editor_sched_start_date.value = mkYearMonDay();
122
123         _debug("fleshing template:\n" + tmpl.name() + '\n' + formatJSON(tmpl.data()));
124 }
125
126
127 oilsRptReportEditor.prototype.save = function() {
128         var report = new rr();
129
130         if(!this.selectedFolder) 
131                 return alert(rpt_strings.REPORT_EDITOR_PROVIDE_FOLDER_ALERT);
132
133         if(!DOM.oils_rpt_report_editor_name.value)
134                 return alert(rpt_strings.REPORT_EDITOR_ENTER_NAME_ALERT);
135
136         report.owner( USER.id() );
137         report.template( this.template.id() );
138         report.folder( this.selectedFolder.folder.id() );
139         report.name( DOM.oils_rpt_report_editor_name.value );
140         report.description( DOM.oils_rpt_report_editor_desc.value );
141         report.recur(this.paramEditor.recur());
142         report.recurrence(this.paramEditor.recurInterval());
143
144
145         /* collect the param data */
146         var data = {};
147         for( var p in this.paramEditor.params ) {
148                 var par = this.paramEditor.params[p];
149                 _debug("adding report param "+par.key+" to report data");
150                 var val = par.widget.getValue();
151
152                 if(!val || val.length == 0 )
153                         return alertId('oils_rpt_empty_param');
154
155                 if( typeof val == 'object') {
156                         for( var i = i; i < val.length; i++ ) {
157                                 _debug("looking at widget value" + val[i]);
158                                 if( val[i] == '' || val[i] == null ) 
159                                         return alertId('oils_rpt_empty_param');
160                         }
161                 }
162
163                 data[par.key] = val;
164         }
165
166     if(getSelectorVal(DOM.oils_rpt_editor_pivot_data)) {
167         data.__pivot_label = getSelectorVal(DOM.oils_rpt_editor_pivot_label);
168         data.__pivot_data = getSelectorVal(DOM.oils_rpt_editor_pivot_data);
169     }
170
171
172         data = js2JSON(data);
173         _debug("complete report data = "+data);
174         report.data(data);
175
176         _debug("Built report:\n"+js2JSON(report));
177
178
179         var time;
180         if( DOM.oils_rpt_report_editor_run_now.checked ) {
181                 DOM.oils_rpt_report_editor_run_now.checked = false;
182                 time = 'now';
183
184         } else {
185
186                 var dt = DOM.oils_rpt_param_editor_sched_start_date.value;
187                 if(!dt || !dt.match(/^\d{4}-\d{2}-\d{2}$/) ) {
188                         /* for now.. make this better in the future */
189                         alert(rpt_strings.REPORT_EDITOR_INVALID_DATE_ALERT);
190                         return;
191                 }
192                 var hour = getSelectorVal(DOM.oils_rpt_param_editor_sched_start_hour);
193                 time = dt +'T'+hour+':00';
194                 _debug("built run_time "+time);
195         }
196
197         if(!this.selectedOutputFolder) 
198                 return alert(rpt_strings.REPORT_EDITOR_PROVIDE_OUTPUT_ALERT);
199
200         var schedule = new rs();
201         schedule.folder(this.selectedOutputFolder.folder.id());
202         schedule.email(DOM.oils_rpt_param_editor_sched_email.value);
203         schedule.run_time(time);
204         schedule.runner(USER.id());
205
206         schedule.excel_format((DOM.oils_rpt_format_excel.checked) ? 't' : 'f');
207         schedule.html_format((DOM.oils_rpt_format_html.checked) ? 't' : 'f');
208         schedule.csv_format((DOM.oils_rpt_format_csv.checked) ? 't' : 'f');
209         //schedule.chart_pie((DOM.oils_rpt_format_chart_pie.checked) ? 't' : 'f');
210         schedule.chart_bar((DOM.oils_rpt_format_chart_bar.checked) ? 't' : 'f');
211         schedule.chart_line((DOM.oils_rpt_format_chart_line.checked) ? 't' : 'f');
212
213
214         debugFMObject(report);
215         debugFMObject(schedule);
216
217         //return;
218
219         var obj = this;
220     var folderReq = new Request(OILS_RPT_REPORT_EXISTS, SESSION, report);
221     folderReq.callback(
222         function(r1) {
223             if(r1.getResultObject() == 1) {
224                 alertId('oils_rpt_report_exists');
225                 return;
226             } else {
227                 var req = new Request(OILS_RPT_CREATE_REPORT, SESSION, report, schedule );
228                 req.callback(
229                     function(r) {
230                         var res = r.getResultObject();
231                         if(checkILSEvent(res)) {
232                             alertILSEvent(res);
233                         } else {
234                             if( res && res != '0' ) {
235                                 oilsRptAlertSuccess();
236                                 oilsRptCurrentFolderManager.draw();
237                                 obj.folderWindow.draw();
238                             }
239                         }
240                     }
241                 );
242                 req.send();
243             }
244         }
245     );
246     folderReq.send();
247 }
248
249