diff --git a/themes/bootstrap3/templates/Recommend/VisualFacets.phtml b/themes/bootstrap3/templates/Recommend/VisualFacets.phtml index a0b56b9cee5b95e53bb3738f81bff5baf2cda7df..a250ef53528f863094dac343f5eceb2bb3dd7fcc 100644 --- a/themes/bootstrap3/templates/Recommend/VisualFacets.phtml +++ b/themes/bootstrap3/templates/Recommend/VisualFacets.phtml @@ -12,11 +12,13 @@ $toplevelinfo['name'] = $toplevelfacet['value']; $toplevelinfo['field'] = $toplevelfacet['field']; $toplevelinfo['size'] = $toplevelfacet['count']; - foreach($toplevelfacet['pivot'] as $secondlevelfacet) { + $pivot = isset($toplevelfacet['pivot']) ? $toplevelfacet['pivot'] : []; + foreach($pivot as $secondlevelfacet) { $secondlevelinfo = []; $secondlevelinfo['name'] = $secondlevelfacet['value']; $secondlevelinfo['size'] = $secondlevelfacet['count']; $secondlevelinfo['field'] = $secondlevelfacet['field']; + $secondlevelinfo['parentfield'] = $toplevelinfo['field']; $secondlevelinfo['parentlevel'] = $toplevelinfo['name']; array_push($toplevelchildren, $secondlevelinfo); } @@ -142,7 +144,7 @@ // Stop! Using this algorithm, sometimes all of the topics wind // up in a "More" facet, which leads to a confusing display. If // that happens, just display the top level, with no topic - // boxes inside the callnumber-first box. + // boxes inside the main box. if (morefacet == totalbyfirstpivot) { var onechild = new Object(); @@ -158,8 +160,9 @@ var more = new Object(); more.name = "<?=$this->transEsc('More Topics')?>"; more.size = morefacet/totalbyfirstpivot * facetdata.size; - more.field = "topic_facet"; + more.field = ""; // this value doesn't matter, since parent field will be linked. more.count = morecount; + more.parentfield = facetdata.field; more.parentlevel = facetdata.name; pivotdata.children[facetindex].children.push(more); } @@ -171,20 +174,20 @@ .enter().append("a") .attr("href", function(d) { if (d.parentlevel && d.name != "<?=$this->transEsc('More Topics')?>") { - return window.location + "&filter[]=" + d.field + ":\"" + d.name + "\"&filter[]=callnumber-first:\"" + d.parentlevel + "\"&view=list"; + return window.location + "&filter[]=" + d.field + ":\"" + encodeURIComponent(d.name) + "\"&filter[]=" + d.parentfield + ":\"" + encodeURIComponent(d.parentlevel) + "\"&view=list"; } else if (d.name == "<?=$this->transEsc('More Topics')?>") { - return window.location + "&filter[]=callnumber-first:\"" + d.parentlevel + "\""; + return window.location + "&filter[]=" + d.parentfield + ":\"" + encodeURIComponent(d.parentlevel) + "\""; } else if (d.name != "theData") { - return window.location + "&filter[]=" + d.field + ":\"" + d.name + "\""; + return window.location + "&filter[]=" + d.field + ":\"" + encodeURIComponent(d.name) + "\""; } }) .append("div") - .attr("class", function(d) { return d.field == "callnumber-first" ? "node toplevel" : "node secondlevel" }) + .attr("class", function(d) { return (typeof d.parentfield === "undefined") ? "node toplevel" : "node secondlevel" }) .attr("id", function(d) { return d.name.replace(/\s+/g, ''); }) .call(position) .style("background", function(d) { return d.children ? color(d.name.substr(0,1)) : null; }) .call(settitle) - .style("z-index", function(d) { return d.field == "topic_facet" ? "1" : "0" }) + .style("z-index", function(d) { return (typeof d.parentfield !== "undefined") ? "1" : "0" }) .attr("tabindex", 0) .append("div") .call(settext) @@ -203,17 +206,34 @@ function position() { function settext() { this.text(function(d) { - if (!d.children && d.field == "callnumber-first") {return "";} - if (d.field == "callnumber-first") {return d.name + " (" + d.count + ")"; } - if (d.field == "topic_facet" && d.name == "<?=$this->transEsc('More Topics')?>") {var topics = "<?=$this->translate('more_topics')?>"; return topics.replace("%%count%%", d.count); } - if (d.field == "topic_facet") {return d.name + " (" + d.count + ")"; } + // Is this a top-level box? + var onTop = (typeof d.parentfield === "undefined"); + + // Case 1: top with no children -- no text! + if (!d.children && onTop) { + return ""; + } + + // Case 2: top-level field with contents: + if (onTop) { + return d.name + " (" + d.count + ")"; + } + + // Case 3: "More Topics" special-case collapsed block: + if (d.name == "<?=$this->transEsc('More Topics')?>") { + var topics = "<?=$this->translate('more_topics')?>"; + return topics.replace("%%count%%", d.count); + } + + // Csae 4 (default): Standard second-level field + return d.name + " (" + d.count + ")"; }); } function setscreenreader() { this.attr("class", "sr-only") .text(function(d) { - if (d.field == "topic_facet") { + if (typeof d.parentfield !== "undefined") { return "<?=$this->transEsc('visual_facet_parent')?> " + d.parentlevel; } else { return ""; @@ -223,9 +243,20 @@ function setscreenreader() { function settitle() { this.attr("title", function(d) { - if (d.field == "callnumber-first") {return d.name + " (" + d.count + " <?=$this->transEsc('items')?>)"; } - if (d.field == "topic_facet" && d.name == "<?=$this->transEsc('More Topics')?>") {return d.count + " <?=$this->transEsc('More Topics')?>"; } - if (d.field == "topic_facet") {var on_topic = "<?=$this->translate('on_topic')?>"; return d.name + " (" + on_topic.replace("%%count%%", d.count) + ")"; } + // Case 1: Top-level field + if (typeof d.parentfield === "undefined") { + return d.name + " (" + d.count + " <?=$this->transEsc('items')?>)"; + } + // Case 2: "More Topics" special-case collapsed block: + if (d.name == "<?=$this->transEsc('More Topics')?>") { + return d.count + " <?=$this->transEsc('More Topics')?>"; + } + + // Case 3: Standard second-level field + if (typeof d.field !== "undefined") { + var on_topic = "<?=$this->translate('on_topic')?>"; + return d.name + " (" + on_topic.replace("%%count%%", d.count) + ")"; + } }); }