No need to invoke resetPage() before reShow(), which will do it for us.
[mkws-moved-to-github.git] / src / mkws-widgets.js
index 19789bd..6370952 100644 (file)
@@ -10,7 +10,7 @@ function widget($, team, type, node) {
        team: team,
        type: type,
        node: node,
-       config: Object.create(team.config())
+       config: mkws.objectInheritingFrom(team.config())
     };
 
     function log(s) {
@@ -59,6 +59,52 @@ function widget($, team, type, node) {
 }
 
 
+// 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");
+               }
+           } 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);
+               }
+           }
+
+           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.
@@ -108,71 +154,6 @@ mkws.registerWidgetType('Stat', function() {
 });
 
 
-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('<div class="title">' + M('Termlists') + '</div>');
-
-       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('<div class="facet mkwsFacet' + caption + ' mkwsTeam_' + teamName + '">');
-           acc.push('<div class="termtitle">' + M(caption) + '</div>');
-           for (var i = 0; i < data.length && i < max; i++) {
-               acc.push('<div class="term">');
-               acc.push('<a href="#" ');
-               var action = '';
-               if (!pzIndex) {
-                   // Special case: target selection
-                   acc.push('target_id='+data[i].id+' ');
-                   if (!that.team.targetFiltered(data[i].id)) {
-                       action = 'mkws.limitTarget(\'' + teamName + '\', this.getAttribute(\'target_id\'),this.firstChild.nodeValue)';
-                   }
-               } else {
-                   action = 'mkws.limitQuery(\'' + teamName + '\', \'' + pzIndex + '\', this.firstChild.nodeValue)';
-               }
-               acc.push('onclick="' + action + ';return false;">' + data[i].name + '</a>'
-                        + ' <span>' + data[i].freq + '</span>');
-               acc.push('</div>');
-           }
-           acc.push('</div>');
-       }
-    });
-});
-
-
 mkws.registerWidgetType('Pager', function() {
     var that = this;
     var M = mkws.M;
@@ -257,45 +238,15 @@ mkws.registerWidgetType('Records', function() {
        }
        $(that.node).html(html.join(''));
 
-       function renderSummary(hit)
-       {
-           var template = team.loadTemplate("Summary");
+       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 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");
-           }
-       } 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);
-           }
-       }
-
-       this.team.queue("ready").subscribe(function() {
-           var sortOrder = that.config.sort;
-           var targets = that.config.targets;
-           var s = "running auto search: '" + query + "'";
-           if (sortOrder) s += " sorted by '" + sortOrder + "'";
-           if (targets) s += " in targets '" + targets + "'";
-           that.log(s);
-
-           that.team.newSearch(query, sortOrder, targets);
-       });
-    }
+    widget.autosearch(that);
 });
 
 
@@ -337,7 +288,6 @@ mkws.registerWidgetType('Sort', function() {
     $(this.node).change(function() {
        that.team.set_sortOrder($(that.node).val());
        if (that.team.submitted()) {
-           that.team.resetPage();
            that.team.reShow();
        }
        return false;
@@ -351,9 +301,17 @@ mkws.registerWidgetType('Perpage', function() {
     $(this.node).change(function() {
        that.team.set_perpage($(that.node).val());
        if (that.team.submitted()) {
-           that.team.resetPage();
            that.team.reShow();
        }
        return false;
     });
 });
+
+
+mkws.registerWidgetType('Done', function() {
+    var that = this;
+
+    this.team.queue("complete").subscribe(function(n) {
+       $(that.node).html("Search complete: found " + n + " records");
+    });
+});