From aebbe8b0df073aeabc5de44b771dd6d16b49fda6 Mon Sep 17 00:00:00 2001 From: risard Date: Mon, 13 Sep 2010 20:16:32 +0000 Subject: [PATCH] fist pass at a course reserves system git-svn-id: svn://svn.open-ils.org/ILS-Contrib/conifer/branches/rel_1_6_1@990 6d9bc8c9-1ec2-4278-b937-99fde70a366f --- web/opac/skin/algoma/js/reserves.js | 411 +++++++++++++++++++++++++ web/opac/skin/algoma/xml/reserves/reserves.xml | 37 +++ 2 files changed, 448 insertions(+) create mode 100644 web/opac/skin/algoma/js/reserves.js create mode 100644 web/opac/skin/algoma/xml/reserves/reserves.xml diff --git a/web/opac/skin/algoma/js/reserves.js b/web/opac/skin/algoma/js/reserves.js new file mode 100644 index 0000000000..ae5485f097 --- /dev/null +++ b/web/opac/skin/algoma/js/reserves.js @@ -0,0 +1,411 @@ + +dojo.require("dijit.form.TextBox"); +dojo.require("dijit.Dialog"); +dojo.require('openils.PermaCrud'); +dojo.require("dijit.form.Button"); +dojo.require("dijit.form.FilteringSelect"); + +dojo.require('fieldmapper.AutoIDL'); //reads /openils/var/reports/fm_IDL.xml to generate a list of class properties +dojo.require('fieldmapper.dojoData'); //seems to provide a store for Evergreen data accessed via Dojo +dojo.require('fieldmapper.Fieldmapper'); //converts the list of class properties into actual classes. +dojo.require('openils.Util'); +dojo.require('openils.Event'); + +/* +===== Bookbag manipulation ===== +*/ + +function containerCresDoRequest( req, callback, args ) { + + if( callback ) { + req.callback( callback ); + req.request.args = args; + req.send(); + return null; + } + + req.send(true); + return req.result(); +} + +function containerCresFetchAll( callback, args ) { + + var req = new Request( + FETCH_CONTAINERS, G.user.session, G.user.id(), 'copy', 'cres' ); + + return containerCresDoRequest( req, callback, args ); +} + +function containerCresFlesh( id, callback, args ) { + + var req = new Request( FLESH_CONTAINER, G.user.session, 'copy', id ); + return containerCresDoRequest( req, callback, args ); +} + +function containerCresDelete( id, callback, args ) { + + var len = cresFleshedContainers[id].items().length; + + if (len != 0){ + for( var i = 0; i != len; i++ ) { + var itm = cresFleshedContainers[id].items()[i].id(); + containerCresRemoveItem( itm ); + } + + } + var req = new Request( DELETE_CONTAINER, G.user.session, 'copy', id ); + return containerCresDoRequest(req, callback, args ); +} + +function containerCresCreate( name, pub, callback, args ) { + + var container = new ccb(); + container.name(name); + container.btype('cres'); + + container.owner( G.user.id() ); + if(pub) container.pub('t'); + else container.pub('f'); + + var req = new Request( + CREATE_CONTAINER, G.user.session, 'copy', container ); + return containerCresDoRequest( req, callback, args ); +} + +function containerCresUpdate( container, callback, args ) { + + var req = new Request(UPDATE_CONTAINER, G.user.session, 'copy', container); + return containerCresDoRequest(req, callback, args); +} + + +function containerCresCreateItem( containerId, target, callback, args ) { + + var item = new ccbi(); + item.target_copy(target); + item.bucket(containerId); + + var req = new Request( CREATE_CONTAINER_ITEM, + G.user.session, 'copy', item ); + + return containerCresDoRequest( req, callback, args ); +} + + +function containerCresRemoveItem( id, callback, args ) { + + var search = {'item':id}; + var pcrudnote = new openils.PermaCrud({"authtoken":G.user.session}); + note = pcrudnote.search('ccbin', search); + var oldparams = dojo.fromJson(note[0].note()); + + var pcrudcpy = new openils.PermaCrud({"authtoken":G.user.session}); + var cpy = pcrudcpy.retrieve("acp", oldparams.id); + cpy.location(oldparams.location); + cpy.circ_modifier(oldparams.circ_modifier); + pcrudcpy.update(cpy); + + var req = new Request( DELETE_CONTAINER_ITEM, G.user.session, 'copy', id ); + return containerCresDoRequest( req, callback, args ); +} + +function containerCresCreateNote(itemId, circ_mod, copy_location) { + + var oldparams = {'id': cresCopy.id(), 'location': cresCopy.location().id(), 'circ_modifier': cresCopy.circ_modifier()}; + var joldparams = dojo.toJson(oldparams); + var pcrudcpy = new openils.PermaCrud({"authtoken":G.user.session}); + var cpy = pcrudcpy.retrieve("acp", cresCopy.id()); + cpy.location(copy_location); + cpy.circ_modifier(circ_mod); + pcrudcpy.update(cpy); + + var pcrudnote = new openils.PermaCrud({"authtoken":G.user.session}); + var note = new ccbin(); + note.note(joldparams); + note.item(itemId); + pcrudnote.create(note); + + return true; +} + +/* +===== reserves dialog stuff ===== +*/ + +var cresCopy; +function cresInit(currentCopy){ + + cresCopy = currentCopy; + + var cresDlg = dijit.byId("cresSelectorDlg"); + cresBuildSelector(); + cresDlg.show(); +} + +function cresCreate( pub, callback, args ) { + + var name = dijit.byId("cresNewName"); + containerCresCreate(name.value); + cresBuildSelector(); + name.attr("value", ""); +} + +function cresBuildSelector() { + + var req = new Request( + FETCH_CONTAINERS, G.user.session, G.user.id(), 'copy', 'cres' ); + req.callback(cresAddBookbags); + req.send(); +} + + +function cresAddBookbags(r) { +/*yeah, this sucks. Need to replace this. +need to refresh the drop down otherwise it duplicates values +everytime the dialog is given focus. +Easiest way to do this likely is to use a dijit list, I can +then use it's reset property +*/ +$('cresSelector').options.length = 0; +$('cresSelector').options[0] = new Option("Add to Reserve", "start"); +$('cresSelector').options[1] = new Option("--------------"); +$('cresSelector').options[1].disabled = true; +$('cresSelector').options[2] = new Option("Add to Reserve"); +$('cresSelector').options[2].disabled = true; +$('cresSelector').options[3] = new Option("--------------"); +$('cresSelector').options[3].disabled = true; + + var containers = r.getResultObject(); + var selector = $('cresSelector'); + var found = false; + var index = 3; + doSelectorActions(selector); + + + for( var i = 0; i != containers.length; i++ ) { + found = true; + var container = containers[i]; + insertSelectorVal( selector, index++, container.name(), + "container_" + container.id(), cresAddToBookbag, 1 ); + } + + nextContainerIndex = index; +} + + +function cresAddToBookbag() { + + var selector = $('cresSelector'); + var id = selector.options[selector.selectedIndex].value; + setSelector( selector, 'start' ); + var circmod = $('cresCircModSelector'); + var loc = $('cresLocSelector'); + + var cresInsert = containerCresCreateItem( id.substring(10), cresCopy.id() ) + + if ( cresInsert ) { + if ( containerCresCreateNote(cresInsert, circmod, loc)) { alert($('rdetail_bb_item_success').innerHTML);} + } + +} + +function cresShowManager() { + + var cresManageDlg = dijit.byId('cresManageDialog'); + cresManageDlg.show(); + +} + +/* +===== "My Reserves" interface stuff ===== +*/ + +var cresFleshedContainers = {}; +var cresContainerTemplate; + +function myOPACCresShowBookbags(force) { + + var tbody =$('myopac_cres_bookbag_tbody') ; + + if(!cresContainerTemplate) + cresContainerTemplate = tbody.removeChild($('myopac_cres_bookbag_tr')); + else if(!force) return; + + removeChildren(tbody); + + var containers = containerCresFetchAll(); + + var found = false; + for( var i in containers ) { + found = true; + var cont = containers[i]; + var row = cresContainerTemplate.cloneNode(true); + row.id = 'myopac_cres_bookbag_row_' + cont.id(); + var link = $n(row, 'myopac_cres_expand_bookbag'); + var dlink = $n(row, 'myopac_cres_container_delete'); + link.appendChild( text(cont.name()) ); + link.setAttribute('href', + 'javascript:myOPACCresExpandBookbag("' + cont.id() + '","' + cont.name() + '");'); + myOPACCresFetchBBItems( cont.id(), row ); + dlink.setAttribute('href', 'javascript:myOPACCresDeleteBookbag("'+cont.id()+'");'); + + if( isTrue(cont.pub()) ) { + unHideMe($n(row, 'myopac_cres_bb_published_yes')); + var link = $n(row, 'myopac_cres_bb_published_view'); + link.setAttribute('href', buildExtrasLink( 'feed/bookbag/html-full/'+cont.id(), false)); + link.setAttribute('target', '_blank' ); + unHideMe(link); + link = $n(row, 'myopac_cres_bb_published_atom'); + link.setAttribute('href', buildExtrasLink( 'feed/bookbag/rss2-full/'+cont.id(), false)); + link.setAttribute('target', '_blank' ); + unHideMe(link); + + link = $n(row, 'myopac_cres_bb_make_unpublished'); + link.setAttribute('href', 'javascript:myOPACCresMakeBBPublished("'+cont.id()+'", true);'); + unHideMe(link); + + var RW = $n(row, 'myopac_cres_bb_exp_refworks'); + if (RW && myopacEnableRefWorks) { + var here = (findOrgUnit(getLocation())).name(); + var org_name = here.replace(" ", "+"); + var cgi = new CGI(); + + RW.setAttribute('href', + myopacRefWorksHost + '/express/expressimport.asp?vendor=' + + org_name + + '&filter=MARC+Format&database=All+MARC+Formats&encoding=65001&url=http%3A%2F%2F' + + cgi.server_name + '/opac/extras/feed/bookbag/marctxt-full/' + + cont.id() + ); + RW.setAttribute('target', 'RefWorksMain'); + unHideMe($n(row, 'myopac_cres_bb_exp_refworks')); + } + } else { + unHideMe($n(row, 'myopac_cres_bb_published_no')); + var link = $n(row, 'myopac_cres_bb_make_published'); + link.setAttribute('href', 'javascript:myOPACCresMakeBBPublished("'+cont.id()+'");'); + unHideMe(link); + } + tbody.appendChild(row); + } + + if(!found) unHideMe($('myopac_cres_bookbags_none')); + else unHideMe($('myopac_cres_bookbag_table')); +} + + +function myOPACCresMakeBBPublished(bbid, hideme) { + + var bb = cresFleshedContainers[bbid]; + + if(hideme) { + if(!confirm($('myopac_make_unpublished_confirm').innerHTML)) return; + bb.pub('f'); + } else { + if(!confirm($('myopac_make_published_confirm').innerHTML)) return; + bb.pub('t'); + } + + var result = containerCresUpdate(bb, 'copy'); + + var code = checkILSEvent(result); + if(code) { alertILSEvent(result); return; } + + alert($('myopac_bb_update_success').innerHTML); + myOPACCresShowBookbags(true); +} + +function myOPACCresDeleteBookbag(id) { + if( confirm( $('myopac_cres_delete_bookbag_warn').innerHTML ) ) { + var result = containerCresDelete(id); + var code = checkILSEvent(result); + if(code) { alertILSEvent(result); return; } + alert($('myopac_cres_bb_update_success').innerHTML); + hideMe($('myopac_cres_bookbag_items_table')); + hideMe($('myopac_cres_bookbag_items_name')); + hideMe($('myopac_cres_bookbag_no_items')); + myOPACCresShowBookbags(true); + } +} + +function myOPACCresFetchBBItems( id, row, block ) { + if(!block) { + containerCresFlesh( id, _myOPACCresSetBBItems, { row: row } ); + } else { + var cont = containerCresFlesh( id ); + myOPACCresSetBBItems( cont, row ); + } +} + +function _myOPACCresSetBBItems(r) { myOPACCresSetBBItems( r.getResultObject(), r.args.row ); } + +function myOPACCresSetBBItems( container, row ) { + cresFleshedContainers[container.id()] = container; + var node = $n(row, 'myopac_cres_bookbag_item_count'); + removeChildren(node); + node.appendChild( text(container.items().length) ); +} + +var cresBBItemsRow; +function myOPACCresExpandBookbag( id, name ) { + + var tbody = $('myopac_cres_bookbag_items_tbody'); + if(!cresBBItemsRow) cresBBItemsRow = tbody.removeChild($('myopac_cres_bookbag_items_row')); + removeChildren(tbody); + removeChildren($('myopac_cres_bookbag_items_name')); + + $('myopac_cres_bookbag_items_name').appendChild(text(name)); + + if( cresFleshedContainers[id] ) { + var len = cresFleshedContainers[id].items().length; + + if( len == 0 ) { + unHideMe($('myopac_cres_bookbag_no_items')); + hideMe($('myopac_cres_bookbag_items_table')); + return; + } + + hideMe($('myopac_cres_bookbag_no_items')); + unHideMe($('myopac_cres_bookbag_items_table')); + + for( var i = 0; i != len; i++ ) { + var row = cresBBItemsRow.cloneNode(true); + found = true; + + var item = cresFleshedContainers[id].items()[i]; + var tlink = $n(row,'myopac_cres_bookbag_items_title'); + var alink = $n(row,'myopac_cres_bookbag_items_author'); + + var req = new Request( FETCH_RMODS, item.target_copy() ); + req.request.tlink = tlink; + req.request.alink = alink; + req.callback(myOPACCresShowBBItem); + req.send(); + + var clink = $n(row, 'myopac_cres_bookbag_items_remove'); + clink.setAttribute('href', 'javascript:myOPACCresRemoveBBItem("'+item.id()+'","'+id+'","'+name+'");'); + + tbody.appendChild(row); + } + } +} + +function myOPACCresRemoveBBItem( id, containerid, container_name ) { + if(!confirm($('myopac_cres_remove_bb_item_confirm').innerHTML)) return; + var stat = containerCresRemoveItem( id ); + if(stat) alert($('myopac_cres_bb_update_success').innerHTML); + myOPACCresFetchBBItems( containerid, $('myopac_cres_bookbag_row_' + containerid), true); + myOPACCresExpandBookbag( containerid, container_name ); +} + +function myOPACCresShowBBItem(r) { + var record = r.getResultObject(); + buildTitleDetailLink(record, r.tlink); + buildSearchLink(STYPE_AUTHOR, record.author(), r.alink); +} + +/* +function myOPACCresCreateBookbag() { + +} + */ diff --git a/web/opac/skin/algoma/xml/reserves/reserves.xml b/web/opac/skin/algoma/xml/reserves/reserves.xml new file mode 100644 index 0000000000..d2d453ebf8 --- /dev/null +++ b/web/opac/skin/algoma/xml/reserves/reserves.xml @@ -0,0 +1,37 @@ +
+ + + +
+ + + +

+ + + + +

+

+ +

+ + +
+ +
-- 2.11.0