From 56d467fb47cc169c2f63ea5e88fe372aec8db2cf Mon Sep 17 00:00:00 2001 From: William Jackson Date: Sun, 18 Oct 2015 18:41:40 +0200 Subject: [PATCH] Create action-listops.js Action widget designed to apply filters to the current list and save the modified list back to the list. The widget is able to manipulate lists in any field or any data index of the target tiddler, and includes an option to manipulate the tags of the target tiddler. The widget is used in conjunction with the extended list operator filters (xlistops.js) --- core/modules/widgets/action-listops.js | 89 ++++++++++++++++++++++++++ 1 file changed, 89 insertions(+) create mode 100644 core/modules/widgets/action-listops.js 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; + +})();