Browse Source

HUE-1329 [search] Improve label of range facets

Added range to ranges
Removed link from the counters
Introduced formatting for dates and added range
Enrico Berti 12 years ago
parent
commit
f9cf620cd7

+ 19 - 0
apps/search/src/search/models.py

@@ -276,6 +276,24 @@ class Collection(models.Model):
     return sorted([{'name': field.get('name'),'type': field.get('type')}
     return sorted([{'name': field.get('name'),'type': field.get('type')}
                    for fields in schema.iter('fields') for field in fields.iter('field')])
                    for fields in schema.iter('fields') for field in fields.iter('field')])
 
 
+def get_facet_field_format(field, type, facets):
+  format = ""
+  try:
+    if type == 'field':
+      for fld in facets['fields']:
+        if fld['field'] == field:
+          format = fld['format']
+    elif type == 'range':
+      for fld in facets['ranges']:
+        if fld['field'] == field:
+          format = fld['format']
+    elif type == 'date':
+      for fld in facets['dates']:
+        if fld['field'] == field:
+          format = fld['format']
+  except:
+    pass
+  return format
 
 
 def get_facet_field_label(field, type, facets):
 def get_facet_field_label(field, type, facets):
   label = field
   label = field
@@ -355,6 +373,7 @@ def augment_solr_response(response, facets):
           'field': cat,
           'field': cat,
           'type': 'date',
           'type': 'date',
           'label': get_facet_field_label(cat, 'date', facets),
           'label': get_facet_field_label(cat, 'date', facets),
+          'format': get_facet_field_format(cat, 'date', facets),
           'start': response['facet_counts']['facet_dates'][cat]['start'],
           'start': response['facet_counts']['facet_dates'][cat]['start'],
           'end': response['facet_counts']['facet_dates'][cat]['end'],
           'end': response['facet_counts']['facet_dates'][cat]['end'],
           'gap': response['facet_counts']['facet_dates'][cat]['gap'],
           'gap': response['facet_counts']['facet_dates'][cat]['gap'],

+ 307 - 9
apps/search/src/search/templates/admin_collection_facets.mako

@@ -97,8 +97,10 @@ ${ commonheader(_('Search'), "search", user, "40px") | n,unicode }
             ${_('Field')}
             ${_('Field')}
             <select id="select-field-facet" data-bind="options: fieldFacetsList, value: selectedFieldFacet"></select>
             <select id="select-field-facet" data-bind="options: fieldFacetsList, value: selectedFieldFacet"></select>
             &nbsp;${_('Label')}
             &nbsp;${_('Label')}
-            <input type="text" data-bind="value: selectedFieldLabel" class="input" />
-            <a class="btn" data-bind="click: $root.addFieldFacet"><i class="icon-plus"></i> ${_('Add')}</a>
+            <input id="selectedFieldLabel" type="text" data-bind="value: selectedFieldLabel" class="input" />
+            <br/>
+            <br/>
+            <a class="btn" data-bind="click: $root.addFieldFacet"><i class="icon-plus-sign"></i> ${_('Add to Field Facets')}</a>
             &nbsp;<span id="field-facet-error" class="label label-important hide">${_('The field you are trying to add is already in the list.')}</span>
             &nbsp;<span id="field-facet-error" class="label label-important hide">${_('The field you are trying to add is already in the list.')}</span>
           </div>
           </div>
         </div>
         </div>
@@ -122,14 +124,18 @@ ${ commonheader(_('Search'), "search", user, "40px") | n,unicode }
           ${_('Field')}
           ${_('Field')}
           <select data-bind="options: rangeFacetsList, value: selectedRangeFacet"></select>
           <select data-bind="options: rangeFacetsList, value: selectedRangeFacet"></select>
           &nbsp;${_('Label')}
           &nbsp;${_('Label')}
