util.hide library
authorJason Etheridge <jason@esilibrary.com>
Thu, 15 Mar 2012 04:58:05 +0000 (00:58 -0400)
committerMike Rylander <mrylander@gmail.com>
Mon, 2 Apr 2012 11:46:38 +0000 (07:46 -0400)
Provides util.hide.generate_dialog and util.hide.generate_css.

util.hide.generate_css takes one parameter, an org unit setting name for a
setting of type array. It tests this setting and for every value in the array
it looks for DOM elements with 'hideable' attributes containing those values.
It adds the CSS classname 'hideme' to such elements, and removes 'hideme' from
any non-matched elements that also have 'hideable' attributes.

util.hide.generate_dialog takes the same setting parameter as generate_css, and
an optional context org parameter (defaults to the workstation library). It pops
up a dialog with a checkbox for every 'hideable' DOM element. Clicking 'OK' will
update the org unit setting with every checked element, and it then calls
generate_css to update the interface being affected.

Signed-off-by: Jason Etheridge <jason@esilibrary.com>
Signed-off-by: Bill Erickson <berick@esilibrary.com>
Signed-off-by: Mike Rylander <mrylander@gmail.com>
Open-ILS/src/sql/Pg/upgrade/XXXX.data.org-setting-ui.hide_copy_editor_fields.sql [new file with mode: 0644]
Open-ILS/xul/staff_client/chrome/content/util/hide.js [new file with mode: 0644]
Open-ILS/xul/staff_client/chrome/locale/en-US/offline.properties
Open-ILS/xul/staff_client/server/OpenILS/util_overlay.xul

