JBAS-134 patron event log rollback to prev. version
authorBill Erickson <berickxx@gmail.com>
Wed, 29 Oct 2014 21:09:48 +0000 (17:09 -0400)
committerBill Erickson <berickxx@gmail.com>
Thu, 21 Mar 2019 19:46:23 +0000 (15:46 -0400)
    Cross-port: 638c6cd

Conflicts:
Open-ILS/xul/staff_client/server/patron/display.js

Open-ILS/xul/staff_client/chrome/content/main/constants.js
Open-ILS/xul/staff_client/server/patron/display.js
Open-ILS/xul/staff_client/server/patron/trigger_events.js [new file with mode: 0644]
Open-ILS/xul/staff_client/server/patron/trigger_events.xul [new file with mode: 0644]

index 3d8a78d..f1c5ada 100644 (file)
@@ -494,6 +494,7 @@ var urls = {
     'XUL_STAT_CAT_EDIT' : 'oils://remote/xul/server/admin/stat_cat_editor.xhtml',
     'XUL_SURVEY_WIZARD' : 'chrome://open_ils_staff_client/content/admin/survey_wizard.xul',
     'XUL_TIMESTAMP_DIALOG' : 'oils://remote/xul/server/util/timestamp.xul',
+    'XUL_TRIGGER_EVENTS' : 'oils://remote/xul/server/patron/trigger_events.xul',
     'XUL_TOOLBAR_CONFIG' : 'oils://remote/xul/server/admin/toolbar.xul',
     'XUL_USER_BUCKETS' : 'oils://remote/xul/server/patron/user_buckets.xul',
     'XUL_VERIFY_CREDENTIALS' : 'oils://remote/xul/server/main/verify_credentials.xul',
index 04a9dd7..bcc6bcb 100644 (file)
@@ -335,6 +335,7 @@ patron.display.prototype = {
                             );
                         }
                     ],
