diff --git a/core/modules/widgets/action-listops.js b/core/modules/widgets/action-listops.js new file mode 100644 index 000000000..c88130b39 --- /dev/null +++ b/core/modules/widgets/action-listops.js @@ -0,0 +1,89 @@ +/*\ +title: $:/core/modules/widgets/action-listops.js +type: application/javascript +module-type: widget + +Action widget to apply list operations to any tiddler field (defaults to the 'tags' field of the current tiddler) + +\*/ +(function () { + + /*jslint node: true, browser: true */ + /*global $tw: false */ + "use strict"; + + var Widget = require("$:/core/modules/widgets/widget.js").widget; + + var ActionListopsWidget = function (parseTreeNode, options) { + this.initialise(parseTreeNode, options); + }; + + /* + Inherit from the base widget class + */ + ActionListopsWidget.prototype = new Widget(); + + /* + Render this widget into the DOM + */ + ActionListopsWidget.prototype.render = function (parent, nextSibling) { + this.computeAttributes(); + this.execute(); + }; + + /* + Compute the internal state of the widget + */ + ActionListopsWidget.prototype.execute = function () { + // Get our parameters + this.target = this.getAttribute("$tiddler", this.getVariable("currentTiddler")); + this.filter = this.getAttribute("$filter"); + this.subfilter = this.getAttribute("$subfilter"); + this.listField = this.getAttribute("$list", "list"); + this.listIndex = this.getAttribute("$index"); + this.filtertags = this.getAttribute("$tags"); + }; + + /* + Refresh the widget by ensuring our attributes are up to date + */ + ActionListopsWidget.prototype.refresh = function (changedTiddlers) { + var changedAttributes = this.computeAttributes(); + if (changedAttributes.$tiddler || changedAttributes.$filter || changedAttributes.$subfilter || changedAttributes.$list || changedAttributes.$index || changedAttributes.$tags) { + this.refreshSelf(); + return true; + } + return this.refreshChildren(changedTiddlers); + }; + + /* + Invoke the action associated with this widget + */ + ActionListopsWidget.prototype.invokeAction = function (triggeringWidget, event) { + //try this + var field = this.listField, + index = undefined, + type = "!!", + list = this.listField; + if (this.listIndex) { + field = undefined; + index = this.listIndex; type = "##"; + list = this.listIndex; + } + if (this.filter) { + this.wiki.setText(this.target, field, index, $tw.utils.stringifyList(this.wiki.filterTiddlers(this.filter, this))); + } + if (this.subfilter) { + var subfilter = "[list[" + this.target + type + list + "]] " + this.subfilter; + this.wiki.setText(this.target, field, index, $tw.utils.stringifyList(this.wiki.filterTiddlers(subfilter, this))); + } + if (this.filtertags) { + var tagfilter = "[list[" + this.target + "!!tags]] " + this.filtertags; + this.wiki.setText(this.target, "tags", undefined, $tw.utils.stringifyList(this.wiki.filterTiddlers(tagfilter, this))); + } + return true; // Action was invoked + }; + + exports["action-listops"] = ActionListopsWidget; + +})();