mirror of
				https://github.com/Jermolene/TiddlyWiki5
				synced 2025-10-30 23:23:02 +00:00 
			
		
		
		
	Set multiple fields/variables/params using filters (#6130)
* Add action-setmultiplefields and setmultiplevariables, and extend action-sendmessage * Add getfield operator * Remove getfield operator See discussion at https://github.com/Jermolene/TiddlyWiki5/pull/6130#issuecomment-949911439 * Add docs * Adjust whitespace * Add support for assigning multiple indexes to action-setmultiplefields
This commit is contained in:
		| @@ -39,6 +39,8 @@ SendMessageWidget.prototype.execute = function() { | |||||||
| 	this.actionParam = this.getAttribute("$param"); | 	this.actionParam = this.getAttribute("$param"); | ||||||
| 	this.actionName = this.getAttribute("$name"); | 	this.actionName = this.getAttribute("$name"); | ||||||
| 	this.actionValue = this.getAttribute("$value",""); | 	this.actionValue = this.getAttribute("$value",""); | ||||||
|  | 	this.actionNames = this.getAttribute("$names"); | ||||||
|  | 	this.actionValues = this.getAttribute("$values"); | ||||||
| }; | }; | ||||||
|  |  | ||||||
| /* | /* | ||||||
| @@ -59,13 +61,20 @@ Invoke the action associated with this widget | |||||||
| SendMessageWidget.prototype.invokeAction = function(triggeringWidget,event) { | SendMessageWidget.prototype.invokeAction = function(triggeringWidget,event) { | ||||||
| 	// Get the string parameter | 	// Get the string parameter | ||||||
| 	var param = this.actionParam; | 	var param = this.actionParam; | ||||||
| 	// Assemble the attributes as a hashmap | 	// Assemble the parameters as a hashmap | ||||||
| 	var paramObject = Object.create(null); | 	var paramObject = Object.create(null); | ||||||
| 	var count = 0; | 	// Add names/values pairs if present | ||||||
|  | 	if(this.actionNames && this.actionValues) { | ||||||
|  | 		var names = this.wiki.filterTiddlers(this.actionNames,this), | ||||||
|  | 			values = this.wiki.filterTiddlers(this.actionValues,this); | ||||||
|  | 		$tw.utils.each(names,function(name,index) { | ||||||
|  | 			paramObject[name] = values[index] || ""; | ||||||
|  | 		}); | ||||||
|  | 	} | ||||||
|  | 	// Add raw parameters | ||||||
| 	$tw.utils.each(this.attributes,function(attribute,name) { | 	$tw.utils.each(this.attributes,function(attribute,name) { | ||||||
| 		if(name.charAt(0) !== "$") { | 		if(name.charAt(0) !== "$") { | ||||||
| 			paramObject[name] = attribute; | 			paramObject[name] = attribute; | ||||||
| 			count++; |  | ||||||
| 		} | 		} | ||||||
| 	}); | 	}); | ||||||
| 	// Add name/value pair if present | 	// Add name/value pair if present | ||||||
| @@ -73,14 +82,15 @@ SendMessageWidget.prototype.invokeAction = function(triggeringWidget,event) { | |||||||
| 		paramObject[this.actionName] = this.actionValue; | 		paramObject[this.actionName] = this.actionValue; | ||||||
| 	} | 	} | ||||||
| 	// Dispatch the message | 	// Dispatch the message | ||||||
| 	this.dispatchEvent({ | 	var params = { | ||||||
| 		type: this.actionMessage, | 		type: this.actionMessage, | ||||||
| 		param: param, | 		param: param, | ||||||
| 		paramObject: paramObject, | 		paramObject: paramObject, | ||||||
| 		tiddlerTitle: this.getVariable("currentTiddler"), | 		event: event, | ||||||
| 		navigateFromTitle: this.getVariable("storyTiddler"), | 		currentTiddler: this.getVariable("currentTiddler"), | ||||||
| 		event: event | 		navigateFromTitle: this.getVariable("storyTiddler") | ||||||
| 	}); | 	}; | ||||||
|  | 	this.dispatchEvent(params); | ||||||
| 	return true; // Action was invoked | 	return true; // Action was invoked | ||||||
| }; | }; | ||||||
|  |  | ||||||
|   | |||||||
							
								
								
									
										86
									
								
								core/modules/widgets/action-setmultiplefields.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										86
									
								
								core/modules/widgets/action-setmultiplefields.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,86 @@ | |||||||
|  | /*\ | ||||||
|  | title: $:/core/modules/widgets/action-setmultiplefields.js | ||||||
|  | type: application/javascript | ||||||
|  | module-type: widget | ||||||
|  |  | ||||||
|  | Action widget to set multiple fields or indexes on a tiddler | ||||||
|  |  | ||||||
|  | \*/ | ||||||
|  | (function(){ | ||||||
|  |  | ||||||
|  | /*jslint node: true, browser: true */ | ||||||
|  | /*global $tw: false */ | ||||||
|  | "use strict"; | ||||||
|  |  | ||||||
|  | var Widget = require("$:/core/modules/widgets/widget.js").widget; | ||||||
|  |  | ||||||
|  | var SetMultipleFieldsWidget = function(parseTreeNode,options) { | ||||||
|  | 	this.initialise(parseTreeNode,options); | ||||||
|  | }; | ||||||
|  |  | ||||||
|  | /* | ||||||
|  | Inherit from the base widget class | ||||||
|  | */ | ||||||
|  | SetMultipleFieldsWidget.prototype = new Widget(); | ||||||
|  |  | ||||||
|  | /* | ||||||
|  | Render this widget into the DOM | ||||||
|  | */ | ||||||
|  | SetMultipleFieldsWidget.prototype.render = function(parent,nextSibling) { | ||||||
|  | 	this.computeAttributes(); | ||||||
|  | 	this.execute(); | ||||||
|  | }; | ||||||
|  |  | ||||||
|  | /* | ||||||
|  | Compute the internal state of the widget | ||||||
|  | */ | ||||||
|  | SetMultipleFieldsWidget.prototype.execute = function() { | ||||||
|  | 	this.actionTiddler = this.getAttribute("$tiddler",this.getVariable("currentTiddler")); | ||||||
|  | 	this.actionFields = this.getAttribute("$fields"); | ||||||
|  | 	this.actionIndexes = this.getAttribute("$indexes"); | ||||||
|  | 	this.actionValues = this.getAttribute("$values"); | ||||||
|  | 	this.actionTimestamp = this.getAttribute("$timestamp","yes") === "yes"; | ||||||
|  | }; | ||||||
|  |  | ||||||
|  | /* | ||||||
|  | Refresh the widget by ensuring our attributes are up to date | ||||||
|  | */ | ||||||
|  | SetMultipleFieldsWidget.prototype.refresh = function(changedTiddlers) { | ||||||
|  | 	var changedAttributes = this.computeAttributes(); | ||||||
|  | 	if(changedAttributes["$tiddler"] || changedAttributes["$fields"] || changedAttributes["$indexes"] || changedAttributes["$values"] || changedAttributes["$timestamp"]) { | ||||||
|  | 		this.refreshSelf(); | ||||||
|  | 		return true; | ||||||
|  | 	} | ||||||
|  | 	return this.refreshChildren(changedTiddlers); | ||||||
|  | }; | ||||||
|  |  | ||||||
|  | /* | ||||||
|  | Invoke the action associated with this widget | ||||||
|  | */ | ||||||
|  | SetMultipleFieldsWidget.prototype.invokeAction = function(triggeringWidget,event) { | ||||||
|  | 	var tiddler = this.wiki.getTiddler(this.actionTiddler), | ||||||
|  | 		names, values = this.wiki.filterTiddlers(this.actionValues,this); | ||||||
|  | 	if(this.actionFields) { | ||||||
|  | 		var additions = {}; | ||||||
|  | 		names = this.wiki.filterTiddlers(this.actionFields,this); | ||||||
|  | 		$tw.utils.each(names,function(fieldname,index) { | ||||||
|  | 			additions[fieldname] = values[index] || ""; | ||||||
|  | 		}); | ||||||
|  | 		var creationFields = this.actionTimestamp ? this.wiki.getCreationFields() : undefined, | ||||||
|  | 			modificationFields = this.actionTimestamp ? this.wiki.getModificationFields() : undefined; | ||||||
|  | 		this.wiki.addTiddler(new $tw.Tiddler(creationFields,tiddler,{title: this.actionTiddler},modificationFields,additions)); | ||||||
|  | 	} else if(this.actionIndexes) { | ||||||
|  | 		var data = this.wiki.getTiddlerData(this.actionTiddler,Object.create(null)); | ||||||
|  | 		names = this.wiki.filterTiddlers(this.actionIndexes,this); | ||||||
|  | 		$tw.utils.each(names,function(name,index) { | ||||||
|  | 			data[name] = values[index] || ""; | ||||||
|  | 		}); | ||||||
|  | 		this.wiki.setTiddlerData(this.actionTiddler,data,{},{suppressTimestamp: !this.actionTimestamp}); | ||||||
|  | 	} | ||||||
|  | 	return true; // Action was invoked | ||||||
|  | }; | ||||||
|  |  | ||||||
|  | exports["action-setmultiplefields"] = SetMultipleFieldsWidget; | ||||||
|  |  | ||||||
|  | })(); | ||||||
|  | 	 | ||||||
							
								
								
									
										81
									
								
								core/modules/widgets/setmultiplevariables.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										81
									
								
								core/modules/widgets/setmultiplevariables.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,81 @@ | |||||||
