[TW5] Bug? <$set> widget with filter does not trigger refresh

230 views
Skip to first unread message

Evan Balster

unread,
Sep 14, 2015, 2:21:44 AM9/14/15
to TiddlyWiki
Changes in the filter result of a <$set> widget do not cause its content to be redrawn.  This differs from the behavior of the <$list> widget, which does drive a refresh.

Example code:

!!Edit Text
<$edit-text tiddler="BugDemo"/>

<$button set="!!prop" setTo="yes">Force Update</$button>

!!!Displayed with $set widget
<<<
<$set name="TEXT" filter="BugDemo +[get[text]]"><<TEXT>></$set>
<<<

!!!Displayed with $list widget
<<<
<$list variable="TEXT" filter="BugDemo +[get[text]]"><<TEXT>></$list>
<<<

To reproduce, just edit the text in the box and observe the refreshing behavior.  ...Is this intended behavior?

PMario

unread,
Sep 14, 2015, 7:19:35 AM9/14/15
to TiddlyWiki
Hi Evan,

I didn't test the issue, but it may get lost here. please move it to: https://github.com/Jermolene/TiddlyWiki5/issues

There is quite some backlog, but it won't be lost.

-mario

Spangenhelm

unread,
Sep 16, 2015, 12:42:03 PM9/16/15
to TiddlyWiki
Hi, i am interested in this issue too because i have a problem with conditionnal assignement of a variable using the <$set> widget (see below the summary)

Conditional Variable Assignment:


This form of the set variable widget chooses one of two specified values according to whether a filter evaluates to an empty list. Here's an example that sets a variable according to whether the current tiddler is called "myMagicTitle":

<$set name="myVariable" filter="[all[current]field:title[myMagicTitle]]" value="It's magic" emptyValue="It's not magic">
<$text text=<<myVariable>>/>
</$set>


This one does not seem to refresh either so whatever you put in the filter part the widget display the default value. Strange but it might be simply related to your problem..
Also if, as pmario proposed, you do publish it in github's issue please don't forget to add the link to it here so we can follow it.

Thank you

Evan Balster

unread,
Sep 16, 2015, 2:03:01 PM9/16/15
to tiddlywiki
I posted an issue on github shortly after PMario's remark.


My work-around for this issue is to either substitute a <$list> widget for the <$set>, or to enclose the <$set> code in a <$list> widget with a similar filter and an unused variable, so as to force a refresh whenever the filter parameter changes.  This sometimes takes some clever hackery with dummy values and first[]...

Unfortunately, it's really hard to make example code for your case, because drafts have a title of "Draft of myMagicTitle", and editing the title of a non-draft tiddler creates duplicates!

Regards,
Evan

--
You received this message because you are subscribed to a topic in the Google Groups "TiddlyWiki" group.
To unsubscribe from this topic, visit https://groups.google.com/d/topic/tiddlywiki/uNeLW76wmWM/unsubscribe.
To unsubscribe from this group and all its topics, send an email to tiddlywiki+...@googlegroups.com.
To post to this group, send email to tiddl...@googlegroups.com.
Visit this group at http://groups.google.com/group/tiddlywiki.
To view this discussion on the web visit https://groups.google.com/d/msgid/tiddlywiki/c0dfaa6b-29f0-4d77-b9c2-93cacd05045f%40googlegroups.com.

For more options, visit https://groups.google.com/d/optout.

Spangenhelm

unread,
Sep 17, 2015, 12:02:35 PM9/17/15
to TiddlyWiki
Unfortunately, it's really hard to make example code for your case, because drafts have a title of "Draft of myMagicTitle", and editing the title of a non-draft tiddler creates duplicates!
 
Well apparently this works in my case (for a tiddler nammed "Test")

<$set name="myVariable" filter="[field:title[Test]]" value="exists" emptyValue="do not exist">
<$text text=<
<myVariable>>/>
</$set>

But still have the refresh issue like you do.. maybe i will just try to use the "reveal" widget which can work a little like this i think.
While waiting for a solution..

++

Tobias Beer

unread,
Sep 18, 2015, 11:00:44 AM9/18/15
to tiddl...@googlegroups.com
Despite the limitations, I have added the example here...

Conditional Variable Assignment @ tb5

Best wishes,

— tb

Evan Balster

unread,
Sep 18, 2015, 2:15:41 PM9/18/15
to TiddlyWiki
Note that the issue with <$set> not refreshing occurs regardless of whether a value/emptyValue condition is used.

Evan Balster

unread,
Sep 19, 2015, 10:08:34 PM9/19/15
to TiddlyWiki

I managed to modify the set widget to fix the problem described here.  While I don't understand the system enough to guarantee this code is bug free, it doesn't break the wiki and seems to work with all my test-cases.


(I don't really know how to go about submitting this to the project...)


To use this modification, replace the content of $:/core/modules/widgets/set.js with the code below:


/*\
title: $:/core/modules/widgets/set.js
type: application/javascript
module-type: widget

Set variable widget

\*/
(function(){

/*jslint node: true, browser: true */
/*global $tw: false */
"use strict";

var Widget = require("$:/core/modules/widgets/widget.js").widget;

var SetWidget = function(parseTreeNode,options) {
    this.initialise(parseTreeNode,options);
};

/*
Inherit from the base widget class
*/
SetWidget.prototype = new Widget();

/*
Render this widget into the DOM
*/
SetWidget.prototype.render = function(parent,nextSibling) {
    this.parentDomNode = parent;
    this.computeAttributes();
    this.execute();
    this.renderChildren(parent,nextSibling);
};

/*
Compute the internal state of the widget
*/
SetWidget.prototype.execute = function() {
    // Get our parameters
    this.setName = this.getAttribute("name","currentTiddler");
    this.setFilter = this.getAttribute("filter");
    this.setValue = this.getAttribute("value");
    this.setEmptyValue = this.getAttribute("emptyValue");

    // Set context variable
    this.setVariable(this.setName,this.getValue(),this.parseTreeNode.params);

    // Construct the child widgets
    this.makeChildWidgets();
};

/*
Get the value to be assigned
*/
SetWidget.prototype.getValue = function() {
    var value = this.setValue;
    if(this.setFilter) {
        var results = this.wiki.filterTiddlers(this.setFilter,this);
        if(!this.setValue) {
            value = $tw.utils.stringifyList(results);
        }
        if(results.length === 0 && this.setEmptyValue !== undefined) {
            value = this.setEmptyValue;
        }
    }
    return value;
};

/*
Selectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering
*/
SetWidget.prototype.refresh = function(changedTiddlers) {
    var changedAttributes = this.computeAttributes();
    if(changedAttributes.name || changedAttributes.filter || changedAttributes.value || changedAttributes.emptyValue
        || (this.setFilter && this.getValue() != this.variables[this.setName].value)) {
        this.refreshSelf();
        return true;
    } else {
        return this.refreshChildren(changedTiddlers);       
    }
};

exports.setvariable = SetWidget;
exports.set = SetWidget;

})();

Spangenhelm

unread,
Sep 28, 2015, 10:50:37 AM9/28/15
to TiddlyWiki
Congratulations apparently it works great ! Hope the pull request will be accepted for the next version!

-S
Reply all
Reply to author
Forward
0 new messages