/*\ title: $:/core/modules/widgets/count.js type: application/javascript module-type: widget Implements the count widget that displays the number of tiddlers that match a filter \*/ (function(){ /*jslint node: true, browser: true */ /*global $tw: false */ "use strict"; var CountWidget = function(renderer) { // Save state this.renderer = renderer; // Execute the filter to get the initial count this.executeFilter(); // Generate child nodes this.generate(); }; CountWidget.prototype.executeFilter = function() { // Get attributes this.filter = this.renderer.getAttribute("filter"); // Execute the filter if(this.filter) { this.currentCount = this.renderer.renderTree.wiki.filterTiddlers(this.filter,this.renderer.tiddlerTitle).length; } else { this.currentCount = undefined; } }; CountWidget.prototype.generate = function() { // Set the element this.tag = "span"; this.attributes = {}; this.children = this.renderer.renderTree.createRenderers(this.renderer,[ {type: "text", text: this.currentCount !== undefined ? this.currentCount.toString() : ""} ]); }; CountWidget.prototype.refreshInDom = function(changedAttributes,changedTiddlers) { // Re-execute the filter to get the count var oldCount = this.currentCount; this.executeFilter(); if(this.currentCount !== oldCount) { // Regenerate and rerender the widget and replace the existing DOM node this.generate(); var oldDomNode = this.renderer.domNode, newDomNode = this.renderer.renderInDom(); oldDomNode.parentNode.replaceChild(newDomNode,oldDomNode); } }; exports.count = CountWidget; })();