LP 1189989: Add suspend option when placing hold
authorJason Stephenson <jason@sigio.com>
Fri, 21 Jul 2017 16:47:14 +0000 (12:47 -0400)
committerGalen Charlton <gmc@equinoxinitiative.org>
Wed, 2 Aug 2017 15:14:08 +0000 (11:14 -0400)
This commit adds some bells and whistles to the basic functionality:

1. Adds two new styles in style.css.tt2 for toggled blocks and inline
text.  These styles allow text with id attributes beginnging with
certain strings to be normally hidden and then shown when they are the
target of an active anchor.  Only the block form is currently used,
but the inline text version may prove useful in the near future.

2. Moves the "Suspend this hold?" language above the checkbox and adds
a variant to make it clear that all of the holds will be suspended
when multiple holds are placed.

3. Adds the question mark graphic with mouseover help text indicating
that a suspended hold will not be fulfilled until it has been
activated.

4. Adds a "Set activation date" anchor to toggle the appearance of the
text input for the optional thaw date.

5. Adds a script block with a JavaScript function to toggle the
appearance of the text input for the optional thaw date and to check
the suspend hold check box when first toggled.  This function returns
false to prohibit the href of the anchor from firing and toggling the
appearance via CSS.  If JavaScript is disabled, the input's appearance
will be toggled via CSS, but the checkbox will not be checked
automatically.

6. Adds language to the place hold results page to indicate if the
hold is suspended and adds the reactive date if supplied.

7. Modifies the backend holds code to not set the expire time on a
hold if it is suspended.  This is a logical extension of code added
for Lp bug #1076399: Activating an expired hold cancels the hold.

PLEASE NOTE: I would very much like to keep this branch in three
commits because the first commit is Bill Ott's initial implementation
from 2013.  The second commit is a fix to Bill's work required to make
it work with modern ttopac.  This third commit overs the expansion of
the functionality to meet MassLNC requirements.  I think it would
behoove us to keep these three pieces of work in distinct commits.

Signed-off-by: Jason Stephenson <jason@sigio.com>
Signed-off-by: Kathy Lussier <klussier@masslnc.org>
Signed-off-by: Galen Charlton <gmc@equinoxinitiative.org>
Open-ILS/src/perlmods/lib/OpenILS/Application/Circ/Holds.pm
Open-ILS/src/perlmods/lib/OpenILS/WWW/EGCatLoader/Account.pm
Open-ILS/src/templates/opac/css/style.css.tt2
Open-ILS/src/templates/opac/parts/place_hold.tt2
Open-ILS/src/templates/opac/parts/place_hold_result.tt2

