Hi Saq,
many thanks for your gentle explanation.
Following your recipe I made what you can find below:
It does not crash the Wiki or show the red sign, which is already great for a first approach;-) , but so far the button says that the widget is not defined:
Can you give me another hint?

Best wishes
Jan

----------------------------------------------
Button:
<$button>scroll to top
<$action-scrolltotop/>
</$button>
----------------------------------------------

|/*\
type: application/javascript
module-type: widget


\*/
(function(){

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

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

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

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

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

/*
Compute the internal state of the widget
*/

/*
Refresh the widget by ensuring our attributes are up to date
*/
ScrollToTopWidget.prototype.refresh = refreshSelf() {
        return true;
    }
    return this.refreshChildren(changedTiddlers);
};

/*
Invoke the action associated with this widget
*/
ScrollToTopWidget.prototype.invokeAction = function(triggeringWidget,event) {
    window.scrollTo({ top: 0, behavior: 'smooth' });
    return true; // Action was invoked
};

exports["action-scrolltotop"] = ScrollToTopWidget;

})();|


----------------------------------------------------------------------------------------

Am 26.04.2020 um 10:32 schrieb Saq Imtiaz:
In simple terms:

macros -> text substitution or defining a variable
widgets -> everything else

So you need a widget. And widgets that cause an action, rather than display something, need to be triggered, typically by a button, checkbox, select etc. These are called action widgets and the method that contains the logic for what happens when a widget is triggered is invokeAction.

Use this widget as a starting point:

|
|/*\
type: application/javascript
module-type: widget


\*/
(function(){

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

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

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

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

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

/*
Compute the internal state of the widget
*/
AddToHistoryWidget.prototype.execute=  function()  {
     this.historyTitle=  
this.getAttribute("$history",this.getVariable("tv-history-title"));
     this.newTitle=  this.getAttribute("$title");
};

/*
Refresh the widget by ensuring our attributes are up to date
*/
AddToHistoryWidget.prototype.refresh=  function(changedTiddlers)  {
     var  changedAttributes=  this.computeAttributes();
     if(changedAttributes["$historyTitle"]  ||  changedAttributes["$title"])  {
         this.refreshSelf();
         return  true;
     }
     return  this.refreshChildren(changedTiddlers);
};

/*
Invoke the action associated with this widget
*/
AddToHistoryWidget.prototype.invokeAction=  function(triggeringWidget,event)  {
this.wiki.addToHistory(this.newTitle,{},this.historyTitle); return true; // Action was invoked
};

exports["action-addtohistory"]  =  AddToHistoryWidget;

})();|
|

- execute() sets up the attributes via the parameters given to the widget, I suspect you don't need any. - refresh() handles refreshing when the parameters have changed, probably also not needed. Jus call refreshSelf() and return true
- tweak invokeAction to perform the scroll.

Hope this helps.
Saq

On Sunday, April 26, 2020 at 10:05:13 AM UTC+2, Jan wrote:

    Hi Saq,
    I think you got me...I do not really know what the difference is.
    I think all the js I did so far was macros.
    I finally should learn some of the basic concepts of programming
    js in TW ;-) Thanks for giving me a hint to start.

    Do I need a widget or can I perform that action with a macro.

    Jan


    Am 26.04.2020 um 01:31 schrieb Saq Imtiaz:
    You have written a macro, not a widget.

    Look at one of the action widgets and write an action-totop
    widget, e.g:
    
https://github.com/Jermolene/TiddlyWiki5/blob/master/core/modules/widgets/action-deletetiddler.js
    
<https://github.com/Jermolene/TiddlyWiki5/blob/master/core/modules/widgets/action-deletetiddler.js>

    The invokeAction method is where the logic goes for what happens
    when the widget is triggered.



    On Saturday, April 25, 2020 at 8:40:56 PM UTC+2, Jan wrote:

        Hi,
        I made a Landing-Page which uses its own Pagetemplate and
        hides the storyriver: https://szen.io/Grid/
        The grid can be restructured by setting a tag to filter
        content.
        When a user triggers this action, it would be great to
        scroll to the top of the Webpage automatically.
        How can I do this?

        Best wishes Jan

        Hi,

        I tried to build a widget, but so far it wont work.

        |

        /*\
        title: $:/core/modules/macros/totop.js
        type: application/javascript
        module-type: macro
        Macro that scrolls to the top
        \*/

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

        /*
        Information about this macro
        */
            exports.name  <http://exports.name>  = "totop";
            exports.params = [
            ];
        /*
        Run the macro
        */
            exports.run = function() {
            var totopp = window.scrollTo({ top: 0, behavior: 'smooth' });
            totopp;
        }
        })();|


-- You received this message because you are subscribed to the
    Google Groups "TiddlyWiki" group.
    To unsubscribe from this group and stop receiving emails from it,
    send an email to [email protected] <javascript:>.
    To view this discussion on the web visit
    
https://groups.google.com/d/msgid/tiddlywiki/3e58e2ff-7a57-4efd-8f04-0ba6ed5431de%40googlegroups.com
    
<https://groups.google.com/d/msgid/tiddlywiki/3e58e2ff-7a57-4efd-8f04-0ba6ed5431de%40googlegroups.com?utm_medium=email&utm_source=footer>.

--
You received this message because you are subscribed to the Google Groups "TiddlyWiki" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected] <mailto:[email protected]>. To view this discussion on the web visit https://groups.google.com/d/msgid/tiddlywiki/e8e9ec93-295d-48a1-931b-d92ec0e096ca%40googlegroups.com <https://groups.google.com/d/msgid/tiddlywiki/e8e9ec93-295d-48a1-931b-d92ec0e096ca%40googlegroups.com?utm_medium=email&utm_source=footer>.

--
You received this message because you are subscribed to the Google Groups 
"TiddlyWiki" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/tiddlywiki/5EA603E0.1040603%40googlemail.com.

Reply via email to