|  | /*\ | ||||||
|  | title: $:/core/modules/widgets/setmultiplevariables.js | ||||||
|  | type: application/javascript | ||||||
|  | module-type: widget | ||||||
|  |  | ||||||
|  | Widget to set multiple variables at once from a list of names and a list of values | ||||||
|  |  | ||||||
|  | \*/ | ||||||
|  | (function(){ | ||||||
|  |  | ||||||
|  | /*jslint node: true, browser: true */ | ||||||
|  | /*global $tw: false */ | ||||||
|  | "use strict"; | ||||||
|  |  | ||||||
|  | var Widget = require("$:/core/modules/widgets/widget.js").widget; | ||||||
|  |  | ||||||
|  | var SetMultipleVariablesWidget = function(parseTreeNode,options) { | ||||||
|  |     this.initialise(parseTreeNode,options); | ||||||
|  | }; | ||||||
|  |  | ||||||
|  | /* | ||||||
|  | Inherit from the base widget class | ||||||
|  | */ | ||||||
|  | SetMultipleVariablesWidget.prototype = new Widget(); | ||||||
|  |  | ||||||
|  | /* | ||||||
|  | Render this widget into the DOM | ||||||
|  | */ | ||||||
|  | SetMultipleVariablesWidget.prototype.render = function(parent,nextSibling) { | ||||||
|  |     this.parentDomNode = parent; | ||||||
|  |     this.computeAttributes(); | ||||||
|  |     this.execute(); | ||||||
|  |     this.renderChildren(parent,nextSibling); | ||||||
|  | }; | ||||||
|  |  | ||||||
|  | /* | ||||||
|  | Compute the internal state of the widget | ||||||
|  | */ | ||||||
|  | SetMultipleVariablesWidget.prototype.execute = function() { | ||||||
|  |     // Setup our variables | ||||||
|  |     this.setVariables(); | ||||||
|  |     // Construct the child widgets | ||||||
|  |     this.makeChildWidgets(); | ||||||
|  | }; | ||||||
|  |  | ||||||
|  |  | ||||||
|  | SetMultipleVariablesWidget.prototype.setVariables = function() { | ||||||
|  |     // Set the variables | ||||||
|  |     var self = this, | ||||||
|  |         filterNames = this.getAttribute("$names",""), | ||||||
|  |         filterValues = this.getAttribute("$values",""); | ||||||
|  |     this.variableNames = []; | ||||||
|  |     this.variableValues = []; | ||||||
|  |     if(filterNames && filterValues) { | ||||||
|  |         this.variableNames = this.wiki.filterTiddlers(filterNames,this); | ||||||
|  |         this.variableValues = this.wiki.filterTiddlers(filterValues,this); | ||||||
|  |         $tw.utils.each(this.variableNames,function(varname,index) { | ||||||
|  |             self.setVariable(varname,self.variableValues[index]); | ||||||
|  |         }); | ||||||
|  |     } | ||||||
|  | }; | ||||||
|  |  | ||||||
|  | /* | ||||||
|  | Refresh the widget by ensuring our attributes are up to date | ||||||
|  | */ | ||||||
|  | SetMultipleVariablesWidget.prototype.refresh = function(changedTiddlers) { | ||||||
|  |     var filterNames = this.getAttribute("$names",""), | ||||||
|  |         filterValues = this.getAttribute("$values",""), | ||||||
|  |         variableNames = this.wiki.filterTiddlers(filterNames,this), | ||||||
|  |         variableValues = this.wiki.filterTiddlers(filterValues,this); | ||||||
|  |     if(!$tw.utils.isArrayEqual(this.variableNames,variableNames) || !$tw.utils.isArrayEqual(this.variableValues,variableValues)) { | ||||||
|  |         this.refreshSelf(); | ||||||
|  |         return true; | ||||||
|  |     } | ||||||
|  |     return this.refreshChildren(changedTiddlers); | ||||||
|  | }; | ||||||
|  |  | ||||||
|  | exports["setmultiplevariables"] = SetMultipleVariablesWidget; | ||||||
|  |  | ||||||
|  | })(); | ||||||
|  |          | ||||||
| @@ -1,6 +1,6 @@ | |||||||
| caption: action-sendmessage | caption: action-sendmessage | ||||||
| created: 20141008134309742 | created: 20141008134309742 | ||||||
| modified: 20150518210909583 | modified: 20211023160110220 | ||||||
| tags: Widgets ActionWidgets | tags: Widgets ActionWidgets | ||||||
| title: ActionSendMessageWidget | title: ActionSendMessageWidget | ||||||
| type: text/vnd.tiddlywiki | type: text/vnd.tiddlywiki | ||||||
| @@ -18,6 +18,8 @@ The ''action-sendmessage'' widget is invisible. Any content within it is ignored | |||||||
| |$param |Optional parameter string whose meaning is dependent on the message being sent | | |$param |Optional parameter string whose meaning is dependent on the message being sent | | ||||||
| |$name |Optional name of additional parameter | | |$name |Optional name of additional parameter | | ||||||
| |$value |Value for optional parameter whose name is specified in `$name` | | |$value |Value for optional parameter whose name is specified in `$name` | | ||||||
|  | |$names |<<.from-version "5.2.1">> Optional filter evaluating to a list of additional parameter names | | ||||||
|  | |$values |<<.from-version "5.2.1">> Optional filter evaluating to a list of parameter values corresponding to the parameters names specified in `$names` |  | ||||||
| |//{any attributes not starting with $}// |Multiple additional, optional named parameters that are attached to the message | | |//{any attributes not starting with $}// |Multiple additional, optional named parameters that are attached to the message | | ||||||
|  |  | ||||||
| ! Examples | ! Examples | ||||||
|   | |||||||
| @@ -0,0 +1,31 @@ | |||||||
|  | caption: action-setmultiplefields | ||||||
|  | created: 20211023160110220 | ||||||
|  | modified: 20211023160110220 | ||||||
|  | tags: Widgets ActionWidgets | ||||||
|  | title: ActionSetMultipleFieldsWidget | ||||||
|  | type: text/vnd.tiddlywiki | ||||||
|  |  | ||||||
|  | ! Introduction | ||||||
|  |  | ||||||
|  | The ''action-setmultiplefields'' widget is an [[action widget|ActionWidgets]] that assigns multiple fields to a tiddler where the names and values of the fields are specified as separate filters. ActionWidgets are used within triggering widgets such as the ButtonWidget. | ||||||
|  |  | ||||||
|  | ! Content and Attributes | ||||||
|  |  | ||||||
|  | The ''action-setmultiplefields'' widget is invisible. Any content within it is ignored. | ||||||
|  |  | ||||||
|  | |!Attribute |!Description | | ||||||
|  | |$tiddler |Optional title of the tiddler to modify (defaults to the current tiddler) | | ||||||
|  | |$fields |Optional filter evaluating to the names of a list of fields to assign. Either `$fields` or `$indexes` must be specified  | | ||||||
|  | |$indexes |Optional filter evaluating to the names of a list of indexes to assign. Either `$fields` or `$indexes` must be specified | | ||||||
|  | |$values |Filter evaluating to the values to be assigned to the fields or indexes | | ||||||
|  | |$timestamp |Specifies whether the timestamp(s) of the target tiddler will be updated (''modified'' and ''modifier'', plus ''created'' and ''creator'' for newly created tiddlers). Can be "yes" (the default) or "no" | | ||||||
|  |  | ||||||
|  | ! Examples | ||||||
|  |  | ||||||
|  | Here is an example of button that uses the data in [[Days of the Week]] to assign fields `day-Monday`, `day-Tuesday` etc. to the tiddler "HelloThere": | ||||||
|  |  | ||||||
|  | <$macrocall $name='wikitext-example-without-html' | ||||||
|  | src='<$button> | ||||||
|  | <$action-setmultiplefields $tiddler="HelloThere" $fields="[list[Days of the Week]addprefix[day-]]" $values="[list[Days of the Week]]">>/> | ||||||
|  | Click me! | ||||||
|  | </$button>'/> | ||||||
| @@ -0,0 +1,33 @@ | |||||||
|  | caption: setmultiplevariables | ||||||
|  | created: 20211023162409163 | ||||||
|  | modified: 20211023162409163 | ||||||
|  | tags: Widgets | ||||||
|  | title: SetMultipleVariablesWidget | ||||||
|  | type: text/vnd.tiddlywiki | ||||||
|  |  | ||||||
|  | ! Introduction | ||||||
|  |  | ||||||
|  | The setmultiplevariables widget assigns values to multiple [[variables|Variables]] where the names and values of the variables are specified as separate filter. | ||||||
|  |  | ||||||
|  | ! Content and Attributes | ||||||
|  |  | ||||||
|  | The content of the `<$setmultiplevariables>` widget is the scope for the value assigned to the variable. | ||||||
|  |  | ||||||
|  | |!Attribute |!Description | | ||||||
|  | |$names |Filter evaluating to the names of a list of variables to assign | | ||||||
|  | |$values |Filter evaluating to the values corresponding to the list of names specified in `$names` | | ||||||
|  |  | ||||||
|  | ! Examples | ||||||
|  |  | ||||||
|  | Here is an example of a convoluted way to display the values of the fields of the tiddler "HelloThere": | ||||||
|  |  | ||||||
|  | <$macrocall $name='wikitext-example-without-html' | ||||||
|  | src="""<$setmultiplevariables $names="[[HelloThere]fields[]addprefix[demo-]]" $values="[[HelloThere]fields[]] :map[[HelloThere]get<currentTiddler>]"> | ||||||
|  | <ol> | ||||||
|  | <$list filter="[variables[]prefix[demo-]sort[]]"> | ||||||
|  | <li> | ||||||
|  | ''<$text text={{{ [<currentTiddler>removeprefix[demo-]] }}}/>'': <$text text={{{ [<currentTiddler>getvariable[]] }}}/> | ||||||
|  | </li> | ||||||
|  | </$list> | ||||||
|  | </ol> | ||||||
|  | </$setmultiplevariables>"""/> | ||||||
		Reference in New Issue
	
	Block a user
	 Jeremy Ruston
					Jeremy Ruston