Skip to content
This repository has been archived by the owner on Nov 25, 2020. It is now read-only.

Commit

Permalink
Browse files Browse the repository at this point in the history
Faceted search
  • Loading branch information
cdujeu committed Oct 30, 2013
1 parent e9910a7 commit db5de96
Show file tree
Hide file tree
Showing 6 changed files with 245 additions and 21 deletions.
2 changes: 1 addition & 1 deletion core/src/plugins/gui.ajax/res/js/ajaxplorer.js

Large diffs are not rendered by default.

129 changes: 115 additions & 14 deletions core/src/plugins/gui.ajax/res/js/ajaxplorer/class.SearchEngine.js
Expand Up @@ -133,35 +133,114 @@ Class.create("SearchEngine", AjxpPane, {

initMetadataForm: function(formPanel, metadataColumns){

formPanel.insert('<div id="basic_search"><span class="icon-caret-right"></span> '+MessageHash[344]+' : <span id="search_meta_options"></span></div>');

this.initMetaOption(formPanel.down('#search_meta_options'), 'filename', MessageHash[1], true);

formPanel.insert('<div id="basic_search"><span class="toggle_button open">Advanced <span class="icon-caret-down"></span></span>' +
'<span class="toggle_button close">Basic <span class="icon-caret-up"></span></span> ' +
'<span class="search_label open">'+MessageHash[344]+' : </span><span class="search_label close">Advanced Filter <span id="refresh_search_button" class="icon-refresh" title="Apply filter now"></span></span><span id="search_meta_options"></span></div>' +
'<div>' +
'<div class="scroller_track"><div class="scroller_handle"></div></div> ' +
'<div id="search_meta_detailed"><div class="advanced_search_section_title"><span class="icon-circle"></span> Metadata</div><div class="advanced_search_section"></div></div>' +
'</div>');

var oThis = this;
formPanel.select('.toggle_button').invoke('observe', 'click', function(){
formPanel.toggleClassName('toggle_open');
window.setTimeout(function(){
oThis.resize();
}, 150);
if(formPanel.hasClassName('toggle_open') && !formPanel.down('#basename').getValue() && oThis._inputBox.getValue()){
formPanel.down('#basename').setValue(oThis._inputBox.getValue());
formPanel.down('#basename').up('.advanced_search_section').addClassName('visible');
}
});

var simpleMeta = formPanel.down('#search_meta_options');
var advancedMeta = formPanel.down('#search_meta_detailed').down('.advanced_search_section');

this.initMetaOption(simpleMeta, advancedMeta, 'filename', MessageHash[1], true);
for(var key in metadataColumns){
if(this.indexedFields && !this.indexedFields.include(key)) continue;
this.initMetaOption(formPanel.down('#search_meta_options'), key, metadataColumns[key], false);
this.initMetaOption(simpleMeta, advancedMeta, key, metadataColumns[key], false);
}

var docPropertyTemplate = '<div class="advanced_search"><span class="icon-caret-right"></span> Document Property '+
'<div style="line-height: 27px;padding: 6px 5px;">'+
var docPropertyTemplate = '<div class="advanced_search">' +
'<div class="advanced_search_section_title"><span class="icon-circle"></span> Date range</div>'+
'<div class="advanced_search_section">'+
'<span class="c4"><span class="icon-calendar"></span> After </span><input id="ajxp_modiftime_from" class="c3" type="text" placeholder="YYYY/MM/DD"><span class="c6">until</span><input class="c3" type="text" id="ajxp_modiftime_to" placeholder="YYYY/MM/DD">'+
'<div id="modiftime_fixed_radio"><span id="ajxp_modiftime_fixed" class="c3" data-value="AJXP_SEARCH_RANGE_TODAY" type="text">Today</span>' +
'<span id="ajxp_modiftime_fixed" class="c3" data-value="AJXP_SEARCH_RANGE_YESTERDAY" type="text">Yesterday</span>' +
'<span id="ajxp_modiftime_fixed" class="c3" data-value="AJXP_SEARCH_RANGE_LAST_WEEK" type="text">Last week</span>' +
'<span id="ajxp_modiftime_fixed" class="c3" data-value="AJXP_SEARCH_RANGE_LAST_MONTH" type="text">Last month</span>' +
'<span id="ajxp_modiftime_fixed" class="c3" data-value="AJXP_SEARCH_RANGE_LAST_YEAR" type="text">Last Year</span></div>'+
'</div>'+
'<div class="advanced_search_section_title"><span class="icon-circle"></span> Document Property</div>'+
'<div class="advanced_search_section">'+
'<span class="c4"><span class="icon-file"></span> File </span><input id="ajxp_mime" class="c3" type="text" placeholder="Extension"><span class="c6">or</span><span class="c3" id="ajxp_folder"><span class="icon-folder-open"></span>Folder</span>'+
'<br><span class="c4"><span class="icon-calendar"></span> After </span><input id="ajxp_modiftime_from" class="c3" type="text" placeholder="YYYY/MM/DD"><span class="c6">until</span><input class="c3" type="text" id="ajxp_modiftime_to" placeholder="YYYY/MM/DD">'+
'<br><span class="c4"><span class="icon-folder-open"></span> Size</span><input id="ajxp_bytesize_from" type="text" class="c3" placeholder="1k,1M,1G..."><span class="c6"> to </span><input id="ajxp_modiftime_to" type="text" class="c3" placeholder="1k,1M,1G..."></div>'+
'</div>';
formPanel.insert(docPropertyTemplate);
'<br><span class="c4"><span class="icon-cloud-download"></span> Size</span><input id="ajxp_bytesize_from" type="text" class="c3" placeholder="1k,1M,1G..."><span class="c6"> to </span><input id="ajxp_modiftime_to" type="text" class="c3" placeholder="1k,1M,1G..."></div>'+
'</div>' +
'';
formPanel.down('#search_meta_detailed').insert({top:docPropertyTemplate});

formPanel.select('input').each(function(el){
el.observe('focus', ajaxplorer.disableAllKeyBindings.bind(ajaxplorer));
el.observe('blur', ajaxplorer.enableAllKeyBindings.bind(ajaxplorer));
el.observe('keydown', function(event){
if(event.keyCode == Event.KEY_RETURN){
oThis.search();
}
});
});
var radios = formPanel.down('#modiftime_fixed_radio').select('span.c3');
radios.each(function(el){
el.observe('click', function(e){
if(el.hasClassName('selected')){
el.removeClassName('selected');
}else{
radios.invoke('removeClassName', 'selected');
el.addClassName('selected');
}
formPanel.down('#ajxp_modiftime_from').disabled = formPanel.down('#ajxp_modiftime_to').disabled = el.hasClassName('selected');
oThis.search();
});
});

formPanel.down('#ajxp_folder').observe('click', function(e){
formPanel.down('#ajxp_folder').toggleClassName('selected');
formPanel.down('#ajxp_mime').disabled = formPanel.down('#ajxp_folder').hasClassName('selected');
oThis.search();
});

formPanel.down('#refresh_search_button').observe('click', function(e){
this.search();
}.bind(this));

formPanel.select('.advanced_search_section_title').invoke('observe', 'click', function(ev){
Event.findElement(ev, '.advanced_search_section_title').next('.advanced_search_section').toggleClassName('visible');
oThis.resize();
});

this.scrollbar = new Control.ScrollBar(formPanel.down('#search_meta_detailed'),formPanel.down('.scroller_track'));

},

parseMetadataForm: function(){
var formPanel = this.htmlElement.down('#search_meta');
if(!formPanel.hasClassName('toggle_open')){
return false;
}
var metadata = $H();
formPanel.select('input').each(function(el){
if(!el.getValue()) return;
metadata.set(el.id, el.getValue());
formPanel.select('input,span.c3.selected').each(function(el){
if(el.tagName.toLowerCase() == 'input'){
if(!el.getValue() || el.disabled) return;
metadata.set(el.id, el.getValue());
}else{
if(el.id == 'ajxp_folder'){
metadata.set('ajxp_mime', 'ajxp_folder');
}else if(el.id == 'ajxp_modiftime_fixed'){
metadata.set('ajxp_modiftime', el.readAttribute('data-value'));
}
}
});
if(metadata.get('ajxp_modiftime_from') || metadata.get('ajxp_modiftime_to')){
if(!metadata.get('ajxp_modiftime_from')) metadata.set('ajxp_modiftime_from','1970/01/01');
Expand All @@ -177,6 +256,7 @@ Class.create("SearchEngine", AjxpPane, {
metadata.unset('ajxp_bytesize_to');
metadata.unset('ajxp_bytesize_from');
}

return metadata;
},

Expand Down Expand Up @@ -319,6 +399,16 @@ Class.create("SearchEngine", AjxpPane, {
}else{
fitHeightToBottom($(this._resultsBoxId), null, (this._ajxpOptions.fitMarginBottom?this._ajxpOptions.fitMarginBottom:0));
}

if(this.htmlElement.down('#search_meta')){
var formPanel = this.htmlElement.down('#search_meta');
fitHeightToBottom(formPanel.down('#search_meta_detailed'), formPanel);
if(this.scrollbar) {
this.scrollbar.track.setStyle({height:formPanel.down('#search_meta_detailed').getHeight()+'px'});
this.scrollbar.recalculateLayout();
}
}

if(this._fileList){
this._fileList.resize();
}
Expand Down Expand Up @@ -356,14 +446,26 @@ Class.create("SearchEngine", AjxpPane, {
* @param optionLabel String
* @param checked Boolean
*/
initMetaOption : function(element, optionValue, optionLabel, checked){
initMetaOption : function(element, advancedPanel, optionValue, optionLabel, checked){
var option = new Element('span', {value:optionValue, className:'search_meta_opt'}).update('<span class="icon-ok"></span>'+ optionLabel);
if(checked) option.addClassName('checked');
if(element.childElements().length) element.insert(', ');
element.insert(option);
option.observe('click', function(event){
option.toggleClassName('checked');
});
var fName = (optionValue == 'filename'?'basename':'ajxp_meta_'+optionValue);
advancedPanel.insert('<div><span class="c4" style="width: 25%;"><span class="icon-tag"></span> '+optionLabel+'</span><input style="width: 35%;" type="text" class="c3" id="'+fName+'"></div>');

/*
if(this._ajxpOptions.metaColumnsRenderers && this._ajxpOptions.metaColumnsRenderers[optionValue]){
var input = advancedPanel.down('#'+fName);
var func = eval(this._ajxpOptions.metaColumnsRenderers[optionValue]);
if(Object.isFunction(func)){
func(input);
}
}
*/
this.metaOptions.push(option);
},
/**
Expand Down Expand Up @@ -415,7 +517,6 @@ Class.create("SearchEngine", AjxpPane, {
var metadata = this.parseMetadataForm();
if(metadata){
var parts = $A();
if(text) parts.push('basename:'+text);
metadata.each(function(pair){
parts.push(pair.key+':'+pair.value);
});
Expand Down
121 changes: 117 additions & 4 deletions core/src/plugins/gui.ajax/res/themes/vision/css/ajaxplorer.css
Expand Up @@ -2609,13 +2609,28 @@ div.tabulatorContainer span.toggleInactive span.tab_close_button:hover {
#search_meta {
font-family: "HelveticaNeue-Light", "Helvetica Neue Light", "Helvetica Neue", Helvetica, Arial, "Lucida Grande", sans-serif;
font-size: 11px;
padding: 5px 5px 7px;
padding: 0;
background-color: rgb(255, 255, 255);
color: rgb(143, 162, 182);
letter-spacing: 1px;
border-bottom: 1px solid rgb(194, 196, 199);
max-height: 140px !important;
max-height: 200px !important;
box-shadow: none !important;
height: 25px !important;
-webkit-transition-property: height;
-webkit-transition-duration: 0.1s;
-webkit-transition-timing-function: ease-in-out;
-moz-transition-property: height;
-moz-transition-duration: 0.1s;
-moz-transition-timing-function: ease-in-out;
transition-property: height;
transition-duration: 0.1s;
transition-timing-function: ease-in-out;
position: relative;
}

#search_meta.toggle_open{
height: 200px !important;
}

#search_meta input.c3,
Expand All @@ -2625,14 +2640,33 @@ div.tabulatorContainer span.toggleInactive span.tab_close_button:hover {
margin-left: 0;
margin-right: 0;
border: 1px solid #ACB2BB;
background-color: rgba(235, 237, 240, 0.35);
background-color: #ffffff;
padding: 2px 3px;
}
#search_meta input.c3:disabled{
opacity: 0.35;
}

#search_meta span.c3{
cursor: pointer;
}
#search_meta input.c3:focus{
background-color: white;
}

#modiftime_fixed_radio span.c3{
border-right-width: 0 !important;
}

#modiftime_fixed_radio span.c3:last-of-type{
border-right-width: 1px !important;
}
#search_meta span.c3.selected{
background-color: rgb(138, 149, 160) !important;
color: white;
}


#search_meta span.c4 {
display: inline-block;
width: 18%;
Expand All @@ -2646,7 +2680,86 @@ div.tabulatorContainer span.toggleInactive span.tab_close_button:hover {
}

.advanced_search {
margin-top: 10px;
}

#basic_search{
padding: 4px;
height: 17px;
}

#search_meta.toggle_open #basic_search{
border-bottom: 1px solid rgb(143, 162, 182);
}

#search_meta_detailed {
padding:10px 5px;
line-height: 28px;
overflow: hidden;
background-color: rgba(235, 237, 240, 0.36);
}

#search_meta span.toggle_button {
float: right;
display: inline-block;
padding: 2px 5px;
border-radius: 3px;
background-color: #4dc5c3;
cursor: pointer;
color: white;
}

#search_meta span.toggle_button.close,
#search_meta.toggle_open span.toggle_button.open,
#search_meta.toggle_open span#search_meta_options
{
display: none;
}

.search_label.open,
.search_label.close
{
display: inline-block;
padding: 2px;
height: 20px;
}
.search_label.close{
display: none;
}

#refresh_search_button{
cursor: pointer;
}

#search_meta.toggle_open span.search_label.open{
display: none;
}

#search_meta.toggle_open span.search_label.close{
display: inline-block;
}

#search_meta.toggle_open span.toggle_button.close,
#search_meta span.toggle_button.open
{
display: inline-block;
}

#search_meta div.advanced_search_section{
padding: 5px 5px 15px 17px;
line-height: 29px;
display: none;
}

#search_meta div.advanced_search_section.visible{
display: block;
}

#search_meta div.advanced_search_section_title {
border-bottom: 1px solid;
padding-bottom: 6px;
line-height: 9px;
margin-bottom: 7px;
cursor: pointer;
}

.searchScore{
Expand Down
2 changes: 1 addition & 1 deletion core/src/plugins/gui.ajax/res/themes/vision/css/allz.css

Large diffs are not rendered by default.

3 changes: 2 additions & 1 deletion core/src/plugins/index.lucene/class.AjxpLuceneIndexer.php
Expand Up @@ -499,7 +499,8 @@ public function createIndexedDocument($ajxpNode, &$index)
$doc->addField(Zend_Search_Lucene_Field::Keyword("ajxp_scope", "shared"));
$doc->addField(Zend_Search_Lucene_Field::Keyword("ajxp_modiftime", date("Ymd", $ajxpNode->ajxp_modiftime)));
$doc->addField(Zend_Search_Lucene_Field::Keyword("ajxp_bytesize", $ajxpNode->bytesize));
if (empty($ajxpNode->ajxp_mime)) {
$ajxpMime = $ajxpNode->ajxp_mime;
if (empty($ajxpMime)) {
$doc->addField(Zend_Search_Lucene_Field::Keyword("ajxp_mime", pathinfo($ajxpNode->getLabel(), PATHINFO_EXTENSION)));
} else {
$doc->addField(Zend_Search_Lucene_Field::Keyword("ajxp_mime", $ajxpNode->ajxp_mime));
Expand Down
9 changes: 9 additions & 0 deletions core/src/plugins/meta.user/class.UserMetaManager.php
Expand Up @@ -71,6 +71,7 @@ public function initMeta($accessDriver)
$contrib = $selection->item(0);
$even = false;
$searchables = array();
$searchablesRenderers = array();
$index = 0;
$fieldType = "text";
foreach ($def as $key=> $data) {
Expand All @@ -90,10 +91,14 @@ public function initMeta($accessDriver)
case "stars_rate":
$col->setAttribute("modifier", "MetaCellRenderer.prototype.starsRateFilter");
$col->setAttribute("sortType", "CellSorterValue");
$searchables[$key] = $label;
$searchablesRenderers[$key] = "MetaCellRenderer.prototype.starsRateFilter";
break;
case "css_label":
$col->setAttribute("modifier", "MetaCellRenderer.prototype.cssLabelsFilter");
$col->setAttribute("sortType", "CellSorterValue");
$searchables[$key] = $label;
$searchablesRenderers[$key] = "MetaCellRenderer.prototype.cssLabelsFilter";
break;
case "textarea":
$searchables[$key] = $label;
Expand All @@ -106,6 +111,7 @@ public function initMeta($accessDriver)
$col->setAttribute("modifier", "MetaCellRenderer.prototype.selectorsFilter");
$col->setAttribute("sortType", "CellSorterValue");
$col->setAttribute("metaAdditional", $this->fieldsAdditionalData[$key]);
$searchablesRenderers[$key] = "MetaCellRenderer.prototype.selectorsFilter";
break;
default:
break;
Expand Down Expand Up @@ -133,6 +139,9 @@ public function initMeta($accessDriver)
foreach ($selection as $tag) {
$v = $tag->attributes->getNamedItem("ajxpOptions")->nodeValue;
$metaV = count($searchables)? '"metaColumns":'.json_encode($searchables): "";
if (count($searchablesRenderers)) {
$metaV .= ',"metaColumnsRenderers":'.json_encode($searchablesRenderers);
}
if (!empty($v) && trim($v) != "{}") {
$v = str_replace("}", ", ".$metaV."}", $v);
} else {
Expand Down

0 comments on commit db5de96

Please sign in to comment.