From 49f75165b292003b012d62c3014b266d28cc5c15 Mon Sep 17 00:00:00 2001 From: Mike Taylor Date: Wed, 26 Mar 2014 10:37:52 +0000 Subject: [PATCH] Move actual widgets out of mkws-core.js into their own file mkws-widgets.js --- src/Makefile | 2 +- src/mkws-core.js | 280 --------------------------------------------------- src/mkws-widgets.js | 278 ++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 279 insertions(+), 281 deletions(-) create mode 100644 src/mkws-widgets.js diff --git a/src/Makefile b/src/Makefile index 8586a3c..ac8ef68 100644 --- a/src/Makefile +++ b/src/Makefile @@ -9,7 +9,7 @@ HANDLEBARS_URL= http://builds.handlebarsjs.com.s3.amazonaws.com/handlebars-v1.1. PP2_URL= http://git.indexdata.com/?p=pazpar2.git;a=blob_plain;f=js/pz2.js;hb=HEAD VERSION = $(shell tr -d '\012' < VERSION) -COMPONENTS = mkws-core.js mkws-handlebars.js +COMPONENTS = mkws-core.js mkws-widgets.js mkws-handlebars.js JQUERY_FILE := $(shell basename ${JQUERY_URL}) JQUERY_JSON_FILE := $(shell basename ${JQUERY_JSON_URL}) diff --git a/src/mkws-core.js b/src/mkws-core.js index 3ed81a3..8a8b9cb 100644 --- a/src/mkws-core.js +++ b/src/mkws-core.js @@ -83,286 +83,6 @@ if (mkws_config == null || typeof mkws_config != 'object') { } -// Factory function for widget objects. -function widget($, team, type, node) { - var that = { - team: team, - type: type, - node: node - }; - - 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); - } - - // 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 += ""; - } - - 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); - }); - } - - - 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 + ''); - }); - } - - - 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] + "'"); - } - } - - $(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('
'); - } - 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 + ''; - - 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 + '
'; - - 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())); - } - } - $(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); - } - }); - } - - - function promoteNavi() { - team.queue("navi").subscribe(function() { - var filters = 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 + ''; - } - } - - $(node).html(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(); - } - return false; - }); - } - - - function promotePerpage() { - $(node).change(function() { - team.set_perpage($(node).val()); - if (team.submitted()) { - team.resetPage(); - team.reShow(); - } - return false; - }); - } -} - - // Factory function for team objects. As much as possible, this uses // only member variables (prefixed "m_") and inner functions with // private scope. Some functions are visibl as member-functions to be diff --git a/src/mkws-widgets.js b/src/mkws-widgets.js new file mode 100644 index 0000000..ff6bba1 --- /dev/null +++ b/src/mkws-widgets.js @@ -0,0 +1,278 @@ +// Factory function for widget objects. +function widget($, team, type, node) { + var that = { + team: team, + type: type, + node: node + }; + + 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); + } + + // 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 += ""; + } + + 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); + }); + } + + + 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 + ''); + }); + } + + + 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] + "'"); + } + } + + $(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('
'); + } + 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 + ''; + + 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 + '
'; + + 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())); + } + } + $(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); + } + }); + } + + + function promoteNavi() { + team.queue("navi").subscribe(function() { + var filters = 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 + ''; + } + } + + $(node).html(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(); + } + return false; + }); + } + + + function promotePerpage() { + $(node).change(function() { + team.set_perpage($(node).val()); + if (team.submitted()) { + team.resetPage(); + team.reShow(); + } + return false; + }); + } +} -- 1.7.10.4