-          <input type="text" data-bind="value: selectedRangeLabel" class="input" />
-          &nbsp;${_('Start')}
+          <input id="selectedRangeLabel" type="text" data-bind="value: selectedRangeLabel" class="input" />
+          <br/>
+          <br/>
+          ${_('Start')}
           <input type="number" data-bind="value: selectedRangeStartFacet" class="input-mini" />
           <input type="number" data-bind="value: selectedRangeStartFacet" class="input-mini" />
           &nbsp;${_('End')}
           &nbsp;${_('End')}
           <input type="number" data-bind="value: selectedRangeEndFacet" class="input-mini" />
           <input type="number" data-bind="value: selectedRangeEndFacet" class="input-mini" />
           &nbsp;${_('Gap')}
           &nbsp;${_('Gap')}
           <input type="number" data-bind="value: selectedRangeGapFacet" class="input-mini" />
           <input type="number" data-bind="value: selectedRangeGapFacet" class="input-mini" />
-          <a class="btn" data-bind="click: $root.addRangeFacet"><i class="icon-plus"></i> ${_('Add')}</a>
+          <br/>
+          <br/>
+          <a class="btn" data-bind="click: $root.addRangeFacet"><i class="icon-plus-sign"></i> ${_('Add to Range Facets')}</a>
         </div>
         </div>
       </div>
       </div>
 
 
@@ -142,7 +148,7 @@ ${ commonheader(_('Search'), "search", user, "40px") | n,unicode }
             <strong><span data-bind="text: label"></span></strong>
             <strong><span data-bind="text: label"></span></strong>
             <span style="color:#666;font-size: 12px">
             <span style="color:#666;font-size: 12px">
               (<span data-bind="text: field"></span>, <span data-bind="text: start"></span> <i class="icon-double-angle-right"></i> <span data-bind="text: end"></span>,
               (<span data-bind="text: field"></span>, <span data-bind="text: start"></span> <i class="icon-double-angle-right"></i> <span data-bind="text: end"></span>,
-              <i class="icon-resize-horizontal"></i> <span data-bind="text: gap"></span>)
+              <i class="icon-resize-horizontal"></i> <span data-bind="text: gap"></span><span data-bind="visible: format != ''">, <i class="icon-calendar"></i> <span data-bind="text: format"></span></span>)
             </span>
             </span>
             <a class="btn btn-small" data-bind="click: $root.removeDateFacet"><i class="icon-trash"></i></a>
             <a class="btn btn-small" data-bind="click: $root.removeDateFacet"><i class="icon-trash"></i></a>
           </div>
           </div>
@@ -152,7 +158,7 @@ ${ commonheader(_('Search'), "search", user, "40px") | n,unicode }
           ${_('Field')}
           ${_('Field')}
           <select data-bind="options: dateFacetsList, value: selectedDateFacet"></select>
           <select data-bind="options: dateFacetsList, value: selectedDateFacet"></select>
           &nbsp;${_('Label')}
           &nbsp;${_('Label')}
-          <input type="text" data-bind="value: selectedDateLabel" class="input" />
+          <input id="selectedDateLabel" type="text" data-bind="value: selectedDateLabel" class="input" />
           <br/>
           <br/>
           <br/>
           <br/>
           <span>
           <span>
@@ -167,7 +173,13 @@ ${ commonheader(_('Search'), "search", user, "40px") | n,unicode }
             &nbsp;${_('before today. Goes up by increments of')}
             &nbsp;${_('before today. Goes up by increments of')}
             <span id="scriptTable" data-bind="template: {name: 'scriptDateMath', data: selectedDateDateMaths()[2]}"/>
             <span id="scriptTable" data-bind="template: {name: 'scriptDateMath', data: selectedDateDateMaths()[2]}"/>
           </span>
           </span>
-          <a class="btn" data-bind="click: $root.addDateFacet"><i class="icon-plus"></i> ${_('Add')}</a>
+          <br/>
+          <br/>
+          ${_('Date format')}
+          <input id="dateFormatInput" type="text" data-bind="value: selectedDateFormat" class="input" /> <a href="#formatHelpModal" class="btn btn-mini" data-toggle="modal"><i class="icon-question-sign"></i></a>
+          <br/>
+          <br/>
+          <a class="btn" data-bind="click: $root.addDateFacet"><i class="icon-plus-sign"></i> ${_('Add to Date Facets')}</a>
         </div>
         </div>
       </div>
       </div>
 
 
