Hi Jared

Sorry for the late reply.

> This works, but it seems very hackish (requires 3 tiddlers per
calculator). Is there a cleaner way to implement forms with Javascript
calculated return values in TW5? Could I encapsulate the entire form in a
widget?

One thing that might help clean it up would be to pass the title as a
single parameter and have the macro retrieve the tiddler to reference the
required fields:

this.wiki.getTiddler(title).getFieldString("myfield")

> I would love to make a generic calculator widget, which takes JSON
definition of inputs, outputs, and logic as parameters and renders the
form.

Looks great, this is certainly an area that would be of interest to others.
Jed Carty has done some work on wiki maths too:

http://inmysocks.tiddlyspot.com/#MathyThing%20Plugin

Best wishes

Jeremy.


On Fri, Mar 6, 2015 at 5:18 PM, Jared Beasley <[email protected]>
wrote:

> First off, a big thank you to Jeremy and the community bringing us TW. I
> use it every day.
>
> I have several HTML calculator forms in TWC that I am trying to migrate to
> TW5. These forms take input and calculate return value(s) using inline
> Javascript. Since inline Javascript is no longer allowed in TW5, I am
> struggling to recreate this functionality. I tried this method in TW5:
>
> 1. Tiddler AverageHoleDiameter
> |calculator|k
> |d|<$edit tiddler="AverageHoleDiameterData" field="d"/>|
> |t|<$edit tiddler="AverageHoleDiameterData" field="t"/>|
> |a|<$edit tiddler="AverageHoleDiameterData" field="a"/>|
> |&alpha;|<$edit tiddler="AverageHoleDiameterData" field="alpha"/>|
> |D,,avg,,|<$macrocall $name="averageHoleDiameter"
> d={{AverageHoleDiameterData!!d}} t={{AverageHoleDiameterData!!t}}
> a={{AverageHoleDiameterData!!a}} alpha={{AverageHoleDiameterData!!alpha}}/>|
>
> 2. Tiddler AverageHoleDiameterData
> Holds field data. Separate tiddler to avoid losing input focus on
> re-render.
>
> 3. Macro $:/.jb/modules/macros/averageHoleDiameter
> (function(){
> exports.name = "averageHoleDiameter";
> exports.params = [
>     {name: "d"},
>     {name: "t"},
>     {name: "a"},
>     {name: "alpha"}
> ];
> exports.run = function(d, t, a, alpha) {
>     if (d && a && t && alpha) {
>         var b = (a - d) / 2 / Math.tan(Math.PI * alpha / 90);
>         if (b < t) {
>             // not knife edged
>             var davg = d + Math.pow(a - d, 2) / 4 / t / Math.tan(Math.PI *
> alpha / 90);
>         } else {
>             // knife edged
>             var davg = a - t * Math.tan(Math.PI * alpha / 90);
>         }
>         return davg.toFixed(3);
>     } else {
>         return "";
>     }
> };
> })();
>
> This works, but it seems very hackish (requires 3 tiddlers per
> calculator). Is there a cleaner way to implement forms with Javascript
> calculated return values in TW5? Could I encapsulate the entire form in a
> widget?
>
> I would love to make a generic calculator widget, which takes JSON
> definition of inputs, outputs, and logic as parameters and renders the
> form. Something that could be called like:
> <$calculator
> inputs="""[
>   {name: "Hole diameter", variable: "d"},
>   {name: "Sheet thickness", variable: "t"},
>   {name: "Countersink diameter", variable: "a"},
>   {name: "Countersink angle", variable: "alpha", defaultValue: 100}
> ]"""
>
> outputs="""[
>   {name: "Countersink depth", variable: "b"},
>   {name: "Average hole diameter", variable: "davg"}
> ]"""
>
> logic="""
> if (d && a && t && alpha) {
>     var b = (a - d) / 2 / Math.tan(Math.PI * alpha / 90);
>     if (b < t) {
>         // not knife edged
>         var davg = d + Math.pow(a - d, 2) / 4 / t / Math.tan(Math.PI *
> alpha / 90);
>     } else {
>         // knife edged
>         var davg = a - t * Math.tan(Math.PI * alpha / 90);
>     }
> } else {
>     return ;
> }"""
> />
>
> This is where I'm in over my head. An ideas for a simpler implementation?
>
> Thank you,
> Jared
>
> --
> 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 post to this group, send email to [email protected].
> Visit this group at http://groups.google.com/group/tiddlywiki.
> For more options, visit https://groups.google.com/d/optout.
>



-- 
Jeremy Ruston
mailto:[email protected]

-- 
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 post to this group, send email to [email protected].
Visit this group at http://groups.google.com/group/tiddlywiki.
For more options, visit https://groups.google.com/d/optout.

Reply via email to