X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=src%2Fmkws-widgets.js;h=4df81d7bf67a7f1c59f9286b1870339e7ec7ac78;hb=571790bc7f30ce675dd09c2881247cb7f1aacf98;hp=5f25cd6bc1db74e3e60f48cfa0043dc444ed501d;hpb=6aff4689bf259a9c8f903f9bcf4ac7a178b167c1;p=mkws-moved-to-github.git diff --git a/src/mkws-widgets.js b/src/mkws-widgets.js index 5f25cd6..4df81d7 100644 --- a/src/mkws-widgets.js +++ b/src/mkws-widgets.js @@ -1,9 +1,16 @@ // 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()) }; function log(s) { @@ -13,289 +20,350 @@ function widget($, team, type, node) { 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); + } + } 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 + "'"); + } } - var promote = mkws.promotionFunction(type); - if (promote) { - promote.call(that); + var fn = mkws.promotionFunction(type); + if (fn) { + fn.call(that); log("made " + type + " widget(node=" + node + ")"); } else { - log("made UNENCAPSULATED widget(type=" + type + ", node=" + node + ")"); + log("made UNPROMOTED widget(type=" + type + ", node=" + node + ")"); } return that; } - // 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() { - var that = this; - var M = mkws.M; - - this.team.queue("targets").subscribe(function(data) { - var table ='' + - '' + - '' + - '' + - '' + - '' + - ''; - - for (var i = 0; i < data.length; i++) { - table += ""; +// 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; + + this.team.queue("targets").subscribe(function(data) { + var 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 + "
' + + '' + + '' + + '' + + '' + + '' + + ''; + + 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; + + this.team.queue("stat").subscribe(function(data) { + if (that.node.length === 0) alert("huh?!"); + + $(that.node).html('' + M('Status info') + '' + + ' -- ' + + '' + M('Active clients') + ': ' + data.activeclients + '/' + data.clients + '' + + ' -- ' + + '' + M('Retrieved records') + ': ' + data.records + '/' + data.hits + ''); + }); +}); + + +mkws.registerWidgetType('Termlists', function() { + var that = this; + var M = mkws.M; + + this.team.queue("termlists").subscribe(function(data) { + if (!that.node) { + alert("termlists event when there are no termlists"); + return; + } + + // no facets: this should never happen + var facets = that.config.facets; + if (!facets || facets.length == 0) { + alert("onTerm called even though we have no facets: " + $.toJSON(data)); + $(that.node).hide(); + return; + } + + // display if we first got results + $(that.node).show(); + + var acc = []; + acc.push('
' + M('Termlists') + '
'); + + 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] + "'"); } - - table += ''; - var subnode = $(that.node).children('.mkwsBytarget'); - subnode.html(table); - }); - } - - - function promoteStat() { - var that = this; - var M = mkws.M; - - this.team.queue("stat").subscribe(function(data) { - if (that.node.length === 0) alert("huh?!"); - - $(that.node).html('' + M('Status info') + '' + - ' -- ' + - '' + M('Active clients') + ': ' + data.activeclients + '/' + data.clients + '' + - ' -- ' + - '' + M('Retrieved records') + ': ' + data.records + '/' + data.hits + ''); - }); - } - - - function promoteTermlists() { - var that = this; - var M = mkws.M; - - this.team.queue("termlists").subscribe(function(data) { - if (!that.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)); - $(that.node).hide(); - return; - } - - // display if we first got results - $(that.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] + "'"); - } - } - - $(that.node).html(acc.join('')); - - function addSingleFacet(acc, caption, data, max, pzIndex) { - var teamName = that.team.name(); - acc.push('
'); - acc.push('
' + M(caption) + '
'); - for (var i = 0; i < data.length && i < max; i++) { - acc.push('
'); - 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 { + action = 'mkws.limitQuery(\'' + teamName + '\', \'' + pzIndex + '\', this.firstChild.nodeValue)'; } + acc.push('onclick="' + action + ';return false;">' + data[i].name + '' + + ' ' + data[i].freq + ''); acc.push('
'); } - }); - } - - - function promotePager() { - var that = this; - var M = mkws.M; - - 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 + ' '; - } - - 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 + '
'; + acc.push('
'); + } + }); +}); + + +mkws.registerWidgetType('Pager', function() { + var that = this; + var M = mkws.M; + + 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 + ' '; + } - return s; + 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())); } - }); - } - - - function promoteRecords() { - 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("Summary"); + hit._id = team.recordElementId(hit.recid[0]); + hit._onclick = "mkws.showDetails('" + team.name() + "', '" + hit.recid[0] + "');return false;" + return template(hit); + } + }); + + mkws.maybeAutosearch(that); +}); + + +mkws.maybeAutosearch = function(that) { + var query = that.config.autosearch; + if (query) { + if (query.match(/^!param!/)) { + var param = query.replace(/^!param!/, ''); + query = mkws.getParameterByName(param); + that.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"); } - $(that.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); + } else if (query.match(/^!path!/)) { + var index = query.replace(/^!path!/, ''); + var path = window.location.pathname.split('/'); + query = path[path.length - index]; + that.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); } + } + + that.team.queue("ready").subscribe(function() { + var sortOrder = that.config.sort; + var perpage = that.config.perpage; + var limit = that.config.limit; + var targets = that.config.targets; + var targetfilter = that.config.targetfilter; + var s = "running auto search: '" + query + "'"; + if (sortOrder) s += " sorted by '" + sortOrder + "'"; + 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 + "'"; + that.log(s); + + that.team.newSearch(query, sortOrder, perpage, limit, targets, targetfilter); }); } +}; - function promoteNavi() { - 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 = ""; - - 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 + ''; - } - } - - $(that.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. - $(this.node).change(function () { - this.team.set_sortOrder($(node).val()); - if (this.team.submitted()) { - this.team.resetPage(); - this.team.reShow(); + for (var i in filters) { + if (text) { + text += " | "; } - return false; - }); - } - - - function promotePerpage() { - $(this.node).change(function() { - this.team.set_perpage($(node).val()); - if (this.team.submitted()) { - this.team.resetPage(); - this.team.reShow(); + var filter = filters[i]; + if (filter.id) { + text += M('source') + ': ' + filter.name + ''; + } else { + text += M(filter.field) + ': ' + filter.value + ''; } - return false; - }); - } - - mkws.registerWidgetType('Targets', promoteTargets); - mkws.registerWidgetType('Stat', promoteStat); - mkws.registerWidgetType('Termlists', promoteTermlists); - mkws.registerWidgetType('Pager', promotePager); - mkws.registerWidgetType('Records', promoteRecords); - mkws.registerWidgetType('Navi', promoteNavi); - mkws.registerWidgetType('Sort', promoteSort); - mkws.registerWidgetType('Perpage', promotePerpage); - + } + + $(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; + }); +});