X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=tools%2Fhtdocs%2Fmkws.js;h=124b3115fb9723bcf7227d31e86b8337e09fd45a;hb=588dc0fed2bd1f9240418e05a87514796679223a;hp=56c0b15403f50b85904f3103b16644d72570e37b;hpb=9f931a5bf7ed1c34494d4ef2565c318a2ac58b93;p=mkws-moved-to-github.git diff --git a/tools/htdocs/mkws.js b/tools/htdocs/mkws.js index 56c0b15..124b311 100644 --- a/tools/htdocs/mkws.js +++ b/tools/htdocs/mkws.js @@ -4,7 +4,9 @@ "use strict"; // HTML5: disable for debug_level >= 2 // Set up namespace and some state. -var mkws = {}; +var mkws = { + filters: [], +}; /* * global config object: mkws_config @@ -98,6 +100,42 @@ mkws.debug_function = function (string) { } var debug = mkws.debug_function; // local alias + +Handlebars.registerHelper('link', function(a) { + var result = ""; + for (var i in a) { + if (i > 0) result += "
"; + var text = Handlebars.Utils.escapeExpression(a[i]); + result += '' + text + ''; + } + + return new Handlebars.SafeString(result); +}); + + +Handlebars.registerHelper('json', function(obj) { + return JSON.stringify(obj); +}); + + +// We need {{attr name}} because Handlebars can't parse {{@@name}} +Handlebars.registerHelper('attr', function(attrName) { + return this['@' + attrName]; +}); + + +Handlebars.registerHelper('first', function(items, options) { + var having = options.hash.having; + for (var i in items) { + var item = items[i] + if (!having || item[having]) { + return options.fn(item); + } + } + return ""; +}); + + { /* default mkws config */ var config_default = { @@ -176,7 +214,6 @@ var totalRec = 0; var curDetRecId = ''; var curDetRecData = null; var curSort = 'relevance'; -var curFilter = null; var submitted = false; var SourceMax = 16; var SubjectMax = 10; @@ -257,9 +294,9 @@ function my_onterm(data) { if (facets[i] == "sources") { add_single_facet(acc, "Sources", data.xtargets, SourceMax, null); } else if (facets[i] == "subjects") { - add_single_facet(acc, "Subjects", data.subject, SubjectMax, "su"); + add_single_facet(acc, "Subjects", data.subject, SubjectMax, "subject"); } else if (facets[i] == "authors") { - add_single_facet(acc, "Authors", data.author, AuthorMax, "au"); + add_single_facet(acc, "Authors", data.author, AuthorMax, "author"); } else { alert("bad facet configuration: '" + facets[i] + "'"); } @@ -269,19 +306,19 @@ function my_onterm(data) { replaceHtml(termlist, acc.join('')); } -function add_single_facet(acc, caption, data, max, cclIndex) { +function add_single_facet(acc, caption, data, max, pzIndex) { acc.push('
'); acc.push('
' + M(caption) + '
'); for (var i = 0; i < data.length && i < max; i++ ) { acc.push('
'); acc.push('' + data[i].name + '' + ' ' + data[i].freq + ''); @@ -373,7 +410,24 @@ function resetPage() function triggerSearch () { - my_paz.search(document.mkwsSearchForm.mkwsQuery.value, recPerPage, curSort, curFilter); + var pp2filter = ""; + var pp2limit = ""; + + for (var i in mkws.filters) { + var filter = mkws.filters[i]; + if (filter.id) { + if (pp2filter) + pp2filter += ","; + pp2filter += 'pz:id=' + filter.id; + } else { + if (pp2limit) + pp2limit += ","; + pp2limit += filter.field + "=" + filter.value.replace(/[\\|,]/g, '\\$&'); + } + } + + debug("triggerSearch: filters = " + JSON.stringify(mkws.filters) + ", pp2filter = " + pp2filter + ", pp2limit = " + pp2limit); + my_paz.search(document.mkwsSearchForm.mkwsQuery.value, recPerPage, curSort, pp2filter, undefined, { limit: pp2limit }); } function loadSelect () @@ -390,36 +444,99 @@ function loadSelect () mkws.limitQuery = function (field, value) { debug("limitQuery(field=" + field + ", value=" + value + ")"); - document.mkwsSearchForm.mkwsQuery.value += ' and ' + field + '="' + value + '"'; - onFormSubmitEventHandler(); + mkws.filters.push({ field: field, value: value }); + redraw_navi(); + resetPage(); + loadSelect(); + triggerSearch(); + return false; } // limit by target functions mkws.limitTarget = function (id, name) { debug("limitTarget(id=" + id + ", name=" + name + ")"); - var navi = document.getElementById('mkwsNavi'); - navi.innerHTML = - 'Source: ' - + name + ''; - curFilter = 'pz:id=' + id; + mkws.filters.push({ id: id, name: name }); + redraw_navi(); resetPage(); loadSelect(); triggerSearch(); return false; } -mkws.delimitTarget = function () +mkws.delimitQuery = function (field, value) { - var navi = document.getElementById('mkwsNavi'); - navi.innerHTML = ''; - curFilter = null; + debug("delimitQuery(field=" + field + ", value=" + value + ")"); + var newFilters = []; + for (var i in mkws.filters) { + var filter = mkws.filters[i]; + if (filter.field && + field == filter.field && + value == filter.value) { + debug("delimitTarget() removing filter " + JSON.stringify(filter)); + } else { + debug("delimitTarget() keeping filter " + JSON.stringify(filter)); + newFilters.push(filter); + } + } + mkws.filters = newFilters; + + redraw_navi(); resetPage(); loadSelect(); triggerSearch(); return false; } + +mkws.delimitTarget = function (id) +{ + debug("delimitTarget(id=" + id + ")"); + var newFilters = []; + for (var i in mkws.filters) { + var filter = mkws.filters[i]; + if (filter.id) { + debug("delimitTarget() removing filter " + JSON.stringify(filter)); + } else { + debug("delimitTarget() keeping filter " + JSON.stringify(filter)); + newFilters.push(filter); + } + } + mkws.filters = newFilters; + + redraw_navi(); + resetPage(); + loadSelect(); + triggerSearch(); + return false; +} + + +function redraw_navi () +{ + var navi = document.getElementById('mkwsNavi'); + if (!navi) return; + + var text = ""; + for (var i in mkws.filters) { + if (text) { + text += " | "; + } + var filter = mkws.filters[i]; + if (filter.id) { + text += 'Source: ' + filter.name + ''; + } else { + text += filter.field + ': ' + filter.value + ''; + } + } + + navi.innerHTML = text; +} + + function drawPager (pagerDiv) { //client indexes pages from 1 but pz2 from 0 @@ -559,7 +676,41 @@ function replaceHtml(el, html) { function renderDetails(data, marker) { - var details = '
'; + if (mkws.templateRecord === undefined) { + maybeLoadTemplate("Record"); + } + + var details; + if (mkws.templateRecord) { + var template = mkws.templateRecord; + details = template(data); + } else { + details = defaultRenderDetails(data, marker); + } + + return '
' + details + '
'; +} + + +function maybeLoadTemplate(name) +{ + var source = $("#mkwsTemplate" + name).html(); + if (!source) { + debug("no template '" + name + "': falling back to default behaviour"); + // Mark template as not provided + mkws['template' + name] = 0; + return; + } + + var template = Handlebars.compile(source); + debug("compiled template '" + name + "'"); + mkws['template' + name] = template; +} + + +function defaultRenderDetails(data, marker) +{ + var details = '
'; if (marker) details += ''; var locations = []; @@ -577,11 +728,11 @@ function renderDetails(data, marker) } else { details += renderField("Location" + (locations.length == 1 ? "" : "s"), locations); } - details += '
'+ marker + '
'; - + details += ''; return details; } + function renderField(caption, data, data2, data3) { if (data === undefined) { return "";