more metarecord holds work
authorerickson <erickson@dcc99617-32d9-48b4-a31d-7c20da2025e4>
Fri, 16 Jun 2006 16:25:56 +0000 (16:25 +0000)
committererickson <erickson@dcc99617-32d9-48b4-a31d-7c20da2025e4>
Fri, 16 Jun 2006 16:25:56 +0000 (16:25 +0000)
git-svn-id: svn://svn.open-ils.org/ILS/trunk@4653 dcc99617-32d9-48b4-a31d-7c20da2025e4

Open-ILS/src/perlmods/OpenILS/Application/Search/Biblio.pm
Open-ILS/web/opac/common/js/utils.js
Open-ILS/web/opac/skin/default/js/holds.js
Open-ILS/web/opac/skin/default/js/myopac.js
Open-ILS/web/opac/skin/default/xml/common/holds.xml

index 5c215ae..5982a50 100644 (file)
@@ -1080,15 +1080,13 @@ sub rec_to_mr_rec_descriptors {
        my $e = new_editor();
        my $recs;
 
-       if( $rec ) {
+       if( !$mrec ) {
                my $map = $e->search_metabib_metarecord_source_map({source => $rec});
                return $e->event unless @$map;
-               $recs = $e->search_metabib_metarecord_source_map({metarecord => $$map[0]->metarecord});
-
-       } else {
-               $recs = $e->search_metabib_metarecord_source_map({metarecord => $mrec});
+               $mrec = $$map[0]->metarecord;
        }
 
+       $recs = $e->search_metabib_metarecord_source_map({metarecord => $mrec});
        return $e->event unless @$recs;
 
        my @recs = map { $_->source } @$recs;
@@ -1097,7 +1095,9 @@ sub rec_to_mr_rec_descriptors {
        $search->{item_type} = $item_types if $item_types and @$item_types;
        $search->{item_lang} = $item_lang if $item_lang;
 
-       return $e->search_metabib_record_descriptor($search);
+       my $desc = $e->search_metabib_record_descriptor($search);
+
+       return { metarecord => $mrec, descriptors => $desc };
 }
 
 
index e5eaca7..2b80142 100644 (file)
@@ -558,3 +558,9 @@ function uniquify(arr) {
        }
        return newarr;
 }
+
+function contains(arr, item) {
+       for( var i = 0; i < arr.length; i++ ) 
+               if( arr[i] == item ) return true;
+       return false;
+}
index 8f6752b..89becef 100644 (file)
@@ -202,17 +202,16 @@ function _h_set_vol(args, doneCallback) {
 }
 
 function _h_set_rec(args, doneCallback) {
-       if(args.recordObject) {
+
+       if(args.recordObject) 
                args.record = args.recordObject.doc_id();
-       } else {
+       else 
                args.recordObject = findRecord( args.record, 'T' );
-       }
-
-       if( args.type == 'T' || args.type == 'M' ) {
+       
+       if( args.type == 'T' || args.type == 'M' ) 
                _h_set_rec_descriptors(args, doneCallback);
-       } else {
+       else 
                if(doneCallback) doneCallback(args);
-       }
 }
 
 function _h_set_rec_descriptors(args, doneCallback) {
@@ -231,7 +230,9 @@ function _h_set_rec_descriptors(args, doneCallback) {
                var req = new Request(FETCH_MR_DESCRIPTORS, params );
                req.callback(
                        function(r) {
-                               args.recordDescriptors = r.getResultObject();
+                               var data = r.getResultObject();
+                               args.recordDescriptors = data.descriptors;
+                               args.metarecord = data.metarecord;
                                if(doneCallback) doneCallback(args);
                        }
                );
@@ -308,8 +309,16 @@ function __holdsDrawWindow() {
        }
 
        removeChildren($('holds_format'));
-       for( var i in rec.types_of_resource() ) {
-               var res = rec.types_of_resource()[i];
+       var formats = rec.types_of_resource();
+
+       if( holdArgs.type == 'M' ) {
+               var data = holdsParseMRFormats(holdArgs.editHold.holdable_formats());
+               formats = data.formats;
+       }
+
+
+       for( var i in formats ) {
+               var res = formats[i];
                var img = elem("img");
                setResourcePic(img, res);
                $('holds_format').appendChild(text(' '+res+' '));
@@ -340,52 +349,51 @@ function __holdsDrawWindow() {
        holdsSetFormatSelector();
 }
 
+function holdsParseMRFormats(str) {
+       var data = str.split(/-/);      
+
+       var formats = [];
+       for( var i = 0; i < data[0].length; i++ ) 
+               formats.push(MARCFormatToMods(data[0].charAt(i)));
+       
+       formats = uniquify(formats);
+
+       return {
+               formats         : formats,
+               lang                    : data[2],
+               largeprint      : data[1],      
+       }
+}
+
+
 function holdsSetFormatSelector() {
        var type = holdArgs.type;
        if( type == 'C' || type == 'V' ) return;
 
-       var data = holdGetTypesAndForms();
-       var item_lang           = data.item_lang;
-       var avail_types = data.avail_types;
-       var avail_forms = data.avail_forms;
-       var selected_forms = data.selected_forms;
-       var selected_types = data.selected_types;
+       var data                                = holdsGetFormats();
+       var avail_formats       = data.avail_formats;
+       var sel_formats = data.sel_formats;
+       holdArgs.language = data.lang;
 
-
-       if( avail_types.length > 1 ) {
+       if( avail_formats.length > 1 ) {
 
                unHideMe($('holds_alt_formats_row'));
-
                var selector = $('hold_alt_form_selector');
 
-               if( avail_forms.length > 0 ) 
-                       unHideMe(findSelectorOptByValue(selector, 'at-d'));
-
-               if( selected_forms.length > 0 ) 
-                       setSelector(selector, 'at-d');
-
-               for( var i = 0; i < avail_types.length; i++ ) {
-                       var t = avail_types[i];
-                       if( t == 'a' || t == 't' ) t = 'at'
-                       unHideMe(findSelectorOptByValue(selector, t));
-               }
-
-               for( var i = 0; i < selected_types.length; i++ ) {
-                       var t = selected_types[i];
-                       if( t == 'a' || t == 't' ) t = 'at'
-                       setSelector(selector, t);
+               for( var i = 0; i < avail_formats.length; i++ ) {
+                       var form = avail_formats[i];
+                       if( contains(sel_formats, form) ) continue;
+                       unHideMe(findSelectorOptByValue(selector, form));
                }
        }
 }
 
 
-function holdGetTypesAndForms() {
+function holdsGetFormats() {
 
-       var item_lang;
-       var item_types = [];
-       var item_forms  = [];
-       var selected_forms = [];
-       var selected_types = [];
+       var lang;
+       var formats = [];
+       var sformats = []; /* selected formats */
 
        var type = holdArgs.type;
        var desc = holdArgs.recordDescriptors;
@@ -394,13 +402,12 @@ function holdGetTypesAndForms() {
 
        if( type == 'T' ) {
 
-               /* find our language */
                for( var i = 0; i < desc.length; i++ ) {
                        var d = desc[i];
                        if( d.record() == holdArgs.record ) {
-                               item_lang = d.item_lang();
-                               selected_forms.push(d.item_form());
-                               selected_types.push(d.item_type());
+                               lang = d.item_lang();
+                               holdArgs.myFormat =  _t_f_2_format(d.item_type(), d.item_form());
+                               sformats.push(holdArgs.myFormat);
                                break;
                        }
                }
@@ -408,21 +415,66 @@ function holdGetTypesAndForms() {
 
        for( var i = 0; i < desc.length; i++ ) {
                var d = desc[i];
-               if( d.item_lang() != item_lang ) continue;
-               item_types.push(d.item_type());
-               item_forms.push(d.item_form());
+               if( d.item_lang() != lang ) continue;
+               formats.push( _t_f_2_format(d.item_type(), d.item_form()));
        }
 
-       item_types = uniquify(item_types);
-       item_forms = uniquify(item_forms);
+       formats = uniquify(formats);
 
-       return { 
-               avail_types : item_types, 
-               avail_forms     : item_forms, 
-               item_lang : item_lang,
-               selected_forms : selected_forms,
-               selected_types : selected_types,
-       };
+       return {
+               lang : lang,
+               avail_formats : formats, 
+               sel_formats : sformats,
+       }
+}
+
+
+
+function _t_f_2_format(type, form) {
+       if( form == 'd' ) return 'at-d';
+       return (type == 'a' || type == 't') ? 'at' : 
+               ( type == 'i' || type == 'g' || type == 'j' ) ? type : null;
+}
+
+function holdsSetSelectedFormats() {
+
+       var cn = $('holds_alt_formats_row').className;
+       if( cn && cn.match(/hide_me/) ) return;
+
+       var selector = $('hold_alt_form_selector');
+       var vals = getSelectedList(selector);
+
+       if(vals.length == 0) return;
+
+       if( holdArgs.type == 'T' ) 
+               vals.push(holdArgs.myFormat);
+
+       var fstring = "";
+
+       if( contains(vals, 'at-d') ) {
+               if( contains(vals, 'at') )
+                       fstring = 'at';
+               else 
+                       fstring = 'at-d';
+       } else {
+               if( contains(vals, 'at') )
+                       fstring = 'at';
+       }
+
+       for( var i = 0; i < vals.length; i++ ) {
+               var val = vals[i];
+               if( !val.match(/at/) ) fstring = val + fstring;
+       }
+
+       if( holdArgs.language ) {
+               if( fstring.match(/-/) )
+                       fstring = fstring + '-' + holdArgs.language;
+               else
+                       fstring = fstring + '--' + holdArgs.language;
+       }
+
+
+       return fstring;
 }
 
 
@@ -491,29 +543,35 @@ function holdsBuildHoldFromWindow() {
 
        switch(holdArgs.type) {
                case 'M':
-                       target = holdArgs.metarecord;
-                       break;
+                       target = holdArgs.metarecord; break;
                case 'T':
-                       target = holdArgs.record;
-                       break;
+                       target = holdArgs.record; break;
                case 'V':
-                       target = holdArgs.volume;
-                       break;
+                       target = holdArgs.volume; break;
                case 'C':
-                       target = holdArgs.copy;
-                       break;
+                       target = holdArgs.copy; break;
        }
 
 
+
        hold.pickup_lib(org); 
        hold.request_lib(org); 
        hold.requestor(holdArgs.requestor.id());
        hold.usr(holdArgs.recipient.id());
-       hold.hold_type(holdArgs.type);
        hold.target(target);
+       hold.hold_type(holdArgs.type);
+
+       /* check for alternate hold formats */
+       var fstring = holdsSetSelectedFormats();
+       if(fstring) { 
+               hold.hold_type('M'); 
+               hold.holdable_formats(fstring);
+               hold.target(holdArgs.metarecord);
+       }
 
        if(isXUL())             
                hold.selection_depth(getSelectorVal($('holds_depth_selector')));
+
        return hold;
 }
        
index 6a3c49a..45cec22 100644 (file)
@@ -286,7 +286,7 @@ function myOPACDrawHolds(r) {
                var form = $n(row, "myopac_holds_formats");
                /*form.id = "myopac_holds_form_" + h.id() + '_' + h.target();*/
                form.id = "myopac_holds_form_" + h.id();
-               if(formats) form.appendChild(text(formats));
+               //if(formats) form.appendChild(text(formats));
 
                var orglink = $n(row, "myopac_holds_location");
                orglink.appendChild(text(findOrgUnit(h.pickup_lib()).name()));
@@ -401,11 +401,18 @@ function _myOPACFleshHoldTitle(hold, holdObjects) {
        var form = $("myopac_holds_form_" + hold.id());
 
        if(form) {
-               var img = elem("img");
-               img.setAttribute("src", 
-                       buildImageLink('tor/' + record.types_of_resource()[0] + ".jpg"));
-               addCSSClass(img, "myopac_form_pic");
-               form.appendChild(img);
+               var formats = record.types_of_resource();
+
+               if( hold.hold_type() == 'M' ) {
+                       var data = holdsParseMRFormats(hold.holdable_formats());
+                       formats = data.formats;
+               }
+
+               for( var i = 0; i < formats.length; i++ ) {
+                       var img = elem("img");
+                       setResourcePic(img, formats[i]);
+                       form.appendChild(img);
+               }
        }
 }
 
index b0e96f8..02aa064 100644 (file)
                                <tr id='holds_alt_formats_row' class='hide_me'>
                                        <td class='holds_cell'>
                                                <div style='margin-bottom: 5px;'>
+                                                       <!--
                                                        Any of the following formats are acceptible for this hold: 
+                                                       -->
+                                                       I would be interested in receiving my hold in the following alternate formats:
                                                </div>
                                                <div>(control-click to select multiple formats)</div>
                                        </td>
                                        <td class='holds_cell'>
-                                               <select id='hold_alt_form_selector' multiple='true' style='width: 13em;'>
+                                               <select id='hold_alt_form_selector' multiple='true' style='width: 14em;'>
                                                        <option value='at'      class='hide_me'>&opac.search.books;</option>
                                                        <option value='at-d' class='hide_me'>&opac.search.largePrint;</option>
                                                        <option value='i'               class='hide_me'>&opac.search.audioBooks;</option>