From 3094e062366830bdecfb91e3d852667fa951dc50 Mon Sep 17 00:00:00 2001 From: "jeremy@jermolene.com" Date: Fri, 2 Jul 2021 14:33:38 +0100 Subject: [PATCH] Add support for full refreshing of action widgets Fixes #5791 --- core/modules/widgets/widget.js | 11 +++-- .../tiddlers/widgets/ActionWidgets.tid | 49 +++++++++++++++++-- 2 files changed, 53 insertions(+), 7 deletions(-) diff --git a/core/modules/widgets/widget.js b/core/modules/widgets/widget.js index ce0102069..fd58405ed 100755 --- a/core/modules/widgets/widget.js +++ b/core/modules/widgets/widget.js @@ -568,10 +568,15 @@ Widget.prototype.invokeActions = function(triggeringWidget,event) { var handled = false; // For each child widget for(var t=0; t ``` -!! Assigning action widgets by embedding +!! Directly embedding action widgets The action widgets need not be immediate children of their triggering widget, but they must be descendents of it. The actions are performed in sequence. Here is the above example rewritten to use embedding: @@ -42,3 +42,44 @@ Click me! ``` +! Action Execution Modes + +<<.from-version "5.1.24">> The default behaviour of action widgets has some peculiarities that often cause confusion. There is now an improved mode that simplifies how things work, but due to BackwardsCompatibility constraints, it must be explicitly engaged in order to take advantage of it. + +The peculiarities relate to the way that the results of previous action widgets are available to subsequent action widgets. By default, action widgets are refreshed before each execution which ensure that they reflect the results of previous actions. However, ordinary widgets are not updated in the same way. Thus, the following example fails: + +<$macrocall $name='wikitext-example-without-html' +src='\define actions() +<$action-setfield $tiddler="ActionTestTiddler" $field="text" $value="FOO"/> +<$set name="newvalue" value={{{ [{ActionTestTiddler}lowercase[]] }}}> +<$action-setfield $tiddler="ActionTestTiddler" $field="text" $value=<>/> + +\end + +Current value of ActionTestTiddler: {{ActionTestTiddler}} + +<$button actions=<>> +Click me +'/> + +The new behaviour avoids these problems by refreshing all widgets before execution, not just action widgets. It is engaged by setting the variable `tv-action-refresh-policy` to the value `always`. This can be done within an action string, or via a local variable declaration. + +<<.warning "Do not attempt to set `tv-action-refresh-policy` globally. The core will not work correctly">> + +The example above works as expected with the addition of `tv-action-refresh-policy`: + +<$macrocall $name='wikitext-example-without-html' +src='\define tv-action-refresh-policy() always + +\define actions() +<$action-setfield $tiddler="ActionTestTiddler" $field="text" $value="FOO"/> +<$set name="newvalue" value={{{ [{ActionTestTiddler}lowercase[]] }}}> +<$action-setfield $tiddler="ActionTestTiddler" $field="text" $value=<>/> + +\end + +Current value of ActionTestTiddler: {{ActionTestTiddler}} + +<$button actions=<>> +Click me +'/>