LP#1053397 MR holds filter display user/berick/lp1053397-tpac-metarecords-plus-composite
authorBill Erickson <berick@esilibrary.com>
Thu, 30 Jan 2014 17:16:27 +0000 (12:16 -0500)
committerBill Erickson <berick@esilibrary.com>
Thu, 30 Jan 2014 17:16:27 +0000 (12:16 -0500)
Signed-off-by: Bill Erickson <berick@esilibrary.com>
Open-ILS/src/perlmods/lib/OpenILS/WWW/EGCatLoader/Account.pm
Open-ILS/src/templates/opac/parts/metarecord_hold_filters.tt2 [new file with mode: 0644]
Open-ILS/src/templates/opac/parts/place_hold.tt2

index b950d08..462d9d4 100644 (file)
@@ -783,32 +783,15 @@ sub load_place_hold {
                 {flesh => 1, flesh_fields => {mmr => ['master_record']}}], 
                 {substream => 1}
             );
+
             for my $id (@targets) {
                 my ($mr) = grep {$_->id eq $id} @$mrecs;
                 push(@hold_data, $data_filler->({
                     target => $mr, 
-                    record => $mr->master_record
+                    record => $mr->master_record,
+                    metarecord_attrs => $self->get_mr_ccvms($mr->id)
                 }));
             }
-
-            # see which formats are available for the selected records.
-            # fetches search_label, value for each ccvm linked to the
-            # mr holds format attribute, for every record within this MR.
-            $ctx->{metarecord_formats} = $e->json_query({
-                select => {ccvm => ['id', 'value', 'search_label']},
-                from => {mraf => {
-                    cgf => {
-                        fkey => 'attr',
-                        field => 'value',
-                        filter => {name => 'opac.metarecord.holds.format_attr'}
-                    },
-                    ccvm => {
-                        fkey => 'attr',
-                        field => 'ctype'
-                    }
-                }},
-                where => {'+mraf' => {id => \@targets}}
-            });
         },
         T => sub {
             my $recs = $e->batch_retrieve_biblio_record_entry(\@targets, {substream => 1});
@@ -1086,6 +1069,48 @@ sub attempt_hold_placement {
     }
 }
 
+# fetches the CCVMs IDs representing available languages and formats 
+# for the constituent records of the selected metarecord.  
+sub get_mr_ccvms {
+    my ($self, $mr_id) = @_;
+    my $e = $self->editor;
+
+    my $bre_ids = 
+        $e->search_metabib_metarecord_source_map({metarecord => $mr_id});
+    $bre_ids = [map {$_->source} @$bre_ids];
+    
+    my $base_query = {
+        select => {ccvm => [{column => 'id', transform => 'distinct'}]},
+        from => {mraf => {
+            ccvm => {
+                fkey => 'attr',
+                field => 'ctype',
+                filter => {code => {'=' => {'+mraf' => 'value'}}}
+            }
+        }},
+        where => {'+mraf' => {id => $bre_ids}}
+    };
+
+    $base_query->{where}->{'+mraf'}->{attr} = 'item_lang';
+    my $langs = $e->json_query($base_query);
+
+    # the attr type used for format selection is configurable
+    delete $base_query->{where}->{'+mraf'}->{attr};
+    $base_query->{from}->{mraf}->{cgf} = {
+        fkey => 'attr',
+        field => 'value',
+        filter => {name => 'opac.metarecord.holds.format_attr'}
+    };
+    my $formats = $e->json_query($base_query);
+
+    return {
+        langs => [map { $_->{id} } @$langs],
+        formats => [map { $_->{id} } @$formats]
+    };
+}
+
+
+
 sub fetch_user_circs {
     my $self = shift;
     my $flesh = shift; # flesh bib data, etc.
diff --git a/Open-ILS/src/templates/opac/parts/metarecord_hold_filters.tt2 b/Open-ILS/src/templates/opac/parts/metarecord_hold_filters.tt2
new file mode 100644 (file)
index 0000000..ded56c3
--- /dev/null
@@ -0,0 +1,73 @@
+[%#
+Draws the format multi-select and the language multi-select for
+limiting the set of desired records for a given metarecord.
+%]
+
+[% BLOCK metarecord_hold_filters_selector;
+  format_ccvms = [];
+  lang_ccvms = [];
+  # some CCVMs have search_labels, some use the value as the label
+  # instead.  Accommodate both.
+  FOR ccvm_id IN metarecord_attrs.formats;
+    ccvm = ctx.get_ccvm(ccvm_id);
+    IF NOT ccvm.search_label; ccvm.search_label(ccvm.value); END;
+    format_ccvms.push(ccvm);
+  END;
+  FOR ccvm_id IN metarecord_attrs.langs;
+    ccvm = ctx.get_ccvm(ccvm_id);
+    IF NOT ccvm.search_label; ccvm.search_label(ccvm.value); END;
+    lang_ccvms.push(ccvm);
+  END;
+%]
+
+<style>
+  /* TODO: MOVE ME */
+  .metarecord_filters {
+      width: 75%;
+      padding: 5px;
+      margin-top: 5px;
+      border-bottom: 1px solid #333;
+      border-top: 1px solid #333;
+  }
+  .metarecord_filter_container {
+    float : left;
+    margin-right: 10px;
+  }
+  .metarecord_filter_container select {
+    padding: 5px;
+  }
+  .metarecord_filter_header {
+    padding: 5px;
+  }
+</style>
+
+<div class="metarecord_filters">
+  <div class="metarecord_filter_container">
+    <div class="metarecord_filter_header">
+      <div>[% l('Select your desired format(s).') %]</div>
+    </div>
+    <select multiple='multiple' name="metarecord_formats">
+      [% FOR ccvm IN format_ccvms.sort('search_label') %]
+        <option value="[% ccvm.code %]">
+          [% ccvm.search_label | html %]
+        </option>
+      [% END %]
+    </select>
+    <input type="hidden" 
+      name="metarecord_format_attr" value="[% format_ccvms.0.ctype %]"/>
+  </div>
+  <div class="metarecord_filter_container">
+    <div class="metarecord_filter_header">
+      [% l('Select your desired language(s)') %]
+    </div>
+    <select multiple='multiple' name="metarecord_langs">
+      [% FOR lang_ccvm IN lang_ccvms.sort('search_label') %]
+        <option value="[% lang_ccvm.code %]">
+          [% lang_ccvm.search_label | html %]
+        </option>
+      [% END %]
+    </select>
+  </div>
+  <div class="clear-both">&nbsp;</div>
+</div>
+[% END # metarecord_hold_filters_selector %]
index f12cd56..9209efe 100644 (file)
@@ -1,5 +1,6 @@
 [%  PROCESS "opac/parts/misc_util.tt2";
     PROCESS "opac/parts/hold_error_messages.tt2";
+    PROCESS "opac/parts/metarecord_hold_filters.tt2"
 %]
 
 <div id='holds_box' class='canvas' style='margin-top: 6px;'>
                         <input type='hidden' name='part' value=''/>
                         [% END %]
                     [% END %]
+                    [% IF hdata.metarecord_attrs.formats.size OR # should this be > 1 also?
+                          hdata.metarecord_attrs.langs.size > 1;
+                        PROCESS metarecord_hold_filters_selector 
+                            metarecord_attrs=hdata.metarecord_attrs;
+                    END %]
                 </td>
             </tr>
         [% END %]