+                    /* HTML version
                     'cmd_patron_info_triggered_events' : [
                         ['command'],
                         function(ev) {
@@ -349,6 +350,19 @@ patron.display.prototype = {
                             );
                         }
                     ],
+                    */
+                    'cmd_patron_info_triggered_events' : [
+                        ['command'],
+                        function(ev) {
+                            obj.right_deck.set_iframe(
+                                urls.XUL_TRIGGER_EVENTS,
+                                {},
+                                {
+                                    'patron_id' : obj.patron.id()
+                                }
+                            );
+                        }
+                    ],
                     'cmd_patron_message_center' : [
                         ['command'],
                         function(ev) {
diff --git a/Open-ILS/xul/staff_client/server/patron/trigger_events.js b/Open-ILS/xul/staff_client/server/patron/trigger_events.js
new file mode 100644 (file)
index 0000000..29c3fa2
--- /dev/null
@@ -0,0 +1,234 @@
+var list; var error; var net; var rows;
+
+function $(id) { return document.getElementById(id); }
+
+//// parent interfaces often call these
+function default_focus() { $('atev_list').focus(); }
+function refresh() { populate_list(); }
+////
+
+function trigger_event_init() {
+    try {
+        netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect"); 
+
+        commonStrings = $('commonStrings');
+        patronStrings = $('patronStrings');
+
+        if (typeof JSAN == 'undefined') {
+            throw(
+                commonStrings.getString('common.jsan.missing')
+            );
+        }
+
+        JSAN.errorLevel = "die"; // none, warn, or die
+        JSAN.addRepository('..');
+
+        JSAN.use('OpenILS.data'); data = new OpenILS.data(); data.stash_retrieve();
+        XML_HTTP_SERVER = data.server_unadorned;
+
+        JSAN.use('util.error'); error = new util.error();
+        JSAN.use('util.network'); net = new util.network();
+        JSAN.use('patron.util'); 
+        JSAN.use('util.list'); 
+        JSAN.use('util.functional'); 
+        JSAN.use('util.widgets');
+
+        dojo.require('openils.Util');
+
+        init_list();
+        $('list_actions').appendChild( list.render_list_actions() );
+        list.set_list_actions();
+        $('cmd_cancel_event').addEventListener('command', gen_event_handler('cancel'), false);
+        $('cmd_reset_event').addEventListener('command', gen_event_handler('reset'), false);
+        $('circ').addEventListener('command', function() { populate_list(); }, false);
+        $('ahr').addEventListener('command', function() { populate_list(); }, false);
+        $('pending').addEventListener('command', function() { populate_list(); }, false);
+        $('complete').addEventListener('command', function() { populate_list(); }, false);
+        $('error').addEventListener('command', function() { populate_list(); }, false);
+        populate_list();
+        default_focus();
+
+    } catch(E) {
+        var err_prefix = 'trigger_events.js -> trigger_event_init() : ';
+        if (error) error.standard_unexpected_error_alert(err_prefix,E); else alert(err_prefix + E);
+    }
+}
+
+function gen_event_handler(method) { // cancel or reset?
+    return function(ev) {
+        try {
+            var sel = list.retrieve_selection();
+            var ids = util.functional.map_list( sel, function(o) { return JSON2js( o.getAttribute('retrieve_id') ); } );
+
+            var pm = $('progress'); pm.value = 0; pm.hidden = false;
+            var idx = -1;
+
+            var i = method == 'cancel' ? 'FM_ATEV_CANCEL' : 'FM_ATEV_RESET';
+            fieldmapper.standardRequest(
+                [ api[i].app, api[i].method ],
+                {   async: true,
+                    params: [ses(), ids],
+                    onresponse: function(r) {
+                        try {
+                            idx++; pm.value = Number( pm.value ) + 100/ids.length;
+                            var result = openils.Util.readResponse(r);
+                            if (typeof result.ilsevent != 'undefined') { throw(result); }
+                        } catch(E) {
+                            error.standard_unexpected_error_alert('In patron/trigger_events.js, handle_'+i+'_event onresponse.',E);
+                        }
+                    },
+                    onerror: function(r) {
+                        try {
+                            var result = openils.Util.readResponse(r);
+                            throw(result);
+                        } catch(E) {
+                            error.standard_unexpected_error_alert('In patron/trigger_events.js, handle_'+i+'_event onerror.',E);
+                        }
+                        pm.hidden = true; pm.value = 0; populate_list();
+                    },
+                    oncomplete: function(r) {
+                        try {
+                            var result = openils.Util.readResponse(r);
+                        } catch(E) {
+                            error.standard_unexpected_error_alert('In patron/trigger_events.js, handle_'+i+'_event oncomplete.',E);
+                        }
+                        pm.hidden = true; pm.value = 0; populate_list();
+                    }
+                }
+            );
+
+        } catch(E) {
+            alert('Error in patron/trigger_events.js, handle_???_event(): ' + E);
+        }
+    };
+}
+
+function init_list() {
+    try {
+
+        list = new util.list( 'atev_list' );
+        list.init( 
+            {
+                'columns' : [].concat(
+                    list.fm_columns('atev', {
+                        'atev_target' : { 'render' : function(my) { return fieldmapper.IDL.fmclasses[my.atev.target().classname].label; } }
+                    })
+                ).concat(
+                    list.fm_columns('atevdef', { 
+                        '*' : { 'expanded_label' : true, 'hidden' : true }, 
+                        'atevdef_name' : { 'hidden' : false }, 
+                        'atevdef_reactor' : { 'render' : function(my) { return my.atevdef.reactor().id(); } }, 
+                        'atevdef_validator' : { 'render' : function(my) { return my.atevdef.validator().id(); } } 
+                    })
+                ).concat(
+                    list.fm_columns('atreact', { 
+                        '*' : { 'expanded_label' : true, 'hidden' : true }, 
+                        'atreact_module' : { 'hidden' : false } 
+                    })
+                ).concat(
+                    list.fm_columns('atval', { 
+                        '*' : { 'expanded_label' : true, 'hidden' : true }, 
+                        'atval_module' : { 'hidden' : false } 
+                    })
+                ).concat(
+                    list.fm_columns('circ', { 
+                        '*' : { 'expanded_label' : true, 'hidden' : true }, 
+                        'circ_due_date' : { 'hidden' : false } 
+                    })
+                ).concat(
+                    list.fm_columns('acp', { 
+                        '*' : { 'expanded_label' : true, 'hidden' : true }, 
+                        'acp_barcode' : { 'hidden' : false } 
+                    })
+                ).concat(
+                    list.fm_columns('ahr', { 
+                        '*' : { 'expanded_label' : true, 'hidden' : true },
+                        'ahr_id' : { 'hidden' : false } 
+                    })
+                ),
+                'retrieve_row' : retrieve_row,
+                'on_select' : handle_selection
+            }
+        );
+
+    } catch(E) {
+        var err_prefix = 'trigger_events.js -> init_list() : ';
+        if (error) error.standard_unexpected_error_alert(err_prefix,E); else alert(err_prefix + E);
+    }
+}
+
+function retrieve_row(params) { // callback function for fleshing rows in a list
+    params.treeitem_node.setAttribute('retrieve_id',params.row.my.atev.id()); 
+    params.on_retrieve(params.row); 
+    return params.row; 
+}
+
+function handle_selection(ev) { // handler for list row selection event
+    var sel = list.retrieve_selection();
+    if (sel.length > 0) {
+        $('cmd_cancel_event').setAttribute('disabled','false');
+        $('cmd_reset_event').setAttribute('disabled','false');
+    } else {
+        $('cmd_cancel_event').setAttribute('disabled','true');
+        $('cmd_reset_event').setAttribute('disabled','true');
+    }
+};
+
+function populate_list() {
+    try {
+
+        $('circ').disabled = true; $('ahr').disabled = true; $('pending').disabled = true; $('complete').disabled = true; $('error').disabled = true;
+
+        rows = {};
+        list.clear();
+
+        function onResponse(r) {
+            var evt = openils.Util.readResponse(r);
+            var row_params = {
+                'row' : {
+                    'my' : {
+                        'atev' : evt,
+                        'atevdef' : evt.event_def(),
+                        'atreact' : evt.event_def().reactor(),
+                        'atval' : evt.event_def().validator(),
+                        'circ' : evt.target().classname == 'circ' ? evt.target() : null,
+                        'ahr' : evt.target().classname == 'ahr' ? evt.target() : null,
+                        'acp' : evt.target().classname == 'circ' ? evt.target().target_copy() : evt.target().current_copy()
+                    }
+                }
+            };
+            rows[ evt.id() ] = list.append( row_params );
+
+        }
+
+        function onError(r) {
+            var evt = openils.Util.readResponse(r);
+            alert('error, evt = ' + js2JSON(evt));
+            $('circ').disabled = false; $('ahr').disabled = false; $('pending').disabled = false; $('complete').disabled = false; $('error').disabled = false;
+        }
+
+        var method = $('circ').checked ? 'FM_ATEV_APROPOS_CIRC' : 'FM_ATEV_APROPOS_AHR';
+        if (xul_param('copy_id')) { method += '_VIA_COPY'; }
+
+        var filter = {"event":{"state":"complete"}, "order_by":[{"class":"atev", "field":"run_time", "direction":"desc"}]};
+
+        if ($('pending').checked) { filter.event.state = 'pending'; filter.order_by[0].direction = 'asc'; }
+        if ($('error').checked) { filter.event.state = 'error'; }
+
+        fieldmapper.standardRequest(
+            [api[method].app, api[method].method ],
+            {   async: true,
+                params: [ses(), xul_param('copy_id') || xul_param('patron_id'), filter],
+                onresponse : onResponse,
+                onerror : onError,
+                oncomplete : function() {
+                    $('circ').disabled = false; $('ahr').disabled = false; $('pending').disabled = false; $('complete').disabled = false; $('error').disabled = false;
+                }
+            }
+        );
+
+    } catch(E) {
+        var err_prefix = 'trigger_events.js -> populate_list() : ';
+        if (error) error.standard_unexpected_error_alert(err_prefix,E); else alert(err_prefix + E);
+    }
+}
diff --git a/Open-ILS/xul/staff_client/server/patron/trigger_events.xul b/Open-ILS/xul/staff_client/server/patron/trigger_events.xul
new file mode 100644 (file)
index 0000000..368d80c
--- /dev/null
@@ -0,0 +1,88 @@
+<?xml version="1.0"?>
+<!-- Application: Evergreen Staff Client -->
+<!-- Screen: Cancel/Reset Action::Trigger Events for Patron -->
+
+<!-- ///////////////////////////////////////////////////////////////////////////////////////////////////////////// -->
+<!-- PRESENTATION -->
+<?xml-stylesheet href="chrome://global/skin/" type="text/css"?>
+<?xml-stylesheet href="/xul/server/skin/global.css" type="text/css"?>
+
+<!-- ///////////////////////////////////////////////////////////////////////////////////////////////////////////// -->
+<!-- LOCALIZATION -->
+<!DOCTYPE window PUBLIC "" ""[
+    <!--#include virtual="/opac/locale/${locale}/lang.dtd"-->
+]>
+
+<!-- ///////////////////////////////////////////////////////////////////////////////////////////////////////////// -->
+<!-- OVERLAYS -->
+<?xul-overlay href="/xul/server/OpenILS/util_overlay.xul"?>
+
+<window id="trigger_event_win" onload="try { font_helper(); persist_helper(); trigger_event_init(); } catch(E) { alert(E); }" active="true"
+    xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
+
+    <!-- ///////////////////////////////////////////////////////////////////////////////////////////////////////////// -->
+    <!-- BEHAVIOR -->
+    <script type="text/javascript">var myPackageDir = 'open_ils_staff_client'; var IAMXUL = true;</script>
+    <scripts id="openils_util_scripts"/>
+
+    <script type="text/javascript" src="/xul/server/main/JSAN.js"/>
+    <script type="text/javascript" src="trigger_events.js"/>
+
+    <messagecatalog id="patronStrings" src="/xul/server/locale/<!--#echo var='locale'-->/patron.properties" />
+
+    <commandset id="trigger_event_cmds">
+        <command id="cmd_cancel_event" disabled="true"/>
+        <command id="cmd_reset_event" disabled="true"/>
+    </commandset>
+
+    <!-- ///////////////////////////////////////////////////////////////////////////////////////////////////////////// -->
+    <!-- CONTENT -->
+    <groupbox id="trigger_event_groupbox" flex="1" class="my_overflow">
+        <caption id="trigger_event_caption" label="&staff.patron_display.trigger_event.caption;"/>
+        <vbox flex="0">
+            <hbox flex="1">
+                <toolbar id="filters" flex="1">
+                    <toolbarbutton id="circ" label="&staff.patron_display.trigger_event.radio_button.circ_events.label;" accesskey="&staff.patron_display.trigger_event.radio_button.circ_events.accesskey;" 
+                        type="radio" group="atev_type" checked="true" style="-moz-user-focus: normal" oils_persist="checked" oils_persist_no_poke="true"
+                        oncommand="oils_persist(document.getElementById('ahr'));" />
+                    <toolbarbutton id="ahr" label="&staff.patron_display.trigger_event.radio_button.hold_events.label;" accesskey="&staff.patron_display.trigger_event.radio_button.hold_events.accesskey;" 
+                        type="radio" group="atev_type" style="-moz-user-focus: normal" oils_persist="checked" oils_persist_no_poke="true"
+                        oncommand="oils_persist(document.getElementById('circ'));" />
+                    <toolbarseparator/>
+                    <toolbarbutton id="pending" label="&staff.patron_display.trigger_event.checkbox_filter.pending.label;" accesskey="&staff.patron_display.trigger_event.checkbox_filter.pending.accesskey;" 
+                        type="radio" group="atev_status" checked="true" style="-moz-user-focus: normal" oils_persist="checked" oils_persist_no_poke="true"
+                        oncommand="oils_persist(document.getElementById('complete')); oils_persist(document.getElementById('error'));"/>
+                    <toolbarbutton id="complete" label="&staff.patron_display.trigger_event.checkbox_filter.complete.label;" accesskey="&staff.patron_display.trigger_event.checkbox_filter.complete.accesskey;" 
+                        type="radio" group="atev_status" style="-moz-user-focus: normal" oils_persist="checked" oils_persist_no_poke="true"
+                        oncommand="oils_persist(document.getElementById('pending')); oils_persist(document.getElementById('error'));"/>
+                    <toolbarbutton id="error" label="&staff.patron_display.trigger_event.checkbox_filter.error.label;" accesskey="&staff.patron_display.trigger_event.checkbox_filter.error.accesskey;" 
+                        type="radio" group="atev_status" style="-moz-user-focus: normal" oils_persist="checked" oils_persist_no_poke="true"
+                        oncommand="oils_persist(document.getElementById('pending')); oils_persist(document.getElementById('complete'));"/>
+                </toolbar>
+                <spacer flex="1" />
+                <progressmeter id="progress" flex="1" hidden="true" mode="undetermined"/>
+                <menubar>
+                    <menu label="&staff.patron_display.trigger_event.menu.actions.label;" 
+                        accesskey="&staff.patron_display.trigger_event.menu.actions.accesskey;" 
+                        style="-moz-user-focus: normal">
+                        <menupopup>
+                            <menuitem command="cmd_cancel_event" label="&staff.patron_display.trigger_event.menu.actions.cancel.label;" accesskey="&staff.patron_display.menu.actions.cancel.accesskey;"/>
+                            <menuitem command="cmd_reset_event" label="&staff.patron_display.trigger_event.menu.actions.reset.label;" accesskey="&staff.patron_display.menu.actions.reset.accesskey;"/>
+                        </menupopup>
+                    </menu>
+                </menubar>
+            </hbox>
+        </vbox>
+        <tree id="atev_list" flex="1" enableColumnDrag="true" context="atev_actions" />
+        <hbox id="list_actions" />
+    </groupbox>
+
+    <popupset id="atev_popupset">
+        <popup id="atev_actions" position="at_pointer">
+            <menuitem command="cmd_cancel_event" label="&staff.patron_display.trigger_event.menu.actions.cancel.label;" accesskey="&staff.patron_display.menu.actions.cancel.accesskey;"/>
+            <menuitem command="cmd_reset_event" label="&staff.patron_display.trigger_event.menu.actions.reset.label;" accesskey="&staff.patron_display.menu.actions.reset.accesskey;"/>
+        </popup>
+    </popupset>
+
+</window>
+