mirror of
https://github.com/alchemy-fr/Phraseanet.git
synced 2025-10-16 14:33:14 +00:00
162 lines
6.1 KiB
JavaScript
162 lines
6.1 KiB
JavaScript
var p4 = p4 || {};
|
|
|
|
var workzoneFacetsModule = (function (p4) {
|
|
var selectedFacetValues = [];
|
|
var getSelectedFacets = function() {
|
|
return selectedFacetValues;
|
|
}
|
|
var resetSelectedFacets = function() {
|
|
selectedFacetValues = [];
|
|
return selectedFacetValues;
|
|
};
|
|
var loadFacets = function(facets) {
|
|
// Convert facets data to fancytree source format
|
|
var treeSource = _.map(facets, function(facet) {
|
|
// Values
|
|
var values = _.map(facet.values, function(value) {
|
|
return {
|
|
title: value.value + ' (' + value.count + ')',
|
|
query: value.query,
|
|
label: value.value,
|
|
tooltip: value.value + ' (' + value.count + ')'
|
|
}
|
|
});
|
|
// Facet
|
|
return {
|
|
name: facet.name,
|
|
title: facet.label,
|
|
folder: true,
|
|
children: values,
|
|
expanded: _.isUndefined(selectedFacetValues[facet.name])
|
|
};
|
|
});
|
|
|
|
treeSource.sort(_sortFacets('title', true, function(a){return a.toUpperCase()}));
|
|
|
|
treeSource = _sortByPredefinedFacets(treeSource, 'name', ['Base_Name', 'Collection_Name', 'Type_Name']);
|
|
|
|
return _getFacetsTree().reload(treeSource);
|
|
};
|
|
|
|
// from stackoverflow
|
|
// http://stackoverflow.com/questions/979256/sorting-an-array-of-javascript-objects/979325#979325
|
|
function _sortFacets(field, reverse, primer) {
|
|
var key = function (x) {return primer ? primer(x[field]) : x[field]};
|
|
|
|
return function (a,b) {
|
|
var A = key(a), B = key(b);
|
|
return ( (A < B) ? -1 : ((A > B) ? 1 : 0) ) * [-1,1][+!!reverse];
|
|
}
|
|
}
|
|
|
|
function _sortByPredefinedFacets(source, field, predefinedFieldOrder) {
|
|
var filteredSource = source,
|
|
ordered = [];
|
|
|
|
_.forEach(predefinedFieldOrder, function (fieldValue, index) {
|
|
_.forEach(source, function (facet, facetIndex) {
|
|
if (facet[field] !== undefined) {
|
|
if (facet[field] === fieldValue) {
|
|
ordered.push(facet);
|
|
// remove from filtered
|
|
filteredSource.splice(facetIndex, 1);
|
|
}
|
|
}
|
|
});
|
|
});
|
|
|
|
var olen = filteredSource.length;
|
|
// fill predefined facets with non predefined facets
|
|
for (var i = 0; i < olen; i++) {
|
|
ordered.push(filteredSource[i]);
|
|
}
|
|
return ordered;
|
|
}
|
|
|
|
function _getFacetsTree() {
|
|
var $facetsTree = $('#proposals');
|
|
if (!$facetsTree.data('ui-fancytree')) {
|
|
$facetsTree.fancytree({
|
|
clickFolderMode: 3, // activate and expand
|
|
icons:false,
|
|
source: [],
|
|
activate: function(event, data){
|
|
var query = data.node.data.query;
|
|
if (query) {
|
|
var facet = data.node.parent;
|
|
selectedFacetValues[facet.title] = data.node.data;
|
|
_facetCombinedSearch();
|
|
}
|
|
},
|
|
renderNode: function(event, data){
|
|
var facetFilter = "";
|
|
if(data.node.folder && !_.isUndefined(selectedFacetValues[data.node.title])) {
|
|
facetFilter = selectedFacetValues[data.node.title].label;
|
|
|
|
var s_label = document.createElement("SPAN");
|
|
s_label.setAttribute("class", "facetFilter-label");
|
|
s_label.setAttribute("title", facetFilter);
|
|
|
|
var length = 15;
|
|
var facetFilterString = facetFilter;
|
|
if( facetFilterString.length > length) {
|
|
facetFilterString = facetFilterString.substring(0,length) + '…';
|
|
}
|
|
s_label.appendChild(document.createTextNode(facetFilterString));
|
|
|
|
var s_closer = document.createElement("A");
|
|
s_closer.setAttribute("class", "facetFilter-closer");
|
|
|
|
var s_gradient = document.createElement("SPAN");
|
|
s_gradient.setAttribute("class", "facetFilter-gradient");
|
|
s_gradient.appendChild(document.createTextNode("\u00A0"));
|
|
|
|
s_label.appendChild(s_gradient);
|
|
|
|
var s_facet = document.createElement("SPAN");
|
|
s_facet.setAttribute("class", "facetFilter");
|
|
s_facet.appendChild(s_label);
|
|
s_closer = $(s_facet.appendChild(s_closer));
|
|
s_closer.data("facetTitle", data.node.title);
|
|
|
|
s_closer.click(
|
|
function(event) {
|
|
event.stopPropagation();
|
|
var facetTitle = $(this).data("facetTitle");
|
|
delete selectedFacetValues[facetTitle];
|
|
_facetCombinedSearch();
|
|
return false;
|
|
}
|
|
);
|
|
|
|
$(".fancytree-folder", data.node.li).append(
|
|
$(s_facet)
|
|
);
|
|
}
|
|
}
|
|
});
|
|
|
|
}
|
|
return $facetsTree.fancytree('getTree');
|
|
}
|
|
|
|
function _facetCombinedSearch() {
|
|
var q = $("#EDIT_query").val();
|
|
var q_facet = "";
|
|
_.each(_.values(selectedFacetValues), function(facetValue) {
|
|
q_facet += (q_facet ? " AND " : "") + '(' + facetValue.query + ')';
|
|
});
|
|
if(q_facet) {
|
|
if(q) {
|
|
q = '(' + q + ') AND '
|
|
}
|
|
q += q_facet;
|
|
}
|
|
|
|
searchModule.checkFilters();
|
|
searchModule.newSearch(q);
|
|
}
|
|
|
|
return { loadFacets: loadFacets, getSelectedFacets: getSelectedFacets, resetSelectedFacets: resetSelectedFacets}
|
|
|
|
})(p4); |