added report description creation at run-time and so much more
authorerickson <erickson@dcc99617-32d9-48b4-a31d-7c20da2025e4>
Sun, 1 Oct 2006 21:19:54 +0000 (21:19 +0000)
committererickson <erickson@dcc99617-32d9-48b4-a31d-7c20da2025e4>
Sun, 1 Oct 2006 21:19:54 +0000 (21:19 +0000)
git-svn-id: svn://svn.open-ils.org/ILS/trunk@6318 dcc99617-32d9-48b4-a31d-7c20da2025e4

Open-ILS/src/perlmods/OpenILS/Application/Reporter.pm
Open-ILS/web/reports/oils_rpt_editor.xhtml
Open-ILS/web/reports/oils_rpt_folder_manager.xhtml
Open-ILS/web/reports/oils_rpt_folder_window.js
Open-ILS/web/reports/oils_rpt_folders.js
Open-ILS/web/reports/oils_rpt_param_editor.js
Open-ILS/web/reports/oils_rpt_param_editor.xhtml
Open-ILS/web/reports/oils_rpt_report_editor.js
Open-ILS/web/reports/oils_rpt_utils.js
Open-ILS/web/reports/oils_rpt_vars.js
Open-ILS/web/reports/oils_rpt_widget.js

index f75789c..30e54a5 100644 (file)
@@ -44,6 +44,7 @@ sub retrieve_visible_folders {
 
        my $class = 'rrf';
        $class = 'rtf' if $type eq 'template';
+       $class = 'rof' if $type eq 'output';
        my $flesh = {flesh => 1,flesh_fields => { $class => ['owner', 'share_with']}};
 
        my $meth = "search_reporter_${type}_folder";
@@ -108,19 +109,36 @@ __PACKAGE__->register_method(
        api_name => 'open-ils.reporter.report.create',
        method => 'create_report');
 sub create_report {
-       my( $self, $conn, $auth, $report ) = @_;
+       my( $self, $conn, $auth, $report, $schedule ) = @_;
        my $e = new_rstore_editor(authtoken=>$auth, xact=>1);
        return $e->die_event unless $e->checkauth;
        return $e->die_event unless $e->allowed('RUN_REPORTS');
        $report->owner($e->requestor->id);
-       my $tmpl = $e->create_reporter_report($report)
+       my $rpt = $e->create_reporter_report($report)
                or return $e->die_event;
+       $schedule->report($rpt->id);
+       $schedule->runner($e->requestor->id);
+       $e->create_reporter_schedule($schedule) or return $e->die_event;
        $e->commit;
-       return $tmpl;
+       return $rpt;
 }
 
 
 __PACKAGE__->register_method(
+       api_name => 'open-ils.scheduleer.schedule.create',
+       method => 'create_schedule');
+sub create_schedule {
+       my( $self, $conn, $auth, $schedule ) = @_;
+       my $e = new_rstore_editor(authtoken=>$auth, xact=>1);
+       return $e->die_event unless $e->checkauth;
+       return $e->die_event unless $e->allowed('RUN_REPORTS');
+       my $sched = $e->create_reporter_schedule($schedule)
+               or return $e->die_event;
+       $e->commit;
+       return $sched;
+}
+
+__PACKAGE__->register_method(
        api_name => 'open-ils.reporter.template.retrieve',
        method => 'retrieve_template');
 sub retrieve_template {
@@ -167,6 +185,27 @@ sub update_template {
 
 
 __PACKAGE__->register_method(
+       api_name => 'open-ils.reporter.report.update',
+       method => 'update_report');
+sub update_report {
+       my( $self, $conn, $auth, $report ) = @_;
+       my $e = new_rstore_editor(authtoken=>$auth, xact=>1);
+       return $e->die_event unless $e->checkauth;
+       return $e->die_event unless $e->allowed('RUN_REPORTS');
+       my $r = $e->retrieve_reporter_report($report->id)
+               or return $e->die_event;
+       if( $r->owner ne $e->requestor->id ) {
+               $e->rollback;
+               return 0;
+       }
+       $e->update_reporter_report($report)
+               or return $e->die_event;
+       $e->commit;
+       return 1;
+}
+
+
+__PACKAGE__->register_method(
        api_name => 'open-ils.reporter.folder.update',
        method => 'update_folder');
 sub update_folder {
index 8c5fc0f..09beffd 100644 (file)
@@ -47,9 +47,9 @@
                                                        <tr>
                                                                <th>Run on:</th>
                                                                <td>
-                                                                       <input name="sched_start_date" type="text" size="10"/>
+                                                                       <input id="oils_rpt_param_editor_sched_start_date" type="text" size="10"/>
                                                                                at
-                                                                       <select name="sched_start_hour">
+                                                                       <select id='oils_rpt_param_editor_sched_start_hour'>
                                                                                <option value="00:00">Midnight</option>
                                                                                <option value="01:00">1 AM</option>
                                                                                <option value="02:00">2 AM</option>
@@ -79,7 +79,7 @@
                                                        </tr>
                                                        <tr>
                                                                <th>Send completion notification to this Email address:</th>
-                                                               <td><input name="sched_email" type="text" size="25"/></td>
+                                                               <td><input id="oils_rpt_param_editor_sched_email" type="text" size="25"/></td>
                                                        </tr>
                                                        <tr>
                                                                <th>Choose a folder to store this report's output: </th>
index e895b1b..b1a8203 100644 (file)
@@ -5,6 +5,9 @@
                <option value='create_sub_folder'>Create a new sub-folder</option>
                <option id='oils_rpt_folder_manager_share_opt' value='share'>Share this folder</option>
                <option id='oils_rpt_folder_manager_unshare_opt' value='unshare'>Hide (un-share) this folder</option>
+
+               <option class='hide_me'>Disable recurrance</option><!-- XXX -->
+
        </select>
        <input id='oils_rpt_folder_manager_actions_submit' type='submit' value='Go'/>
 
index 9874dea..3f01eb4 100644 (file)
@@ -15,7 +15,6 @@ function oilsRptFetchTemplate(id) {
 oilsRptSetSubClass('oilsRptFolderWindow', 'oilsRptObject');
 function oilsRptFolderWindow(type, folderId) { 
        this.init();
-       _debug("initted folderwindow with id "+this.id);
        var node = oilsRptCurrentFolderManager.findNode(type, folderId);
        this.selector = DOM.oils_rpt_folder_contents_selector;
        this.folderNode = node;
@@ -24,6 +23,13 @@ function oilsRptFolderWindow(type, folderId) {
 
 
 oilsRptFolderWindow.prototype.draw = function() {
+
+       _debug(this.folderNode.folder.owner().id() + ' : ' + USER.id());
+
+       if( this.folderNode.folder.owner().id() != USER.id() ) 
+               hideMe(DOM.oils_rpt_folder_window_contents_new_template.parentNode);
+       else unHideMe(DOM.oils_rpt_folder_window_contents_new_template.parentNode);
+
        unHideMe(DOM.oils_rpt_folder_window_contents_div);
        hideMe(DOM.oils_rpt_folder_manager_div);
        hideMe(DOM.oils_rpt_top_folder);
@@ -260,8 +266,6 @@ oilsRptFolderWindow.prototype.setFolderEditActions = function() {
                if( folder.shared() == 't' )
                        folder.share_with( obj.myOrgSelector.getValue() );
 
-               _debug("Creating new folder: " + js2JSON(folder));
-
                if(confirm(DOM.oils_rpt_folder_manager_new_confirm.innerHTML + ' "'+folder.name()+'"')) {
                        oilsRptCreateFolder(folder, obj.type,
                                function(success) {
index fb7c8b0..733c656 100644 (file)
@@ -195,8 +195,10 @@ oilsRptFolderManager.prototype.drawFolders = function(type, folders) {
                var node = { folder : folder, treeId : id };
                oilsRptFolderNodeCache[type][folder.id()] = node;
                node.folderWindow = new oilsRptFolderWindow(type, folder.id())
+               /*
                _debug("creating folder node for "+folder.name()+" : id = "+
                        folder.id()+' treeId = '+id + ' window id = ' + node.folderWindow.id);
+                       */
        }
 
 
@@ -282,8 +284,10 @@ oilsRptFolderManager.prototype.drawFolders = function(type, folders) {
                }
 
                var action = 'javascript:oilsRptObject.find('+node.folderWindow.id+').draw();';
+               /*
                _debug('adding node '+fname+' id = ' + id + ' pid = '
                        +pid + ' parent = ' + folder.parent() + ' folder-window = ' + node.folderWindow.id );
+                       */
 
                tree.addNode(id, pid, fname, action);
                tree.close(pid);
index 4a780c8..e7301fd 100644 (file)
@@ -5,6 +5,17 @@ function oilsRptParamEditor(report, tbody) {
 }
 
 
+oilsRptParamEditor.prototype.recur = function() {
+       var cb = $n(DOM.oils_rpt_recur_editor_table,'oils_rpt_recur');
+       return (cb.checked) ? 't' : 'f';
+}
+
+oilsRptParamEditor.prototype.recurInterval = function() {
+       var count = getSelectorVal($n(DOM.oils_rpt_recur_editor_table,'oils_rpt_recur_count'));
+       var intvl = getSelectorVal($n(DOM.oils_rpt_recur_editor_table,'oils_rpt_recur_interval_type'));
+       return count+''+intvl;
+}
+
 oilsRptParamEditor.prototype.draw = function() {
        var params = this.report.gatherParams();
        this.params = params;
@@ -37,13 +48,12 @@ oilsRptParamEditor.prototype.buildWidget = function(param, node) {
        switch(param.op) {
                case 'in':
                case 'not in':
-
                        /* we have to special case org selection for now, 
                                until we have generic object fetch support */
                        if( cls == 'aou' ) {
                                return new oilsRptOrgMultiSelect({node:node});
                        } else {
-                               return new oilsRptOrgMultiSelect({node:node});
+                               return new oilsRptInputMultiWidget({node:node});
                        }
 
                default:
index eed4519..c56ef61 100644 (file)
@@ -39,7 +39,9 @@
                                                <option>24</option>
                                        </select>
                                        <select name="oils_rpt_recur_interval_type">
+                                               <!--
                                                <option value="hours">Hour(s)</option>
+                                               -->
                                                <option value="days">Day(s)</option>
                                                <option value="weeks">Week(s)</option>
                                                <option value="months">Month(s)</option>
index 54aa69a..5a84843 100644 (file)
@@ -31,35 +31,67 @@ function oilsRptReportEditor(rptObject, folderWindow) {
                        obj.selectedFolder = node; });
 
 
+       oilsRptBuildFolder(
+               'output',
+               DOM.oils_rpt_output_dest_folder,
+               'oilsRptReportEditorOutputTree',
+               'Output Folders',
+               function(node) { 
+                       appendClear(DOM.oils_rpt_output_selected_folder, node.folder.name());
+                       obj.selectedOutputFolder = node; });
+
+
        var obj = this;
        DOM.oils_rpt_report_editor_save.onclick = function(){obj.save();}
+       DOM.oils_rpt_param_editor_sched_email.value = USER.email();
+       DOM.oils_rpt_param_editor_sched_start_date.value = mkYearMonDay();
 }
 
 
 oilsRptReportEditor.prototype.save = function() {
        var report = new rr();
+
        report.owner( USER.id() );
        report.template( this.template.id() );
        report.folder( this.selectedFolder.folder.id() );
        report.name( DOM.oils_rpt_report_editor_name.value );
        report.description( DOM.oils_rpt_report_editor_desc.value );
+       report.recur(this.paramEditor.recur());
+       report.recurance(this.paramEditor.recurInterval());
 
-       report.recur('f');
+       /* collect the param data */
        var data = {};
-
        for( var p in this.paramEditor.params ) {
                var par = this.paramEditor.params[p];
                _debug("adding report param "+par.key+" to report data");
                data[par.key] = par.widget.getValue();
        }
-       data = js2JSON(data);
 
+       data = js2JSON(data);
        _debug("complete report data = "+data);
        report.data(data);
 
-       debug("Built report:\n"+js2JSON(report));
+       _debug("Built report:\n"+js2JSON(report));
+
+
+       var dt = DOM.oils_rpt_param_editor_sched_start_date.value;
+       if(!dt || !dt.match(/^\d{4}-\d{2}-\d{2}$/) ) {
+               /* for now.. make this better in the future */
+               alert('invalid start date -  YYYY-MM-DD');
+               return;
+       }
+       var hour = getSelectorVal(DOM.oils_rpt_param_editor_sched_start_hour);
+       var time = dt +'T'+hour+':00';
+       _debug("built run_time "+time);
 
-       var req = new Request(OILS_RPT_CREATE_REPORT, SESSION, report );
+       var schedule = new rs();
+       schedule.folder(this.selectedOutputFolder.folder.id());
+       schedule.email(DOM.oils_rpt_param_editor_sched_email.value);
+       schedule.run_time(time);
+
+       _debug("Built schedule:\n"+js2JSON(schedule));
+
+       var req = new Request(OILS_RPT_CREATE_REPORT, SESSION, report, schedule );
        req.callback(
                function(r) {
                        var res = r.getResultObject();
@@ -70,3 +102,4 @@ oilsRptReportEditor.prototype.save = function() {
        req.send();
 }
 
+
index 5c128a7..ddce821 100644 (file)
@@ -239,7 +239,7 @@ function oilsRptSetSubClass(cls, parent) {
 
 function oilsRptUpdateFolder(folder, type, callback) {
 
-       _debug("updating folder " + folder.id() + ' : ' + folder.name());
+       _debug("updating folder " + js2JSON(folder));
 
        var req = new Request(OILS_RPT_UPDATE_FOLDER, SESSION, type, folder);
        if( callback ) {
@@ -258,7 +258,7 @@ function oilsRptUpdateFolder(folder, type, callback) {
 }
 
 function oilsRptCreateFolder(folder, type, callback) {
-       _debug("creating folder "+ folder.name());
+       _debug("creating folder "+ js2JSON(folder));
        var req = new Request(OILS_RPT_CREATE_FOLDER, SESSION, type, folder);
        if( callback ) {
                req.callback( 
index 6cdb090..acc28f2 100644 (file)
@@ -71,6 +71,9 @@ var OILS_RPT_DELETE_REPORT                    = 'open-ils.reporter:open-ils.reporter.report.delet
 var OILS_RPT_TEMPLATE_HAS_RPTS = 'open-ils.reporter:open-ils.reporter.template_has_reports';
 var OILS_RPT_CREATE_REPORT                     = 'open-ils.reporter:open-ils.reporter.report.create';
 var OILS_RPT_CREATE_TEMPLATE           = 'open-ils.reporter:open-ils.reporter.template.create';
+var OILS_RPT_CREATE_SCHEDULE           = 'open-ils.reporter:open-ils.reporter.schedule.create';
+var OILS_RPT_UPDATE_REPORT                     = 'open-ils.reporter:open-ils.reporter.report.update';
+var OILS_RPT_UPDATE_TEMPLATE           = 'open-ils.reporter:open-ils.reporter.template.update';
 
 var oilsRptCurrentFolderManager;
 
index d86f8ae..201099e 100644 (file)
@@ -26,6 +26,7 @@ oilsRptWidget.prototype.draw = function() {
 
 /* ----------------------------------------------------------- */
 
+/* multiple input boxes */
 oilsRptSetSubClass('oilsRptMultiInputWidget', 'oilsRptWidget');
 function oilsRptMultiInputWidget(args) {
        this.initInputWidget(args);
@@ -99,7 +100,6 @@ oilsRptMultiWidget.prototype.addItem = function(name, val) {
                if( this.dest.options[i].value == val ) 
                        return;
        }
-
        insertSelectorVal(this.dest, -1, name, val);
 }
 
@@ -129,13 +129,9 @@ oilsRptInputMultiWidget.prototype.initInputMultiWidget = function(args) {
        this.setSource(elem('input',{type:'text'}));
 }
 
-/*
-oilsRptInputMultiWidget.prototype.addItem = function(name, val) {
-       //this.addItem(name, val);
-       this.source.value = "";
-       this.source.focus();
+oilsRptInputMultiWidget.prototype.draw = function() {
+       this.drawMultiWidget();
 }
-*/
 
 oilsRptInputMultiWidget.prototype.getSourceCollector = function() {
        var obj = this;
@@ -144,6 +140,7 @@ oilsRptInputMultiWidget.prototype.getSourceCollector = function() {
        }
 }
 
+
 /* ----------------------------------------------------------- */
 
 oilsRptSetSubClass('oilsRptSelectorMultiWidget', 'oilsRptMultiWidget');
@@ -242,21 +239,7 @@ oilsRptOrgMultiSelect.prototype.draw = function(org) {
        this.drawMultiWidget();
 }
 
-/*
-oilsRptOrgMultiSelectWidget.prototype.getSourceCollector = function() {
-       var obj = this;
-       return function() {
-               for( var i = 0; i < obj.source.options.length; i++ )
-                       obj.addItem(obj.source.options.name, obj.source.options.value);
-       }
-}
-*/
 
-/*
-oilsRptOrgMultiSelect.prototype.getValue = function() {
-       return getSelectedList(this.select);
-}
-*/