index a331fac..c46ad21 100644 (file)
@@ -342,7 +342,7 @@ sub create_hold {
         $hold->expire_time(undef) if ($hold->expire_time && $U->datecmp($hold->expire_time) == -1);
 
     # set the configured expire time
-    unless($hold->expire_time) {
+    unless($hold->expire_time || $U->is_true($hold->frozen)) {
         $hold->expire_time(calculate_expire_time($recipient->home_ou));
     }
 
index 95bad4a..9c5f14d 100644 (file)
@@ -1036,6 +1036,9 @@ sub load_place_hold {
     }
     if ($cgi->param('hold_suspend')) {
         $ctx->{frozen} = 1;
+        # TODO: Make this support other date formats, not just mm/dd/yyyy.
+        # We should use a date input type on the forms once it is supported by Firefox.
+        # I didn't do that now because it is not available in a general release.
         if ($cgi->param('thaw_date') =~ m:^(\d{2})/(\d{2})/(\d{4})$:){
             $ctx->{thaw_date} = "$3-$1-$2";
         }
index 226b294..bdbb2d3 100644 (file)
@@ -3235,3 +3235,19 @@ label[for*=expert_]
 }
 .metarecord_filter_container select{padding: 2px;width: 13em; /* consistent w/ adv search selectors */}
 .metarecord_filter_header{padding-bottom: 5px;}
+
+/* Toggled items. */
+/* A block that is initially hidden and shown by clicking an anchor. */
+[id^="toggled-block-"]{
+    display: none;
+}
+[id^="toggled-block-"]:target{
+    display: block;
+}
+/* Inline text that is initially hidden and shown by clicking an anchor. Useful on a span. */
+[id^="toggled-inline-"]{
+    display: none;
+}
+[id^="toggled-inline-"]:target{
+    display: inline;
+}
index 0a759f0..1ec5862 100644 (file)
@@ -2,7 +2,29 @@
     PROCESS "opac/parts/hold_error_messages.tt2";
     PROCESS "opac/parts/metarecord_hold_filters.tt2";
 %]
-
+<script>
+// Toggle the activation date input and check the suspend checkbox.
+// If JavaScript is disabled, the CSS will handle the former, but
+// the latter will not happen.
+function toggleActivationDate() {
+    var cb = document.getElementById("hold_suspend");
+    var block = document.getElementById("toggled-block-suspend");
+    var anchor = document.getElementById("actDateToggle");
+    var actText = "[%- l('Hide activation date') -%]";
+    var inActText = "[%- l('Set activation date') -%]";
+    // Check for not equal to block so it works on first click.
+    if (block.style.display != "block") {
+        block.style.display = "block";
+        anchor.innerHTML = actText;
+        if (cb.checked != true) cb.checked = true;
+    } else {
+        block.style.display = "none";
+        anchor.innerHTML = inActText;
+    }
+    // Prevent the href from being followed, thus overriding the CSS.
+    return false;
+}
+</script>
 <div id='holds_box' class='canvas' style='margin-top: 6px;'>
     <h1>[% l('Place Hold') %]</h1>
 
                 [% END %]
             </blockquote>
             <blockquote>
-                <input type="checkbox" name="hold_suspend" value="t"/>[% l('Suspend This Hold?') %]
+                [% IF ctx.hold_data.size == 1;
+                      l('Suspend this hold?');
+                  ELSE;
+                      l('Suspend these holds?');
+                  END %]
+                <img src="[% ctx.media_prefix %]/images/question-mark.png"
+                     alt="[% l('Suspend Hold Help') %]"
+                     title="[% l('A suspended hold will retain its place in the queue, but will not be fulfilled until it has been activated.') %]" />
+                <br/>
+                <input type="checkbox" name="hold_suspend" id="hold_suspend" value="t"/> [% l('Yes') %]
+                <a id="actDateToggle" href="#toggled-block-suspend" onClick="return toggleActivationDate();">[% l('Set activation date') %]</a>
             </blockquote>
-            <blockquote>
-                [% l('If suspended, activate on') %]
-               <input type="text" name="thaw_date" value="[% thaw_date | html %]" />
-               <em>[% l('Enter date in MM/DD/YYYY format') %]</em>
+            <blockquote id="toggled-block-suspend">
+                <label for="thaw_date">[% l('Activate on') %]</label>
+                <input type="text" id="thaw_date" name="thaw_date" />
+                <em>[% l('Enter date in MM/DD/YYYY format') %]</em>
             </blockquote>
         </p>
         <input id="place_hold_submit" type="submit" name="submit" 
index d158e86..b2513a6 100644 (file)
 
                         <div class='success'>[% l("Hold was successfully placed"); %]</div>
 
+                        [% IF hdata.frozen %]
+                        <div>
+                        [% l("Hold is suspended") %]
+                        [% IF hdata.thaw_date %]
+                        <br/>
+                        [% l("Reactivate on [_1]", date.format(ctx.parse_datetime(hdata.thaw_date), DATE_FORMAT));
+                           END %]
+                        </div>
+                        [% END %]
+
                         [% IF ctx.is_staff %]
                             <script>
                                 window.addEventListener(