@@ -209,6 +221,263 @@ ${ commonheader(_('Search'), "search", user, "40px") | n,unicode }
   </%def>
   </%def>
 </%layout:skeleton>
 </%layout:skeleton>
 
 
+
+<div id="formatHelpModal" class="modal hide fade">
+  <div class="modal-header">
+    <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
+    <h3>${ _('Format Help') }</h3>
+  </div>
+  <div class="modal-body">
+    <p>
+      ${ _('You can specify here how you want the date to be formatted.')}
+      <br/>
+      ${ _('Use a predefined format:')}
+      <br/>
+      <table class="table table-striped table-bordered">
+      <tr>
+        <td>
+          <a href="javascript:void(0)" class="formatChooser">FROMNOW</a>
+        </td>
+      </tr>
+      <tr>
+        <td>
+          <a href="javascript:void(0)" class="formatChooser">YYYY/MM/DD</a>
+        </td>
+      </tr>
+      <tr>
+        <td>
+          <a href="javascript:void(0)" class="formatChooser">YYYY/MM/DD HH:mm</a>
+        </td>
+      </tr>
+      <tr>
+        <td>
+          <a href="javascript:void(0)" class="formatChooser">YYYY/MM/DD HH:mm:ss</a>
+        </td>
+      </tr>
+      <tr>
+        <td>
+          <a href="javascript:void(0)" class="formatChooser">HH:mm</a>
+        </td>
+      </tr>
+      <tr>
+        <td>
+          <a href="javascript:void(0)" class="formatChooser">HH:mm:ss</a>
+        </td>
+      </tr>
+    </table>
+    ${ _('or any combination of these fields:')} <br/><br/>
+
+    <table class="table table-striped table-bordered">
+  <tbody>
+    <tr>
+      <th></th>
+      <th>${ _('Token')}</th>
+      <th>${ _('Output')}</th>
+    </tr>
+    <tr>
+      <td><b>${ _('Relative time')}</b></td>
+      <td>FROMNOW</td>
+      <td>${_('9 hours ago')}</td>
+    </tr>
+    <tr>
+      <td><b>${ _('Month')}</b></td>
+      <td>M</td>
+      <td>1 2 ... 11 12</td>
+    </tr>
+    <tr>
+      <td></td>
+      <td>Mo</td>
+      <td>1st 2nd ... 11th 12th</td>
+    </tr>
+    <tr>
+      <td></td>
+      <td>MM</td>
+      <td>01 02 ... 11 12</td>
+    </tr>
+    <tr>
+      <td></td>
+      <td>MMM</td>
+      <td>${ _('Jan Feb ... Nov Dec')}</td>
+    </tr>
+    <tr>
+      <td></td>
+      <td>MMMM</td>
+      <td>${ _('January February ... November December')}</td>
+    </tr>
+    <tr>
+      <td><b>${ _('Day of Month')}</b></td>
+      <td>D</td>
+      <td>1 2 ... 30 30</td>
+    </tr>
+    <tr>
+      <td></td>
+      <td>Do</td>
+      <td>${ _('1st 2nd ... 30th 31st')}</td>
+    </tr>
+    <tr>
+      <td></td>
+      <td>DD</td>
+      <td>01 02 ... 30 31</td>
+    </tr>
+    <tr>
+      <td><b>${ _('Day of Year')}</b></td>
+      <td>DDD</td>
+      <td>1 2 ... 364 365</td>
+    </tr>
+    <tr>
+      <td></td>
+      <td>DDDo</td>
+      <td>${ _('1st 2nd ... 364th 365th')}</td>
+    </tr>
+    <tr>
+      <td></td>
+      <td>DDDD</td>
+      <td>001 002 ... 364 365</td>
+    </tr>
+    <tr>
+      <td><b>${ _('Day of Week')}</b></td>
+      <td>d</td>
+      <td>0 1 ... 5 6</td>
+    </tr>
+    <tr>
+      <td></td>
+      <td>do</td>
+      <td>${ _('0th 1st ... 5th 6th')}</td>
+    </tr>
+    <tr>
+      <td></td>
+      <td>ddd</td>
+      <td>${ _('Sun Mon ... Fri Sat')}</td>
+    </tr>
+    <tr>
+      <td></td>
+      <td>dddd</td>
+      <td>${ _('Sunday Monday ... Friday Saturday')}</td>
+    </tr>
+    <tr>
+      <td><b>${ _('Week of Year')}</b></td>
+      <td>w</td>
+      <td>1 2 ... 52 53</td>
+    </tr>
+    <tr>
+      <td></td>
+      <td>wo</td>
+      <td>${ _('1st 2nd ... 52nd 53rd')}</td>
+    </tr>
+    <tr>
+      <td></td>
+      <td>ww</td>
+      <td>01 02 ... 52 53</td>
+    </tr>
+    <tr>
+      <td><b>${ _('ISO Week of Year')}</b></td>
+      <td>W</td>
+      <td>1 2 ... 52 53</td>
+    </tr>
+    <tr>
+      <td></td>
+      <td>Wo</td>
+      <td>${ _('1st 2nd ... 52nd 53rd')}</td>
+    </tr>
+    <tr>
+      <td></td>
+      <td>WW</td>
+      <td>01 02 ... 52 53</td>
+    </tr>
+    <tr>
+      <td><b>${ _('Year')}</b></td>
+      <td>YY</td>
+      <td>70 71 ... 29 30</td>
+    </tr>
+    <tr>
+      <td></td>
+      <td>YYYY</td>
+      <td>1970 1971 ... 2029 2030</td>
+    </tr>
+    <tr>
+      <td><b>AM/PM</b></td>
+      <td>A</td>
+      <td>AM PM</td>
+    </tr>
+    <tr>
+      <td></td>
+      <td>a</td>
+      <td>am pm</td>
+    </tr>
+    <tr>
+      <td><b>${ _('Hour')}</b></td>
+      <td>H</td>
+      <td>0 1 ... 22 23</td>
+    </tr>
+    <tr>
+      <td></td>
+      <td>HH</td>
+      <td>00 01 ... 22 23</td>
+    </tr>
+    <tr>
+      <td></td>
+      <td>h</td>
+      <td>1 2 ... 11 12</td>
+    </tr>
+    <tr>
+      <td></td>
+      <td>hh</td>
+      <td>01 02 ... 11 12</td>
+    </tr>
+    <tr>
+      <td><b>${ _('Minute')}</b></td>
+      <td>m</td>
+      <td>0 1 ... 58 59</td>
+    </tr>
+    <tr>
+      <td></td>
+      <td>mm</td>
+      <td>00 01 ... 58 59</td>
+    </tr>
+    <tr>
+      <td><b>${ _('Second')}</b></td>
+      <td>s</td>
+      <td>0 1 ... 58 59</td>
+    </tr>
+    <tr>
+      <td></td>
+      <td>ss</td>
+      <td>00 01 ... 58 59</td>
+    </tr>
+    <tr>
+      <td><b>${ _('Fractional Second')}</b></td>
+      <td>S</td>
+      <td>0 1 ... 8 9</td>
+    </tr>
+    <tr>
+      <td></td>
+      <td>SS</td>
+      <td>0 1 ... 98 99</td>
+    </tr>
+    <tr>
+      <td></td>
+      <td>SSS</td>
+      <td>0 1 ... 998 999</td>
+    </tr>
+    <tr>
+      <td></td>
+      <td>ss</td>
+      <td>00 01 ... 58 59</td>
+    </tr>
+    <tr>
+      <td><b>${ _('Unix Timestamp')}</b></td>
+      <td>X</td>
+      <td>1360013296</td>
+    </tr>
+  </tbody>
+</table>
+    </p>
+  </div>
+  <div class="modal-footer">
+    <a href="javascript:void(0)" class="btn" data-dismiss="modal">${ _('Close')}</a>
+  </div>
+</div>
+
 <link rel="stylesheet" href="/static/ext/css/bootstrap-datepicker.min.css" type="text/css" media="screen" title="no title" charset="utf-8" />
 <link rel="stylesheet" href="/static/ext/css/bootstrap-datepicker.min.css" type="text/css" media="screen" title="no title" charset="utf-8" />
 <link href="/static/ext/css/bootstrap-editable.css" rel="stylesheet">
 <link href="/static/ext/css/bootstrap-editable.css" rel="stylesheet">
 
 
