From 348a6976b74c0c36bb4d443acfe71b433e27d5ba Mon Sep 17 00:00:00 2001 From: Jeremy Ruston Date: Tue, 4 Jun 2013 12:02:37 +0100 Subject: [PATCH] Add fieldmangler widget that allows fields to be added and removed to tiddlers --- core/modules/widgets/fieldmangler.js | 60 ++++++++++++++++++++++++++++ 1 file changed, 60 insertions(+) create mode 100644 core/modules/widgets/fieldmangler.js diff --git a/core/modules/widgets/fieldmangler.js b/core/modules/widgets/fieldmangler.js new file mode 100644 index 000000000..980ce5b83 --- /dev/null +++ b/core/modules/widgets/fieldmangler.js @@ -0,0 +1,60 @@ +/*\ +title: $:/core/modules/widgets/fieldmangler.js +type: application/javascript +module-type: widget + +The fieldmangler widget modifies the fields of the current tiddler in response to messages. + +\*/ +(function(){ + +/*jslint node: true, browser: true */ +/*global $tw: false */ +"use strict"; + +var FieldManglerWidget = function(renderer) { + // Save state + this.renderer = renderer; + // Generate child nodes + this.generate(); +}; + +FieldManglerWidget.prototype.generate = function() { + var self = this; + // Get parameters from our attributes + this.tiddlerTitle = this.renderer.getAttribute("tiddler",this.renderer.tiddlerTitle); + // Set the element + this.tag = "div"; + this.attributes = { + "class": "tw-fieldmangler" + }; + // Set event handlers + this.events = [ + {name: "tw-remove-field", handlerObject: this, handlerMethod: "handleRemoveFieldEvent"}, + {name: "tw-add-field", handlerObject: this, handlerMethod: "handleAddFieldEvent"} + ]; + // Render the children + this.children = this.renderer.renderTree.createRenderers(this.renderer,this.renderer.parseTreeNode.children); +}; + +FieldManglerWidget.prototype.handleRemoveFieldEvent = function(event) { + var tiddler = this.renderer.renderTree.wiki.getTiddler(this.tiddlerTitle), + deletion = {}; + deletion[event.currentField] = undefined; + this.renderer.renderTree.wiki.addTiddler(new $tw.Tiddler(tiddler,deletion)); + return true; +}; + +FieldManglerWidget.prototype.handleAddFieldEvent = function(event) { + var tiddler = this.renderer.renderTree.wiki.getTiddler(this.tiddlerTitle); + if(typeof event.param === "string" && event.param !== "" && !$tw.utils.hop(tiddler.fields,event.param)) { + var addition = {}; + addition[event.param] = ""; + this.renderer.renderTree.wiki.addTiddler(new $tw.Tiddler(tiddler,addition)); + } + return true; +}; + +exports.fieldmangler = FieldManglerWidget; + +})();