Issuance holds
authorsenator <lebbeous@esilibrary.com>
Thu, 16 Dec 2010 21:43:57 +0000 (16:43 -0500)
committersenator <lebbeous@esilibrary.com>
Thu, 16 Dec 2010 22:21:57 +0000 (17:21 -0500)
Open-ILS/web/opac/skin/kcls/js/holds.js
Open-ILS/web/opac/skin/kcls/js/rdetail.js
Open-ILS/web/opac/skin/kcls/xml/common/holds.xml
Open-ILS/web/opac/skin/kcls/xml/rdetail/rdetail_summary.xml

index b261eff..3dd3d0a 100644 (file)
@@ -11,6 +11,14 @@ item_form is specified, use item_type(s)--language
 var noEmailMessage;\r
 var noEmailMessageXUL;\r
 \r
+var holdTargetTypeMap = {\r
+    M : 'metarecord',\r
+    T : 'record',\r
+    V : 'volume',\r
+    I : 'issuance',\r
+    C : 'copy'\r
+};\r
+\r
 function hideResultsPage(bool) {\r
        if(!bool) {\r
                unHideMe($('result_header'));\r
@@ -207,20 +215,7 @@ function holdArgsFromHold(hold, oargs) {
        args.type = hold.hold_type();\r
        var target = hold.target();\r
 \r
-       switch(args.type) {\r
-               case 'M':\r
-                       args.metarecord = target;\r
-                       break;\r
-               case 'T':\r
-                       args.record = target;\r
-                       break;\r
-               case 'V':\r
-                       args.volume = target;\r
-                       break;\r
-               case 'C':\r
-                       args.copy = target;\r
-                       break;\r
-       }\r
+    args[holdTargetTypeMap[args.type]] = target;\r
        return args;\r
 }\r
 \r
@@ -252,6 +247,8 @@ function holdFetchObjects(hold, doneCallback) {
                if( type == 'V' ) {\r
                        _h_set_vol(args, doneCallback);\r
 \r
+        } else if (type == 'I') {\r
+            _h_set_issuance(args, doneCallback);\r
                } else {\r
                        if( type == 'T' ) {\r
                                _h_set_rec(args, doneCallback);\r
@@ -286,6 +283,28 @@ function _h_set_vol(args, doneCallback) {
        }\r
 }\r
 \r
+function _h_set_issuance(args, doneCallback) {\r
+\r
+   if( args.issuanceObject ) {\r
+       args.issuance = args.issuanceObject.id();\r
+       args.record = args.issuanceObject.subscription().record_entry();\r
+       _h_set_rec(args, doneCallback);\r
+\r
+   } else {\r
+\r
+       var vreq = new Request(FETCH_ISSUANCE, [args.issuance]);\r
+       vreq.callback(\r
+           function(r) {\r
+               var issuance = r.getResultObject()[0];\r
+               args.issuanceObject = issuance;\r
+               args.record = issuance.subscription().record_entry();\r
+               _h_set_rec(args, doneCallback);\r
+           }\r
+       );\r
+       vreq.send();\r
+   }\r
+}\r
+\r
 function _h_set_rec(args, doneCallback) {\r
 \r
        if(args.recordObject) \r
@@ -419,7 +438,14 @@ function __holdsDrawWindow() {
        appendClear($('holds_title'), text(rec.title()));\r
        appendClear($('holds_author'), text(rec.author()));\r
 \r
-       if( holdArgs.type == 'V' || holdArgs.type == 'C' ) {\r
+    if( holdArgs.type == 'I' ) {\r
+       unHideMe($('holds_type_row'));\r
+        unHideMe($('holds_is_issuance'));\r
+        unHideMe($('holds_issuance_row'));\r
+        appendClear($('holds_issuance_label'), text(holdArgs.issuanceObject.label()));\r
+\r
+    } else if( holdArgs.type == 'V' || holdArgs.type == 'C' ) {\r
+\r
 \r
                unHideMe($('holds_type_row'));\r
                unHideMe($('holds_cn_row'));\r
@@ -440,6 +466,7 @@ function __holdsDrawWindow() {
                hideMe($('holds_type_row'));\r
                hideMe($('holds_copy_row'));\r
                hideMe($('holds_cn_row'));\r
+        hideMe($('holds_issuance_row'));\r
        }\r
 \r
        removeChildren($('holds_format'));\r
@@ -562,7 +589,7 @@ function holdsParseMRFormats(str) {
 \r
 function holdsSetFormatSelector() {\r
        var type = holdArgs.type;\r
-       if( type == 'C' || type == 'V' || holdArgs.editHold ) return;\r
+       if( type == 'C' || type == 'V' || type == 'I' || holdArgs.editHold ) return;\r
 \r
        var data                                = holdsGetFormats();\r
        var avail_formats       = data.avail_formats;\r
@@ -668,6 +695,7 @@ function holdsCheckPossibility(pickuplib, hold, recurse) {
        var args = { \r
                titleid : holdArgs.record,\r
                volume_id : holdArgs.volume,\r
+        issuanceid : holdArgs.issuance,\r
                copy_id : holdArgs.copy,\r
                hold_type : holdArgs.type,\r
                patronid : holdArgs.recipient.id(),\r
@@ -749,20 +777,7 @@ function holdsBuildHoldFromWindow() {
        else\r
                hold.email_notify(0);\r
 \r
-       var target;\r
-\r
-       switch(holdArgs.type) {\r
-               case 'M':\r
-                       target = holdArgs.metarecord; break;\r
-               case 'T':\r
-                       target = holdArgs.record; break;\r
-               case 'V':\r
-                       target = holdArgs.volume; break;\r
-               case 'C':\r
-                       target = holdArgs.copy; break;\r
-       }\r
-\r
-\r
+    var target = holdArgs[holdTargetTypeMap[holdArgs.type]];\r
 \r
        hold.pickup_lib(org); \r
        //hold.request_lib(org); \r
index ed8bcb5..f63fc10 100644 (file)
@@ -8,12 +8,13 @@ attachEvt("rdetail", "recordDrawn", rdetailBuildStatusColumns);
 attachEvt("rdetail", "recordDrawn", rdetailBuildInfoRows);\r
 attachEvt("rdetail", "recordDrawn", rdetailGetPageIds);\r
 \r
+dojo.requireLocalization("openils.opac", "opac");\r
+\r
 /* Per-skin configuration settings */\r
 var rdetailLocalOnly = true;\r
 var rdetailShowLocal = true;\r
 var rdetailShowCopyLocation = true;\r
 var rdetailGoogleBookPreview = false;\r
-var rdetailDisplaySerialHoldings = true;\r
 var rdetailEnableRefWorks = false;\r
 var rdetailRefWorksHost = 'http://www.refworks.com';\r
 \r
@@ -32,7 +33,7 @@ var globalCNCache = {};
 var localTOC;\r
 var cachedRecords;\r
 var _statusPositions = {};\r
-var opac_strings;\r
+var opac_strings = dojo.i18n.getLocalization("openils.opac", "opac");\r
 \r
 var nextContainerIndex;\r
 \r
@@ -49,13 +50,6 @@ if(location.href.match(/&place_hold=1/)) {
     hideMe(dojo.byId('canvas_main'));\r
 }\r
 \r
-/* serials are currently the only use of Dojo strings in the OPAC */\r
-       if (rdetailDisplaySerialHoldings) {\r
-               dojo.require("dijit.Menu");\r
-               dojo.require("dijit.form.Button");\r
-               dojo.requireLocalization("openils.opac", "opac");\r
-               opac_strings = dojo.i18n.getLocalization("openils.opac", "opac");\r
-       }\r
 }\r
 \r
 function rdetailReload() {\r
@@ -171,24 +165,6 @@ function rdetailDraw() {
           }\r
    }\r
 \r
-\r
-       if (rdetailDisplaySerialHoldings) {\r
-               var req = new Request(FETCH_MFHD_SUMMARY, getRid());\r
-               req.callback(_holdingsDraw);\r
-               req.send();\r
-               if (isXUL()) {\r
-                       var here = findOrgUnit(getLocation());\r
-                       dojo.place("<div id='mfhd_ad_menu' class='hide_me'></div>", "rdetail_details_table", "after");\r
-                       var mfhd_add = new dijit.Menu({style:"float: right;"});\r
-                       new dijit.MenuItem({onClick:function(){\r
-                               var req = new Request(CREATE_MFHD_RECORD, G.user.session, 1, here.id(), getRid());\r
-                               var res = req.send();\r
-                               alert(dojo.string.substitute(opac_strings.CREATED_MFHD_RECORD, [here.name()]));\r
-                       }, label:opac_strings.CREATE_MFHD}).placeAt(mfhd_add);\r
-                       mfhd_add.placeAt('mfhd_ad_menu');\r
-               }\r
-       }\r
-\r
        detachAllEvt("result", "idsReceived");\r
        G.evt.result.hitCountReceived = [];\r
        G.evt.result.recordReceived = [];\r
@@ -1310,3 +1286,81 @@ function rdetailGBPViewerLoadCallback() {
        GBPViewer.load('ISBN:' + cleanISBN(record.isbn()) );\r
 \r
 }\r
+\r
+function rdetailDrawExpandedHoldings(anchor, bibid, type) {\r
+    var offsets = {"basic": 0, "index": 0, "supplement": 0};\r
+    var limit = 10; /* XXX give user control over this? */\r
+    var target_id = "holding_type_" + type;\r
+    var target = dojo.byId(target_id);\r
+\r
+    anchor.innerHTML = "[-]";\r
+    anchor.oldonclick = anchor.onclick;\r
+    anchor.onclick = function() {\r
+        anchor.onclick = anchor.oldonclick;\r
+        anchor.innerHTML = "[+]";\r
+        dojo.empty(target);\r
+    };\r
+\r
+    function _load() {\r
+        dojo.empty(target);\r
+        fieldmapper.standardRequest(\r
+            ["open-ils.serial",\r
+                "open-ils.serial.received_siss.retrieve.by_bib.atomic"], {\r
+                "params": [bibid, {"offset": offsets[type], "limit": limit}],\r
+                "async": true,\r
+                "oncomplete": function(r) {\r
+                    try {\r
+                        if (msg = r.recv().content()) { /* sic, assignment */\r
+                            if (!msg.length) return;\r
+                            offsets[type] += msg.length;\r
+                            var table = dojo.create("table", null, target);\r
+                            dojo.forEach(\r
+                                msg, function(o) {\r
+                                    var tr = dojo.create("tr", null, table);\r
+                                    dojo.create(\r
+                                        "td", {\r
+                                            "innerHTML": o.issuance.label(),\r
+                                            "style": {"paddingLeft": "3em"}\r
+                                        }, tr\r
+                                    );\r
+\r
+                                    if (!o.has_units) return;\r
+                                    /* can't place holds if no units */\r
+                                    var td = dojo.create("td", null, tr);\r
+                                    dojo.create(\r
+                                        "a", {\r
+                                            "href":"javascript:void(0);",\r
+                                            "style": {"marginLeft": "1.5em"},\r
+                                            "onclick": function() {\r
+                                                holdsDrawEditor({\r
+                                                    "type": "I",\r
+                                                    "issuance": o.issuance.id()\r
+                                                });\r
+                                            },\r
+                                            "innerHTML": "[" +\r
+                                                opac_strings.PLACE_HOLD + "]"\r
+                                        }, td\r
+                                    );\r
+                                }\r
+                            );\r
+                            if (msg.length == limit) {\r
+                                dojo.create("br", null, target);\r
+                                dojo.create(\r
+                                    "a", {\r
+                                        "href": "javascript:void(0);",\r
+                                        "innerHTML":\r
+                                            "[" + opac_strings.MORE + "]",\r
+                                        "onclick": _load\r
+                                    }, target\r
+                                );\r
+                            }\r
+                        }\r
+                    } catch (E) {\r
+                        void(0);\r
+                    }\r
+                }\r
+            }\r
+        );\r
+    }\r
+    _load();\r
+}\r
index ff8a363..7cdf480 100644 (file)
@@ -66,6 +66,11 @@ id="holds_cancel"><img alt="Cancel" src="/opac/skin/kcls/graphics/btnCancel.png"
                                        <td class='holds_cell'><b id='holds_cn'/> </td>\r
                                </tr>\r
 \r
+                               <tr class='hide_me' id='holds_issuance_row'>\r
+                                       <td class='holds_cell'>&common.issuance_label.label;</td>\r
+                                       <td class='holds_cell'><b id='holds_issuance_label'/> </td>\r
+                               </tr>\r
+\r
                                <tr class='hide_me' id='holds_copy_row'>\r
                                        <td class='holds_cell'>&common.copy.barcode.label;</td>\r
                                        <td class='holds_cell'><b id='holds_copy'/> </td>\r
@@ -74,6 +79,7 @@ id="holds_cancel"><img alt="Cancel" src="/opac/skin/kcls/graphics/btnCancel.png"
                                <tr class='hide_me' id='holds_type_row'>\r
                                        <td class='holds_cell'>&common.hold.type.label;</td>\r
                                        <td class='holds_cell hide_me' id='holds_is_cn'><b>&common.hold.volume;</b></td>\r
+                                       <td class='holds_cell hide_me' id='holds_is_issuane'><b>&common.hold.issuance;</b></td>\r
                                        <td class='holds_cell hide_me' id='holds_is_copy'><b>&common.hold.copy;</b></td>\r
                                </tr>\r
 \r
index 4f8564e..8854f67 100644 (file)
                                  </span>\r
                                </td>\r
                        </tr>\r
+                       <tr class="result_table_title_cell hide_me">\r
+                <td class="rdetail_desc">\r
+                    <strong>&rdetail.summary.issues_held;</strong>\r
+                </td>\r
+                <td templated="true" type="opac/slot-data"\r
+                    query="datafield[tag='901'] subfield[code='c']"\r
+                    class="rdetail_item" colspan="3">\r
+                    ${holdingsStatement}\r
+                                       <span class="hide_me" name="holdingsStatement" type="opac/template-value"><![CDATA[\r
+                        if (fetchOrgSettingDefault(\r
+                            getLocation(),\r
+                            "opac.fully_compressed_serial_holdings"\r
+                        )) {\r
+                            var bibid = BT.textContent(item_list[0]);\r
+                            var blob = fieldmapper.standardRequest(\r
+                                ["open-ils.serial",\r
+                                    "open-ils.serial.bib.summary_statements"],\r
+                                [bibid, {\r
+                                    "orgid": getLocation(), "depth": getDepth()\r
+                                }]\r
+                            );\r
 \r
+                            var fake = dojo.create("td");\r
+                            var something = false;\r
+\r
+                            for (var i in blob) {\r
+                                if (!blob[i].length) continue;\r
+                                if (something) dojo.create("br", null, fake);\r
+                                something = true;\r
+\r
+                                var a = dojo.create(\r
+                                    "a", {\r
+                                        "innerHTML": "[+]",\r
+                                        "href": "javascript:void(0);",\r
+                                        "onclick":\r
+                                            "rdetailDrawExpandedHoldings(this,"+\r
+                                            bibid + ",'" + i + "');",\r
+                                        "style": {"marginRight": "1.5em"}\r
+                                    }, fake\r
+                                );\r
+                                dojo.create(\r
+                                    "span", {\r
+                                        "innerHTML": blob[i].join(", ")\r
+                                    }, fake\r
+                                );\r
+                                dojo.create(\r
+                                    "span", {"id": "holding_type_" + i}, fake\r
+                                );\r
+                            }\r
+\r
+                            if (something)\r
+                                unHideMe(slot.parentNode);\r
+\r
+                            return fake.innerHTML;\r
+                        } else {\r
+                            return "";\r
+                        }\r
+                                       ]]></span>\r
+                               </td>\r
+                       </tr>\r
 \r
 \r
                        <tr class='hide_me' id='rdetail_online_row'>\r