X-Git-Url: http://git.indexdata.com/?p=mkws-moved-to-github.git;a=blobdiff_plain;f=src%2Fmkws-widget-main.js;h=5438348ca3ef04a95c352cdc9c9d3bc4f6ac6021;hp=55d628d500f602b0bb81623e50bcc0ebe87a5369;hb=fedd5ca7b6f69684e6c59cec1c92e82952cafa9c;hpb=044c8e76ecb0309ea75216f419f3eabcae9ab82d diff --git a/src/mkws-widget-main.js b/src/mkws-widget-main.js index 55d628d..5438348 100644 --- a/src/mkws-widget-main.js +++ b/src/mkws-widget-main.js @@ -1,172 +1,171 @@ +(function($) { // jQuery wrapper + // 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() { +mkws.registerWidgetType('targets', function() { if (!this.config.show_switch) return; var that = this; - var M = mkws.M; - this.jqnode.html('No information available yet.'); - this.jqnode.css("display", "none"); + this.node.html('No information available yet.'); + this.node.css("display", "none"); this.team.queue("targets").subscribe(function(data) { - var table ='' + - '' + - '' + - '' + - '' + - '' + - ''; - + // There is a bug in pz2.js wherein it makes each data object an array but + // simply assigns properties to it. + // TODO: remove this when PAZ-946 is addressed. + var cleandata = []; for (var i = 0; i < data.length; i++) { - table += ""; + var cur = {}; + cur.name = data[i].name; + cur.id = data[i].id; + cur.hits = data[i].hits; + cur.diagnostic = data[i].diagnostic; + cur.message = data[i].message; + cur.records = data[i].records; + cur.state = data[i].state; + cleandata.push(cur); } - 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 + "
'; - that.jqnode.html(table); + cleandata.sort(function(a,b) { return a.name.localeCompare(b.name) }); + + var template = that.team.loadTemplate(that.config.template || "targets"); + that.node.html(template({data: cleandata})); }); }); -mkws.registerWidgetType('Stat', function() { +mkws.registerWidgetType('stat', function() { var that = this; - var M = mkws.M; - this.team.queue("stat").subscribe(function(data) { - that.jqnode.html(' -- ' + - '' + M('Active clients') + ': ' + data.activeclients + '/' + data.clients + '' + - ' -- ' + - M('Retrieved records') + ': ' + data.records + '/' + data.hits); + var template = that.team.loadTemplate(that.config.template || "stat"); + that.node.html(template(data)); }); }); -mkws.registerWidgetType('Pager', function() { +mkws.registerWidgetType('pager', function() { var that = this; var M = mkws.M; this.team.queue("pager").subscribe(function(data) { - that.jqnode.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 teamName = that.team.name(); + var output = {}; + output.first = data.start + 1; + output.last = data.start + data.num; + output.count = data.merged; + output.found = data.total; + + //client indexes pages from 1 but pz2 from 0 + var onsides = 5; + 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; + + if (firstClkbl > 1) output.morePrev = true; + if (lastClkbl < pages) output.moreNext = true; + + if (currentPage > 1) output.prevClick = "mkws.pagerPrev(\'" + teamName + "\');"; + + output.pages = []; + for(var i = firstClkbl; i <= lastClkbl; i++) { + var o = {}; + o.number = i; + if (i !== currentPage) { + o.click = "mkws.showPage(\'" + teamName + "\', " + i + ");"; } + output.pages.push(o); + } - var next = ' | ' + M('Next') + ' >>'; - if (pages - currentPage > 0) - next = ' | ' - + M('Next') + ' >>'; - - var predots = ''; - if (firstClkbl > 1) - predots = '...'; - - var postdots = ''; - if (lastClkbl < pages) - postdots = '...'; + if (pages - currentPage > 0) output.nextClick = "mkws.pagerNext(\'" + teamName + "\')"; - s += '
' - + prev + predots + middle + postdots + next + '
'; + var template = that.team.loadTemplate(that.config.template || "pager"); + that.node.html(template(output)); + }); +}); - return s; +mkws.registerWidgetType('details', function() { + var that = this; + var recid = that.node.attr("data-mkws-recid"); + if (this.team.gotRecords()) { + that.team.fetchDetails(recid); + } else { + this.team.queue("firstrecords").subscribe(function() { + that.team.fetchDetails(recid); + }); + } + this.team.queue("record").subscribe(function(data) { + if ($.inArray(recid, data.recid) > -1) { + var template = that.team.loadTemplate(that.config.template || "details"); + that.node.html(template(data)); } }); }); - -mkws.registerWidgetType('Records', function() { +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]; - that.team.queue("record").publish(hit); - var divId = team.recordElementId(hit.recid[0]); - html.push('
', renderSummary(hit), '
'); + hit.detailLinkId = team.recordElementId(hit.recid[0]); + hit.detailClick = "mkws.showDetails('" + team.name() + "', '" + hit.recid[0] + "');return false;"; + hit.containerClass = "mkws-summary mkwsSummary mkws-team-" + team.name(); + hit.containerClass += " " + hit.detailLinkId; // ### 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())); + if (team.currentRecordData()) { + hit.renderedDetails = team.renderDetails(team.currentRecordData()); + } } } - that.jqnode.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); - } + var template = team.loadTemplate(that.config.template || "records"); + var summaryPartial = team.loadTemplate(that.config['summary-template'] || "summary"); + var tdata = $.extend({}, {"hits": data.hits}, that.config.template_vars); + that.node.html(template(tdata, {"partials":{"summary":summaryPartial}})); }); - widget.autosearch(that); + that.autosearch(); }); -mkws.registerWidgetType('Navi', function() { +mkws.registerWidgetType('navi', function() { var that = this; var teamName = this.team.name(); - var M = mkws.M; - this.team.queue("navi").subscribe(function() { + this.team.queue("searchtriggered").subscribe(function() { var filters = that.team.filters(); - var text = ""; + var output = {filters:[]}; filters.visitTargets(function(id, name) { - if (text) text += " | "; - text += M('source') + ': ' + name + ''; + var cur = {}; + cur.facet = 'source'; + cur.value = name; + cur.click = "mkws.delimitTarget('" + teamName + "', '" + id + "'); return false;"; + output.filters.push(cur); }); filters.visitFields(function(field, value) { - if (text) text += " | "; - text += M(field) + ': ' + value + ''; + var cur = {}; + cur.facet = field; + cur.value = value; + cur.click = "mkws.delimitQuery('" + teamName + "', '" + field + "', '" + value + "'" + ");return false;"; + output.filters.push(cur); }); - that.jqnode.html(text); + var template = that.team.loadTemplate(that.config.template || "navi"); + that.node.html(template(output)); }); }); @@ -174,11 +173,11 @@ mkws.registerWidgetType('Navi', function() { // 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() { +mkws.registerWidgetType('sort', function() { var that = this; - this.jqnode.change(function() { - that.team.set_sortOrder(that.jqnode.val()); + this.node.change(function() { + that.team.set_sortOrder(that.node.val()); if (that.team.submitted()) { that.team.reShow(); } @@ -187,11 +186,11 @@ mkws.registerWidgetType('Sort', function() { }); -mkws.registerWidgetType('Perpage', function() { +mkws.registerWidgetType('per-page', function() { var that = this; - this.jqnode.change(function() { - that.team.set_perpage(that.jqnode.val()); + this.node.change(function() { + that.team.set_perpage(that.node.val()); if (that.team.submitted()) { that.team.reShow(); } @@ -200,137 +199,86 @@ mkws.registerWidgetType('Perpage', function() { }); -mkws.registerWidgetType('Done', function() { +mkws.registerWidgetType('done', function() { var that = this; - this.team.queue("complete").subscribe(function(n) { - that.jqnode.html("Search complete: found " + n + " records"); + var template = that.team.loadTemplate(that.config.template || "done"); + that.node.html(template({count: n})); }); }); -mkws.registerWidgetType('Switch', function() { +mkws.registerWidgetType('switch', function() { if (!this.config.show_switch) return; var tname = this.team.name(); - this.jqnode.html('\ -Records \ -| \ -Targets'); - widget.hideWhenNarrow(this); + var output = {}; + output.recordClick = "mkws.switchView(\'" + tname + "\', \'records\')"; + output.targetClick = "mkws.switchView(\'" + tname + "\', \'targets\')"; + var template = this.team.loadTemplate(this.config.template || "switch"); + this.node.html(template(output)); + this.hideWhenNarrow(); }); -mkws.registerWidgetType('Search', function() { - var tname = this.team.name(); - var M = mkws.M; - - this.jqnode.html('\ -
\ - \ - \ -
'); +mkws.registerWidgetType('search', function() { + var output = {}; + output.team = this.team.name(); + var template = this.team.loadTemplate(this.config.template || "search"); + this.node.html(template(output)); }); -mkws.registerWidgetType('SearchForm', function() { +mkws.registerWidgetType('search-form', function() { var team = this.team; - this.jqnode.submit(function() { - var val = team.widget('Query').value(); + this.node.submit(function() { + var val = team.widget('query').value(); team.newSearch(val); return false; }); }); -mkws.registerWidgetType('Results', function() { - var tname = this.team.name(); - - this.jqnode.html('\ -\ - \ - \ - \ - \ - \ - \ - \ -
\ -
\ -
\ -
\ -
\ -
\ -
\ -
\ -
\ -
'); - - widget.autosearch(this); +mkws.registerWidgetType('results', function() { + var template = this.team.loadTemplate(this.config.template || "results"); + this.node.html(template({team: this.team.name()})); + this.autosearch(); }); -mkws.registerWidgetType('Ranking', function() { - var tname = this.team.name(); - var that = this; - var M = mkws.M; - - var s = '
'; - if (this.config.show_sort) { - s += M('Sort by') + ' ' + mkwsHtmlSort() + ' '; - } - if (this.config.show_perpage) { - s += M('and show') + ' ' + mkwsHtmlPerpage() + ' ' + M('per page') + '.'; +mkws.registerWidgetType('ranking', function() { + var output = {}; + output.perPage = []; + output.sort = []; + output.team = this.team.name(); + output.showSort = this.config.show_sort; + output.showPerPage = this.config.show_perpage; + + var order = this.team.sortOrder(); + this.info("making sort, sortOrder = '" + order + "'"); + for (var i = 0; i < this.config.sort_options.length; i++) { + var cur = {}; + var opt = this.config.sort_options[i]; + cur.key = opt[0]; + cur.label = opt.length == 1 ? opt[0] : opt[1]; + if (order == cur.key || order == cur.label) cur.selected = true; + output.sort.push(cur); } - s += '
'; - this.jqnode.html(s); - - - function mkwsHtmlSort() { - var order = that.team.sortOrder(); - - that.log("making sort HTML, sortOrder = '" + order + "'"); - var sort_html = ''; - - return sort_html; + var perpage = this.team.perpage(); + this.info("making perpage, perpage = " + perpage); + for(var i = 0; i < this.config.perpage_options.length; i++) { + var cur = {}; + cur.perPage = this.config.perpage_options[i]; + if (cur.perPage == perpage) cur.selected = true; + output.perPage.push(cur); } - function mkwsHtmlPerpage() { - var perpage = that.team.perpage(); - - that.log("making perpage HTML, perpage = " + perpage); - var perpage_html = ''; - - return perpage_html; - } + var template = this.team.loadTemplate(this.config.template || "ranking"); + this.node.html(template(output)); }); -mkws.registerWidgetType('Lang', function() { +mkws.registerWidgetType('lang', function() { // dynamic URL or static page? /path/foo?query=test /* create locale language menu */ if (!this.config.show_lang) return; @@ -340,40 +288,36 @@ mkws.registerWidgetType('Lang', function() { var list = []; /* display a list of configured languages, or all */ - var lang_options = this.config.lang_options || []; + var lang_options = this.config.lang_options; var toBeIncluded = {}; for (var i = 0; i < lang_options.length; i++) { toBeIncluded[lang_options[i]] = true; } for (var k in mkws.locale_lang) { - if (toBeIncluded[k] || lang_options.length == 0) - list.push(k); + if (toBeIncluded[k] || lang_options.length == 0) { + cur = {}; + if (lang === k) cur.selected = true; + cur.code = k; + cur.url = lang_url(k); + list.push(cur); + } } // add english link - if (lang_options.length == 0 || toBeIncluded[lang_default]) - list.push(lang_default); - - this.log("language menu: " + list.join(", ")); - - /* the HTML part */ - var data = ""; - for (var i = 0; i < list.length; i++) { - var l = list[i]; - if (data) - data += ' | '; - - if (lang == l) { - data += ' ' + l + ' '; - } else { - data += ' ' + l + ' ' - } + if (lang_options.length == 0 || toBeIncluded[lang_default]) { + cur = {}; + if (lang === lang_default) cur.selected = true; + cur.code = lang_default; + cur.url = lang_url(lang_default); + list.push(cur); } - this.jqnode.html(data); - widget.hideWhenNarrow(this); + this.info("language menu: " + list.join(", ")); + var template = this.team.loadTemplate(this.config.template || "lang"); + this.node.html(template({languages: list})); + this.hideWhenNarrow(); // set or re-set "lang" URL parameter function lang_url(lang) { @@ -396,23 +340,52 @@ mkws.registerWidgetType('Lang', function() { }); -mkws.registerWidgetType('MOTD', function() { - var container = this.team.widget('MOTDContainer'); +mkws.registerWidgetType('motd', function() { + var container = this.team.widget('motd-container'); if (container) { // Move the MOTD from the provided element down into the container - this.jqnode.appendTo(container.node); // #### can this be container.jqnode + this.node.appendTo(container.node); + } +}); + + +// This widget has no functionality of its own, but its configuration +// is copied up into its team, allowing it to affect other widgets in +// the team. +// +mkws.registerWidgetType('config', function() { + var c = this.config; + for (var name in c) { + if (c.hasOwnProperty(name)) { + this.team.config[name] = c[name]; + this.info(this + " copied property " + name + "='" + c[name] + "' up to team"); + } } }); +mkws.registerWidgetType('progress', function() { + var that = this; + this.node.hide(); + this.team.queue("stat").subscribe(function(data) { + var template = that.team.loadTemplate(that.config.template || "progress"); + that.node.html(template({ + done: data.clients - data.activeclients, + waiting: data.activeclients + })); + that.node.show(); + }); +}); + + // Some elements have mkws* classes that makes them appear as widgets // -- for example, because we want to style them using CSS -- but have // no actual functionality. We register these to prevent ignorable // warnings when they occur. -mkws.registerWidgetType('Query', function() {}); -mkws.registerWidgetType('MOTDContainer', function() {}); -mkws.registerWidgetType('Button', function() {}); -mkws.registerWidgetType('Popup', function() {}); +mkws.registerWidgetType('query', function() {}); +mkws.registerWidgetType('motd-container', function() {}); +mkws.registerWidgetType('button', function() {}); +})(mkws.$); // jQuery wrapper