X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=src%2Fmkws-widgets.js;h=b5d137332312304dc8b2cd6a59357dc74bb66e12;hb=a442ae54ee85ce806e8b9c33b6e4845f7c7fde92;hp=ff6bba12147ec97e67f1310aef71e9196a9647a6;hpb=49f75165b292003b012d62c3014b266d28cc5c15;p=mkws-moved-to-github.git diff --git a/src/mkws-widgets.js b/src/mkws-widgets.js index ff6bba1..b5d1373 100644 --- a/src/mkws-widgets.js +++ b/src/mkws-widgets.js @@ -1,278 +1,310 @@ // Factory function for widget objects. function widget($, team, type, node) { + // Static register of attributes that do not contribute to config + var ignoreAttrs = { + id:1, 'class':1, style:1, name:1, action:1, type:1, size:1, + value:1, width:1, valign:1 + }; + var that = { team: team, type: type, - node: node + node: node, + config: Object.create(team.config()) }; - var M = mkws.M; - - var type2fn = { - Targets: promoteTargets, - Stat: promoteStat, - Termlists: promoteTermlists, - Pager: promotePager, - Records: promoteRecords, - Navi: promoteNavi, - Sort: promoteSort, - Perpage: promotePerpage - }; - - var promote = type2fn[type]; - if (promote) { - promote(); - log("made " + type + " widget(node=" + node + ")"); - } else { - log("made UNENCAPSULATED widget(type=" + type + ", node=" + node + ")"); - } - - return that; - - function log(s) { team.log(s); } + that.log = log; - // Functions follow for promoting the regular widget object into - // widgets of specific types. These could be moved outside of the - // widget object, or even into their own source files. - - function promoteTargets() { - team.queue("targets").subscribe(function(data) { - var table ='' + - '' + - '' + - '' + - '' + - '' + - ''; - - for (var i = 0; i < data.length; i++) { - table += ""; + that.toString = function() { + return '[Widget ' + team.name() + ':' + type + ']'; + }; + + for (var i = 0; i < node.attributes.length; i++) { + var a = node.attributes[i]; + if (a.name === 'data-mkws-config') { + // Treat as a JSON fragment configuring just this widget + log(node + ": parsing config fragment '" + a.value + "'"); + var data; + try { + data = $.parseJSON(a.value); + for (var key in data) { + log(node + ": adding config element " + key + "='" + data[key] + "'"); + that.config[key] = data[key]; + } + } catch (err) { + alert("Can't parse " + node + " data-mkws-config as JSON: " + a.value); } - - table += '
' + M('Target ID') + '' + M('Hits') + '' + M('Diags') + '' + M('Records') + '' + M('State') + '
" + data[i].id + - "" + data[i].hits + - "" + data[i].diagnostic + - "" + data[i].records + - "" + data[i].state + "
'; - var subnode = $(node).children('.mkwsBytarget'); - subnode.html(table); - }); + } else if (a.name.match (/^data-mkws-/)) { + var name = a.name.replace(/^data-mkws-/, '') + that.config[name] = a.value; + log(node + ": set data-mkws attribute " + name + "='" + a.value + "'"); + } else if (!ignoreAttrs[a.name]) { + that.config[a.name] = a.value; + log(node + ": set regular attribute " + a.name + "='" + a.value + "'"); + } } - - function promoteStat() { - team.queue("stat").subscribe(function(data) { - if (node.length === 0) alert("huh?!"); - - $(node).html('' + M('Status info') + '' + - ' -- ' + - '' + M('Active clients') + ': ' + data.activeclients + '/' + data.clients + '' + - ' -- ' + - '' + M('Retrieved records') + ': ' + data.records + '/' + data.hits + ''); - }); + var fn = mkws.promotionFunction(type); + if (fn) { + fn.call(that); + log("made " + type + " widget(node=" + node + ")"); + } else { + log("made UNPROMOTED widget(type=" + type + ", node=" + node + ")"); } + return that; +} - function promoteTermlists() { - team.queue("termlists").subscribe(function(data) { - if (!node) { - alert("termlists event when there are no termlists"); - return; - } - - // no facets: this should never happen - if (!mkws_config.facets || mkws_config.facets.length == 0) { - alert("onTerm called even though we have no facets: " + $.toJSON(data)); - $(node).hide(); - return; - } - // display if we first got results - $(node).show(); - - var acc = []; - acc.push('
' + M('Termlists') + '
'); - var facets = mkws_config.facets; - - for (var i = 0; i < facets.length; i++) { - if (facets[i] == "xtargets") { - addSingleFacet(acc, "Sources", data.xtargets, 16, null); - } else if (facets[i] == "subject") { - addSingleFacet(acc, "Subjects", data.subject, 10, "subject"); - } else if (facets[i] == "author") { - addSingleFacet(acc, "Authors", data.author, 10, "author"); - } else { - alert("bad facet configuration: '" + facets[i] + "'"); +// Utility function for use by all widgets that can invoke autosearch. +widget.autosearch = function(widget) { + widget.team.queue("ready").subscribe(function() { + var query = widget.config.autosearch; + if (query) { + if (query.match(/^!param!/)) { + var param = query.replace(/^!param!/, ''); + query = mkws.getParameterByName(param); + widget.log("obtained query '" + query + "' from param '" + param + "'"); + if (!query) { + alert("This page has a MasterKey widget that needs a query specified by the '" + param + "' parameter"); } - } - - $(node).html(acc.join('')); - - function addSingleFacet(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 + ''); - acc.push('
'); + } else if (query.match(/^!path!/)) { + var index = query.replace(/^!path!/, ''); + var path = window.location.pathname.split('/'); + query = path[path.length - index]; + widget.log("obtained query '" + query + "' from path-component '" + index + "'"); + if (!query) { + alert("This page has a MasterKey widget that needs a query specified by the path-component " + index); } - acc.push('
'); } - }); - } - - - function promotePager() { - team.queue("pager").subscribe(function(data) { - $(node).html(drawPager(data)) - - function drawPager(data) { - var s = '
' + M('Displaying') + ': ' - + (data.start + 1) + ' ' + M('to') + ' ' + (data.start + data.num) + - ' ' + M('of') + ' ' + data.merged + ' (' + M('found') + ': ' - + data.total + ')
'; - - //client indexes pages from 1 but pz2 from 0 - var onsides = 6; - var pages = Math.ceil(team.totalRecordCount() / team.perpage()); - var currentPage = team.currentPage(); - - var firstClkbl = (currentPage - onsides > 0) - ? currentPage - onsides - : 1; - - var lastClkbl = firstClkbl + 2*onsides < pages - ? firstClkbl + 2*onsides - : pages; - var prev = '<< ' + M('Prev') + ' | '; - if (currentPage > 1) - prev = '' - +'<< ' + M('Prev') + ' | '; - - var middle = ''; - for(var i = firstClkbl; i <= lastClkbl; i++) { - var numLabel = i; - if(i == currentPage) - numLabel = '' + i + ''; + var sortOrder = widget.config.sort; + var maxrecs = widget.config.maxrecs; + var perpage = widget.config.perpage; + var limit = widget.config.limit; + var targets = widget.config.targets; + var targetfilter = widget.config.targetfilter; + var target = widget.config.target; + if (target) targetfilter = 'udb=="' + target + '"'; + + var s = "running auto search: '" + query + "'"; + if (sortOrder) s += " sorted by '" + sortOrder + "'"; + if (maxrecs) s += " restricted to " + maxrecs + " records"; + if (perpage) s += " with " + perpage + " per page"; + if (limit) s += " limited by '" + limit + "'"; + if (targets) s += " in targets '" + targets + "'"; + if (targetfilter) s += " constrained by targetfilter '" + targetfilter + "'"; + widget.log(s); + + widget.team.newSearch(query, sortOrder, maxrecs, perpage, limit, targets, targetfilter); + } + }); +}; + + +// Functions follow for promoting the regular widget object into +// widgets of specific types. These could be moved into their own +// source files. + + +mkws.registerWidgetType('Targets', function() { + var that = this; + var M = mkws.M; - middle += ' ' - + numLabel + ' '; - } + this.team.queue("targets").subscribe(function(data) { + var table ='' + + '' + + '' + + '' + + '' + + '' + + ''; + + for (var i = 0; i < data.length; i++) { + table += ""; + } + + table += '
' + M('Target ID') + '' + M('Hits') + '' + M('Diags') + '' + M('Records') + '' + M('State') + '
" + data[i].id + + "" + data[i].hits + + "" + data[i].diagnostic + + "" + data[i].records + + "" + data[i].state + "
'; + var subnode = $(that.node).children('.mkwsBytarget'); + subnode.html(table); + }); +}); + + +mkws.registerWidgetType('Stat', function() { + var that = this; + var M = mkws.M; - var next = ' | ' + M('Next') + ' >>'; - if (pages - currentPage > 0) - next = ' | ' - + M('Next') + ' >>'; + this.team.queue("stat").subscribe(function(data) { + if (that.node.length === 0) alert("huh?!"); - var predots = ''; - if (firstClkbl > 1) - predots = '...'; + $(that.node).html('' + M('Status info') + '' + + ' -- ' + + '' + M('Active clients') + ': ' + data.activeclients + '/' + data.clients + '' + + ' -- ' + + '' + M('Retrieved records') + ': ' + data.records + '/' + data.hits + ''); + }); +}); - var postdots = ''; - if (lastClkbl < pages) - postdots = '...'; - s += '
' - + prev + predots + middle + postdots + next + '
'; +mkws.registerWidgetType('Pager', function() { + var that = this; + var M = mkws.M; - return s; - } - }); - } - - - function promoteRecords() { - team.queue("records").subscribe(function(data) { - var html = []; - for (var i = 0; i < data.hits.length; i++) { - var hit = data.hits[i]; - var divId = team.recordElementId(hit.recid[0]); - html.push('
', renderSummary(hit), '
'); - // ### At some point, we may be able to move the - // m_currentRecordId and m_currentRecordData members - // from the team object into this widget. - if (hit.recid == team.currentRecordId()) { - if (team.currentRecordData()) - html.push(team.renderDetails(team.currentRecordData())); - } + this.team.queue("pager").subscribe(function(data) { + $(that.node).html(drawPager(data)) + + function drawPager(data) { + var teamName = that.team.name(); + var s = '
' + M('Displaying') + ': ' + + (data.start + 1) + ' ' + M('to') + ' ' + (data.start + data.num) + + ' ' + M('of') + ' ' + data.merged + ' (' + M('found') + ': ' + + data.total + ')
'; + + //client indexes pages from 1 but pz2 from 0 + var onsides = 6; + var pages = Math.ceil(that.team.totalRecordCount() / that.team.perpage()); + var currentPage = that.team.currentPage(); + + var firstClkbl = (currentPage - onsides > 0) + ? currentPage - onsides + : 1; + + var lastClkbl = firstClkbl + 2*onsides < pages + ? firstClkbl + 2*onsides + : pages; + + var prev = '<< ' + M('Prev') + ' | '; + if (currentPage > 1) + prev = '' + +'<< ' + M('Prev') + ' | '; + + var middle = ''; + for(var i = firstClkbl; i <= lastClkbl; i++) { + var numLabel = i; + if(i == currentPage) + numLabel = '' + i + ''; + + middle += ' ' + + numLabel + ' '; } - $(node).html(html.join('')); - - function renderSummary(hit) - { - var template = team.loadTemplate("Summary"); - hit._id = team.recordElementId(hit.recid[0]); - hit._onclick = "mkws.showDetails('" + team.name() + "', '" + hit.recid[0] + "');return false;" - return template(hit); + + var next = ' | ' + M('Next') + ' >>'; + if (pages - currentPage > 0) + next = ' | ' + + M('Next') + ' >>'; + + var predots = ''; + if (firstClkbl > 1) + predots = '...'; + + var postdots = ''; + if (lastClkbl < pages) + postdots = '...'; + + s += '
' + + prev + predots + middle + postdots + next + '
'; + + return s; + } + }); +}); + + +mkws.registerWidgetType('Records', function() { + var that = this; + var team = this.team; + + this.team.queue("records").subscribe(function(data) { + var html = []; + for (var i = 0; i < data.hits.length; i++) { + var hit = data.hits[i]; + var divId = team.recordElementId(hit.recid[0]); + html.push('
', renderSummary(hit), '
'); + // ### At some point, we may be able to move the + // m_currentRecordId and m_currentRecordData members + // from the team object into this widget. + if (hit.recid == team.currentRecordId()) { + if (team.currentRecordData()) + html.push(team.renderDetails(team.currentRecordData())); } - }); - } + } + $(that.node).html(html.join('')); + function renderSummary(hit) { + var template = team.loadTemplate(that.config.template || "Summary"); + hit._id = team.recordElementId(hit.recid[0]); + hit._onclick = "mkws.showDetails('" + team.name() + "', '" + hit.recid[0] + "');return false;" + return template(hit); + } + }); - function promoteNavi() { - team.queue("navi").subscribe(function() { - var filters = team.filters(); - var text = ""; + widget.autosearch(that); +}); - for (var i in filters) { - if (text) { - text += " | "; - } - var filter = filters[i]; - if (filter.id) { - text += M('source') + ': ' + filter.name + ''; - } else { - text += M(filter.field) + ': ' + filter.value + ''; - } - } - $(node).html(text); - }); - } +mkws.registerWidgetType('Navi', function() { + var that = this; + var teamName = this.team.name(); + var M = mkws.M; + this.team.queue("navi").subscribe(function() { + var filters = that.team.filters(); + var text = ""; - function promoteSort() { - // It seems this and the Perpage widget doen't need to - // subscribe to anything, since they produce events rather - // than consuming them. - $(node).change(function () { - team.set_sortOrder($(node).val()); - if (team.submitted()) { - team.resetPage(); - team.reShow(); + for (var i in filters) { + if (text) { + text += " | "; } - return false; - }); - } - - - function promotePerpage() { - $(node).change(function() { - team.set_perpage($(node).val()); - if (team.submitted()) { - team.resetPage(); - team.reShow(); + var filter = filters[i]; + if (filter.id) { + text += M('source') + ': ' + filter.name + ''; + } else { + text += M(filter.field) + ': ' + filter.value + ''; } - return false; - }); - } -} + } + + $(that.node).html(text); + }); +}); + + +// It seems this and the Perpage widget doen't need to subscribe to +// anything, since they produce events rather than consuming them. +// +mkws.registerWidgetType('Sort', function() { + var that = this; + + $(this.node).change(function() { + that.team.set_sortOrder($(that.node).val()); + if (that.team.submitted()) { + that.team.resetPage(); + that.team.reShow(); + } + return false; + }); +}); + + +mkws.registerWidgetType('Perpage', function() { + var that = this; + + $(this.node).change(function() { + that.team.set_perpage($(that.node).val()); + if (that.team.submitted()) { + that.team.resetPage(); + that.team.reShow(); + } + return false; + }); +});