use OpenILS::Utils::MFHD to help us label the groupings for our holdings
authorLebbeous Fogle-Weekley <lebbeous@esilibrary.com>
Fri, 2 Mar 2012 22:19:27 +0000 (17:19 -0500)
committerLebbeous Fogle-Weekley <lebbeous@esilibrary.com>
Wed, 7 Mar 2012 21:57:10 +0000 (16:57 -0500)
Signed-off-by: Lebbeous Fogle-Weekley <lebbeous@esilibrary.com>
Open-ILS/src/perlmods/lib/OpenILS/Application/Serial.pm
Open-ILS/src/perlmods/lib/OpenILS/Utils/MFHD/Holding.pm

index 1f0e7a3..5160307 100644 (file)
@@ -861,17 +861,34 @@ __PACKAGE__->register_method(
 
 # This is a helper for grouped_holdings_for_summary() later.
 sub _label_holding_level {
-    my ($pattern_field, $subfield, $value) = @_;
+    my ($pattern_field, $subfield, $value, $mfhd_cache) = @_;
 
-    # This may be naïve, in that a-e are sometimes chron fields and not enum.
+    # This is naïve, in that a-f are sometimes chron fields and not enum.
     # OpenILS::Utils::MFHD understands that, but so far I don't think our
     # interfaces do.
 
-    if ($subfield ge 'i') { # chron
-    } else {                # enum
+    my $cache_key = $subfield . $value;
+
+    if (not exists $mfhd_cache->{$cache_key}) {
+        my $link_id = (split(/\./, $pattern_field->subfield('8')))[0];
+        my $fake_holding = new MFHD::Holding(
+            1,
+            new MARC::Field('863', '4', '1', '8', "$link_id.1"),
+            new MFHD::Caption($pattern_field->clone)
+        );
+
+        if ($subfield ge 'i') { # chron
+            $mfhd_cache->{$cache_key} = $fake_holding->format_single_chron(
+                {$subfield => $value}, $subfield, 1, 1
+            );
+        } else {                # enum
+            $mfhd_cache->{$cache_key} = $fake_holding->format_single_enum(
+                {$subfield => $value}, $subfield, 1
+            );
+        }
     }
 
-    # XXX finish
+    return $mfhd_cache->{$cache_key};
 }
 
 # This is a helper for grouped_holdings_for_summary() later.
@@ -887,7 +904,7 @@ sub _get_deepest_holding_level {
 
 # This is a helper for grouped_holdings_for_summary() later.
 sub _make_grouped_holding_node {
-    my ($row, $subfield, $deepest_level, $pattern_field) = @_;
+    my ($row, $subfield, $deepest_level, $pattern_field, $mfhd_cache) = @_;
 
     return {
         $subfield eq $deepest_level ? (
@@ -896,7 +913,7 @@ sub _make_grouped_holding_node {
         ) : (
             value => $row->{value},
             label => _label_holding_level(
-                $pattern_field, $subfield, $row->{value}
+                $pattern_field, $subfield, $row->{value}, $mfhd_cache
             )
         )
     };
@@ -1065,9 +1082,15 @@ sub grouped_holdings_for_summary {
         }
     }) or return $e->die_event;
 
+    # This will help us avoid certain repetitive calculations. Examine
+    # _label_holding_level() to see what I mean.
+    my $mfhd_cache = {};
+
     # Make the tree we have so far.
     my $tree = [ map(
-        _make_grouped_holding_node($_,$subfield,$deepest_level,$pattern_field),
+        _make_grouped_holding_node(
+            $_, $subfield, $deepest_level, $pattern_field, $mfhd_cache
+        ),
         @$top
     ) ];
 
@@ -1139,7 +1162,7 @@ sub grouped_holdings_for_summary {
         $parent = $point->{children} = [
             map(
                 _make_grouped_holding_node(
-                    $_, $subfield, $deepest_level, $pattern_field
+                    $_, $subfield, $deepest_level, $pattern_field, $mfhd_cache
                 ),
                 @$level
             )
index 9922c88..920bfd2 100644 (file)
@@ -338,8 +338,13 @@ sub format_single_enum {
     if (substr($capstr, 0, 1) eq '(') {
         # a caption enclosed in parentheses is not displayed
         $capstr = '';
+    } elsif ($skip_sep) {
+        # We'll let a $skip_sep parameter of true mean what it means down by
+        # the return statement AND to pad the caption itself here.
+        $capstr .= ' ';
     }
 
+
     $skip_sep ||= ($key eq 'a');
     return ($skip_sep ? '' : $sep) . $capstr . $holding_values->{$key};
 }