diff --git a/Open-ILS/src/sql/Pg/upgrade/XXXX.data.org-setting-ui.hide_copy_editor_fields.sql b/Open-ILS/src/sql/Pg/upgrade/XXXX.data.org-setting-ui.hide_copy_editor_fields.sql
new file mode 100644 (file)
index 0000000..df06384
--- /dev/null
@@ -0,0 +1,28 @@
+BEGIN;
+
+SELECT evergreen.upgrade_deps_block_check('XXXX', :eg_version);
+
+INSERT INTO config.org_unit_setting_type ( name, label, description, datatype, grp )
+    VALUES (
+        'ui.hide_copy_editor_fields',
+        oils_i18n_gettext(
+            'ui.hide_copy_editor_fields',
+            'GUI: Hide these fields within the Item Attribute Editor',
+            'coust',
+            'label'
+        ),
+        oils_i18n_gettext(
+            'ui.hide_copy_editor_fields',
+            'This setting may be best maintained with the dedicated configuration'
+            || ' interface within the Item Attribute Editor.  However, here it'
+            || ' shows up as comma separated list of field identifiers to hide.',
+            'coust',
+            'description'
+        ),
+        'array',
+        'gui'
+    );
+
+-- DELETE FROM actor.org_unit_setting WHERE name = 'ui.hide_copy_editor_fields'; DELETE FROM config.org_unit_setting_type_log WHERE field_name = 'ui.hide_copy_editor_fields'; DELETE FROM config.org_unit_setting_type WHERE name = 'ui.hide_copy_editor_fields'; DELETE FROM config.upgrade_log WHERE version = 'XXXX';
+
+COMMIT;
diff --git a/Open-ILS/xul/staff_client/chrome/content/util/hide.js b/Open-ILS/xul/staff_client/chrome/content/util/hide.js
new file mode 100644 (file)
index 0000000..e67a64b
--- /dev/null
@@ -0,0 +1,189 @@
+dump('entering util/hide.js\n');
+
+if (typeof util == 'undefined') var util = {};
+util.hide = {};
+
+util.hide.EXPORT_OK    = [
+    'generate_dialog',
+    'generate_css'
+];
+util.hide.EXPORT_TAGS    = { ':all' : util.hide.EXPORT_OK };
+
+util.hide.generate_dialog = function(setting,org) {
+    JSAN.use('util.network'); JSAN.use('OpenILS.data');
+    var data = new OpenILS.data(); data.stash_retrieve();
+    var network = new util.network();
+
+    // gather the hideable elements and determine how we might best label them
+    var nl = document.getElementsByAttribute('hideable','*');
+    var hideable = {};
+    for (var i = 0; i < nl.length; i++) {
+        var hname = nl[i].getAttribute('hideable');
+        var value = nl[i].getAttribute('value');
+        var label = nl[i].getAttribute('label');
+
+        if (typeof hideable[hname] == 'undefined') {
+            hideable[hname] = hname;
+        }
+
+        if (nl[i].nodeName == 'label' && value) {
+            hideable[hname] = value;
+        }
+
+        if (label) {
+            hideable[hname] = label;
+        }
+    }
+
+    // put them into a sorted array
+    var elements = [];
+    for (var hname in hideable) {
+        elements.push( { 'hname' : hname, 'label' : hideable[hname] } );
+    }
+    elements = elements.sort(
+        function(a,b) {
+            if (a.label < b.label) return -1;
+            if (a.label > b.label) return 1;
+            return 0;
+        }
+    );
+
+    // create our dialog
+    JSAN.use('util.widgets');
+    var vbox = document.createElement('vbox');
+    var menu_box = document.createElement('hbox');
+    vbox.appendChild(menu_box);
+    var perm = 'STAFF_LOGIN'; // let's be less restrictive up front, since
+    // staff may want to configure and then call over a manager for a perm
+    // override
+    var menu = util.widgets.render_perm_org_menu(perm,ses('ws_ou'));
+    if (!menu) {
+        alert(
+            $('offlineStrings').getFormattedString(
+                'util.hide_elements.missing_permission',
+                [ perm ]
+            )
+        );
+        return false;
+    }
+    menu_box.appendChild(menu);
+
+    var already_hidden = {};
+    var aous_req = network.simple_request(
+        'FM_AOUS_SPECIFIC_RETRIEVE',
+        [
+            org || ses('ws_ou'),
+            setting,
+            ses()
+        ]
+    );
+    if (aous_req) {
+        var desc = document.createElement('description');
+        vbox.appendChild(desc);
+        var msg = $('offlineStrings').getFormattedString(
+            'util.hide_elements.current_setting_preamble',
+            [ ses('ws_ou_shortname'), data.hash.aou[ aous_req.org ].shortname() ]
+        );
+        desc.appendChild( document.createTextNode( msg ) );
+
+        for (var i in aous_req.value) {
+            already_hidden[aous_req.value[i]] = true;
+        }
+
+        /* update data.hash.aous while we have fresh data */
+        data.hash.aous[setting] = aous_req.value;
+        data.stash('hash');
+
+    } else {
+        var desc = document.createElement('description');
+        vbox.appendChild(desc);
+        var msg = $('offlineStrings').getFormattedString(
+            'util.hide_elements.current_setting_nonexistent',
+            [ ses('ws_ou_shortname') ]
+        );
+        desc.appendChild( document.createTextNode( msg ) );
+
+        data.hash.aous[setting] = null;
+        data.stash('hash');
+    }
+
+    for (var i = 0; i < elements.length; i++) {
+        var checkbox = document.createElement('checkbox');
+        checkbox.setAttribute('label',elements[i].label);
+        checkbox.setAttribute('value',elements[i].hname);
+        if (already_hidden[elements[i].hname]) {
+            checkbox.setAttribute('checked','true');
+        }
+        vbox.appendChild(checkbox);
+    }
+
+
+    var results = widget_prompt(
+        vbox,
+        {
+            'title' : $('offlineStrings').getString('util.hide_elements.title'),
+            'desc' : $('offlineStrings').getString('util.hide_elements.desc'),
+            'access' : 'method',
+            'method' : function() {
+                var hide_these = [];
+                for (var i = 0; i < vbox.childNodes.length; i++) {
+                    var checkbox = vbox.childNodes[i];
+                    if (checkbox.checked) {
+                        hide_these.push( checkbox.getAttribute('value') );
+                    }
+                }
+                return { 'org' : menu.value, 'elements' : hide_these };
+            }
+        }
+    );
+    if (!results) { return; }
+
+    var params = {};
+    params[setting] = results.elements.length > 0
+        ? results.elements
+        : null; // delete the setting so we can inherit from higher orgs
+    var result = network.simple_request(
+        'FM_AOUS_UPDATE',
+        [
+            ses(),
+            results.org,
+            params
+        ]
+    );
+    if (result == 1) {
+
+        if (results.elements.length > 0) {
+            alert($('offlineStrings').getString('util.hide_elements.update_setting.update_success'));
+        } else {
+            alert($('offlineStrings').getString('util.hide_elements.update_setting.delete_success'));
+        }
+        data.hash.aous[setting] = params[setting];
+        data.stash('hash');
+
+        util.hide.generate_css(setting);
+
+    } else {
+        alert($('offlineStrings').getString('util.hide_elements.update_setting.failure'));
+    }
+}
+
+util.hide.generate_css = function(setting) {
+    JSAN.use('OpenILS.data');
+    var data = new OpenILS.data(); data.stash_retrieve();
+    var hidden = {};
+    for (var i in data.hash.aous[setting]) {
+        hidden[data.hash.aous[setting][i]] = true;
+    }
+    var nl = document.getElementsByAttribute('hideable','*');
+    for (var i = 0; i < nl.length; i++) {
+        var hname = nl[i].getAttribute('hideable');
+        if (hidden[hname]) {
+            addCSSClass(nl[i],'hideme');
+        } else {
+            removeCSSClass(nl[i],'hideme');
+        }
+    }
+}
+
+dump('exiting util/hide.js\n');
index af40f08..961ad06 100644 (file)
@@ -317,3 +317,11 @@ barcode_choice.asset_label=Item : %1$s
 barcode_choice.serial_label=Serial : %1$s
 barcode_choice.booking_label=Booking : %1$s
 staff.main.button_bar.none=None
+util.hide_elements.title=Hide UI Elements
+util.hide_elements.desc=This is a list of hideable elements for this interface.  Check the ones that you want hidden and the library (and descendants) you want to affect:
+util.hide_elements.current_setting_preamble=Workstation library %1$s is currently hiding these elements based on a setting inherited from %2$s:
+util.hide_elements.current_setting_nonexistent=Workstation library %1$s is not currently hiding any of these elements.
+util.hide_elements.update_setting.update_success=Successfully updated the setting.
+util.hide_elements.update_setting.delete_success=Successfully deleted the setting.
+util.hide_elements.update_setting.failure=Setting not changed.
+util.hide_elements.missing_permission=Missing permission %1$s
index f185b79..323971f 100644 (file)
@@ -60,6 +60,7 @@
         <script type="text/javascript" src="/xul/server/util/sound.js" />
         <script type="text/javascript" src="/xul/server/util/text.js" />
         <script type="text/javascript" src="/xul/server/util/widgets.js" />
+        <script type="text/javascript" src="/xul/server/util/hide.js" />
         <script type="text/javascript" src="/xul/server/util/window.js" />
         <script type="text/javascript" src="/xul/server/circ/util.js" />
         <script type="text/javascript" src="/xul/server/cat/util.js" />