@@ -239,6 +508,7 @@ ${ commonheader(_('Search'), "search", user, "40px") | n,unicode }
       type: args['type'],
       type: args['type'],
       field: args['field'],
       field: args['field'],
       label: args['label'],
       label: args['label'],
+      format: args['format'],
       start: args['start'],
       start: args['start'],
       end: args['end'],
       end: args['end'],
       gap: args['gap'],
       gap: args['gap'],
@@ -256,7 +526,7 @@ ${ commonheader(_('Search'), "search", user, "40px") | n,unicode }
   }
   }
 
 
   var DateFacet = function (obj) {
   var DateFacet = function (obj) {
-    return new Facet({type: "date", field: obj.field, label: obj.label, start: obj.start, end: obj.end, gap: obj.gap, uuid: obj.uuid});
+    return new Facet({type: "date", field: obj.field, label: obj.label, format: obj.format, start: obj.start, end: obj.end, gap: obj.gap, uuid: obj.uuid});
   }
   }
 
 
   var Properties = function (properties) {
   var Properties = function (properties) {
@@ -322,6 +592,7 @@ ${ commonheader(_('Search'), "search", user, "40px") | n,unicode }
       return new DateFacet({
       return new DateFacet({
           field: obj.field,
           field: obj.field,
           label: obj.label,
           label: obj.label,
+          format: obj.format,
           start: new DateMath(obj.start),
           start: new DateMath(obj.start),
           end: new DateMath(obj.end),
           end: new DateMath(obj.end),
           gap: new DateMath(obj.gap),
           gap: new DateMath(obj.gap),
@@ -344,15 +615,26 @@ ${ commonheader(_('Search'), "search", user, "40px") | n,unicode }
     })
     })
 
 
     self.selectedFieldFacet = ko.observable();
     self.selectedFieldFacet = ko.observable();
+    self.selectedFieldFacet.subscribe(function (newValue) {
+      $("#selectedFieldLabel").prop("placeholder", newValue);
+    });
     self.selectedFieldLabel = ko.observable("");
     self.selectedFieldLabel = ko.observable("");
+
     self.selectedRangeFacet = ko.observable();
     self.selectedRangeFacet = ko.observable();
+    self.selectedRangeFacet.subscribe(function (newValue) {
+      $("#selectedRangeLabel").prop("placeholder", newValue);
+    });
     self.selectedRangeLabel = ko.observable("");
     self.selectedRangeLabel = ko.observable("");
     self.selectedRangeStartFacet = ko.observable(0);
     self.selectedRangeStartFacet = ko.observable(0);
     self.selectedRangeEndFacet = ko.observable(100);
     self.selectedRangeEndFacet = ko.observable(100);
     self.selectedRangeGapFacet = ko.observable(10);
     self.selectedRangeGapFacet = ko.observable(10);
 
 
     self.selectedDateFacet = ko.observable();
     self.selectedDateFacet = ko.observable();
+    self.selectedDateFacet.subscribe(function (newValue) {
+      $("#selectedDateLabel").prop("placeholder", newValue);
+    });
     self.selectedDateLabel = ko.observable("");
     self.selectedDateLabel = ko.observable("");
+    self.selectedDateFormat = ko.observable("");
 
 
     self.selectedDateDateMaths = ko.observableArray([
     self.selectedDateDateMaths = ko.observableArray([
         // Same as addDateFacet()
         // Same as addDateFacet()
@@ -443,6 +725,7 @@ ${ commonheader(_('Search'), "search", user, "40px") | n,unicode }
       var newFacet = new DateFacet({
       var newFacet = new DateFacet({
           field: self.selectedDateFacet(),
           field: self.selectedDateFacet(),
           label: self.selectedDateLabel(),
           label: self.selectedDateLabel(),
+          format: self.selectedDateFormat(),
           start: self.selectedDateDateMaths()[0],
           start: self.selectedDateDateMaths()[0],
           end: self.selectedDateDateMaths()[1],
           end: self.selectedDateDateMaths()[1],
           gap: self.selectedDateDateMaths()[2]
           gap: self.selectedDateDateMaths()[2]
@@ -450,6 +733,7 @@ ${ commonheader(_('Search'), "search", user, "40px") | n,unicode }
       self.dateFacets.push(newFacet);
       self.dateFacets.push(newFacet);
       self.sortableFacets.push(newFacet);
       self.sortableFacets.push(newFacet);
       self.selectedDateLabel("");
       self.selectedDateLabel("");
+      self.selectedDateFormat("");
       self.selectedDateDateMaths([
       self.selectedDateDateMaths([
         new DateMath({frequency: 10, unit: 'DAYS'}),
         new DateMath({frequency: 10, unit: 'DAYS'}),
         new DateMath({frequency: 0, unit: 'DAYS'}),
         new DateMath({frequency: 0, unit: 'DAYS'}),
@@ -578,6 +862,20 @@ ${ commonheader(_('Search'), "search", user, "40px") | n,unicode }
           routie("step" + nextStep);
           routie("step" + nextStep);
         }
         }
       });
       });
+
+      $(".formatChooser").on("click", function(){
+        viewModel.selectedDateFormat($(this).text());
+        $("#formatHelpModal").modal("hide");
+      });
+      var _typeSource = [];
+      $(".formatChooser").each(function(){
+        _typeSource.push($(this).text());
+      });
+
+      $("#dateFormatInput").typeahead({
+        source: _typeSource
+      });
+
   });
   });
 </script>
 </script>
 
 

+ 9 - 3
apps/search/src/search/templates/admin_collection_sorting.mako

@@ -49,7 +49,7 @@ ${ commonheader(_('Search'), "search", user, "40px") | n,unicode }
         </div>
         </div>
       </div>
       </div>
 
 
-      <div class="section">
+      <div class="section" style="padding: 5px">
         <div data-bind="visible: sortingFields().length == 0" style="padding-left: 10px;margin-bottom: 20px">
         <div data-bind="visible: sortingFields().length == 0" style="padding-left: 10px;margin-bottom: 20px">
           <em>${_('There are currently no fields defined.')}</em>
           <em>${_('There are currently no fields defined.')}</em>
         </div>
         </div>
@@ -67,13 +67,15 @@ ${ commonheader(_('Search'), "search", user, "40px") | n,unicode }
           ${_('Field')}
           ${_('Field')}
           <select data-bind="options: sortingFieldsList, value: newFieldSelect"></select>
           <select data-bind="options: sortingFieldsList, value: newFieldSelect"></select>
           &nbsp;${_('Label')}
           &nbsp;${_('Label')}
-          <input type="text" data-bind="value: newFieldLabel" class="input" />
+          <input id="newFieldLabel" type="text" data-bind="value: newFieldLabel" class="input" />
           &nbsp;${_('Sorting')}
           &nbsp;${_('Sorting')}
           <div class="btn-group" style="display: inline">
           <div class="btn-group" style="display: inline">
             <button id="newFieldAsc" type="button" data-bind="css: {'active': newFieldAscDesc() == 'asc', 'btn': true}"><i class="icon-arrow-up"></i></button>
             <button id="newFieldAsc" type="button" data-bind="css: {'active': newFieldAscDesc() == 'asc', 'btn': true}"><i class="icon-arrow-up"></i></button>
             <button id="newFieldDesc" type="button" data-bind="css: {'active': newFieldAscDesc() == 'desc', 'btn': true}"><i class="icon-arrow-down"></i></button>
             <button id="newFieldDesc" type="button" data-bind="css: {'active': newFieldAscDesc() == 'desc', 'btn': true}"><i class="icon-arrow-down"></i></button>
           </div>
           </div>
-          &nbsp;&nbsp;<a class="btn" data-bind="click: $root.addSortingField"><i class="icon-plus"></i> ${_('Add')}</a>
+          <br/>
+          <br/>
+          <a class="btn" data-bind="click: $root.addSortingField"><i class="icon-plus-sign"></i> ${_('Add to Sorting')}</a>
         </div>
         </div>
       </div>
       </div>
 
 
@@ -132,6 +134,10 @@ ${ commonheader(_('Search'), "search", user, "40px") | n,unicode }
     self.sortingFieldsList = ko.observableArray(${ hue_collection.fields | n,unicode });
     self.sortingFieldsList = ko.observableArray(${ hue_collection.fields | n,unicode });
 
 
     self.newFieldSelect = ko.observable();
     self.newFieldSelect = ko.observable();
+    self.newFieldSelect.subscribe(function (newValue) {
+      $("#newFieldLabel").prop("placeholder", newValue);
+    });
+
     self.newFieldLabel = ko.observable("");
     self.newFieldLabel = ko.observable("");
     self.newFieldAscDesc = ko.observable("asc");
     self.newFieldAscDesc = ko.observable("asc");
 
 

+ 22 - 5
apps/search/src/search/templates/search.mako

@@ -104,10 +104,10 @@ ${ commonheader(_('Search'), "search", user, "40px") | n,unicode }
                 <li><a href='?collection=${ current_collection }&query=${ solr_query['q'] }&fq=${ solr_query['fq'] }|${ fld['field'] }:"${ urllib.quote_plus(group.encode('ascii', 'xmlcharrefreplace')) }"${solr_query.get("sort") and '&sort=' + solr_query.get("sort") or ''}'>${group}</a> <span class="counter">(${ count })</span></li>
                 <li><a href='?collection=${ current_collection }&query=${ solr_query['q'] }&fq=${ solr_query['fq'] }|${ fld['field'] }:"${ urllib.quote_plus(group.encode('ascii', 'xmlcharrefreplace')) }"${solr_query.get("sort") and '&sort=' + solr_query.get("sort") or ''}'>${group}</a> <span class="counter">(${ count })</span></li>
               % endif
               % endif
               % if fld['type'] == 'range':
               % if fld['type'] == 'range':
-                <li><a href='?collection=${ current_collection }&query=${ solr_query['q'] }&fq=${ solr_query['fq'] }|${ fld['field'] }:["${ group }" TO "${ str(int(group) + int(fld['gap']) - 1) }"]${solr_query.get("sort") and '&sort=' + solr_query.get("sort") or ''}'>${ group } (${ count })</a></li>
+                <li><a href='?collection=${ current_collection }&query=${ solr_query['q'] }&fq=${ solr_query['fq'] }|${ fld['field'] }:["${ group }" TO "${ str(int(group) + int(fld['gap']) - 1) }"]${solr_query.get("sort") and '&sort=' + solr_query.get("sort") or ''}'>${ group } - ${ str(int(group) + int(fld['gap']) - 1) }</a> <span class="counter">(${ count })</span></li>
               % endif
               % endif
               % if fld['type'] == 'date':
               % if fld['type'] == 'date':
-                <li class="dateFacetItem"><a href='?collection=${ current_collection }&query=${ solr_query['q'] }&fq=${ solr_query['fq'] }|${ fld['field'] }:[${ group } TO ${ group }${ urllib.quote_plus(fld['gap']) }]${solr_query.get("sort") and '&sort=' + solr_query.get("sort") or ''}'><span class="dateFacet">${ group }</span> (${ count })</a></li>
+                <li class="dateFacetItem"><a href='?collection=${ current_collection }&query=${ solr_query['q'] }&fq=${ solr_query['fq'] }|${ fld['field'] }:[${ group } TO ${ group }${ urllib.quote_plus(fld['gap']) }]${solr_query.get("sort") and '&sort=' + solr_query.get("sort") or ''}'><span class="dateFacet" data-format="${fld['format']}">${ group }<span class="dateFacetGap hide">${ fld['gap'] }</span></span></a> <span class="counter">(${ count })</span></li>
               % endif
               % endif
             % endif
             % endif
             % if found_value != "":
             % if found_value != "":
@@ -115,10 +115,10 @@ ${ commonheader(_('Search'), "search", user, "40px") | n,unicode }
                 <li><strong>${ group }</strong> <a href="?collection=${ current_collection }&query=${ solr_query['q'] }&fq=${'|'.join(remove_list)}${solr_query.get("sort") and '&sort=' + solr_query.get("sort") or ''}"><i class="icon-remove"></i></a></li>
                 <li><strong>${ group }</strong> <a href="?collection=${ current_collection }&query=${ solr_query['q'] }&fq=${'|'.join(remove_list)}${solr_query.get("sort") and '&sort=' + solr_query.get("sort") or ''}"><i class="icon-remove"></i></a></li>
               % endif
               % endif
               % if fld['type'] == 'range' and '["' + group + '" TO "' + str(int(group) + int(fld['gap']) - 1) + '"]' == found_value:
               % if fld['type'] == 'range' and '["' + group + '" TO "' + str(int(group) + int(fld['gap']) - 1) + '"]' == found_value:
-                <li><strong>${ group }</strong> <a href="?collection=${ current_collection }&query=${ solr_query['q'] }&fq=${'|'.join(remove_list)}${solr_query.get("sort") and '&sort=' + solr_query.get("sort") or ''}"><i class="icon-remove"></i></a></li>
+                <li><strong>${ group } - ${ str(int(group) + int(fld['gap']) - 1) }</strong> <a href="?collection=${ current_collection }&query=${ solr_query['q'] }&fq=${'|'.join(remove_list)}${solr_query.get("sort") and '&sort=' + solr_query.get("sort") or ''}"><i class="icon-remove"></i></a></li>
               % endif
               % endif
               % if fld['type'] == 'date' and found_value.startswith('[' + group + ' TO'):
               % if fld['type'] == 'date' and found_value.startswith('[' + group + ' TO'):
-                <li><strong><span class="dateFacet">${group}</span></strong> <a href="?collection=${ current_collection }&query=${ solr_query['q'] }&fq=${'|'.join(remove_list)}${solr_query.get("sort") and '&sort=' + solr_query.get("sort") or ''}"><i class="icon-remove"></i></a></li>
+                <li><strong><span class="dateFacet" data-format="${fld['format']}">${ group }<span class="dateFacetGap hide">${ fld['gap'] }</span></span></strong> <a href="?collection=${ current_collection }&query=${ solr_query['q'] }&fq=${'|'.join(remove_list)}${solr_query.get("sort") and '&sort=' + solr_query.get("sort") or ''}"><i class="icon-remove"></i></a></li>
               % endif
               % endif
             % endif
             % endif
           % endfor
           % endfor
@@ -228,7 +228,24 @@ ${ commonheader(_('Search'), "search", user, "40px") | n,unicode }
 
 
     $(".dateFacet").each(function () {
     $(".dateFacet").each(function () {
       var _m = moment($(this).text());
       var _m = moment($(this).text());
-      $(this).text(_m.fromNow());
+      var _em = moment($(this).text());
+      var _format = $(this).data("format");
+      var _gap = $(this).find(".dateFacetGap").text();
+      var _how = _gap.match(/\d+/)[0];
+      var _what = _gap.substring(_how.length + 1).toLowerCase();
+      _em.add(_what, _how * 1);
+
+      if (_format != null && _format != "") {
+        if (_format.toLowerCase().indexOf("fromnow") > -1){
+          $(this).text(_m.fromNow() + " - " + _em.fromNow());
+        }
+        else {
+          $(this).text(_m.format(_format) + " - " + _em.format(_format));
+        }
+      }
+      else {
+        $(this).text(_m.format() + " - " + _em.format());
+      }
       $(this).parents(".dateFacetItem").data("epoch", _m.valueOf());
       $(this).parents(".dateFacetItem").data("epoch", _m.valueOf());
     });
     });
 
 

+ 4 - 0
apps/search/static/css/admin.css

@@ -88,3 +88,7 @@ h1.emptyMessage {
   color: #BBB;
   color: #BBB;
   line-height: 60px;
   line-height: 60px;
 }
 }
+
+.stepDetails {
+  padding: 5px;
+}