Hi Tony, Fun idea for a Sunday morning :-) Here is a proposed refactoring, based on the use of the subfilter operator. It doesn't tackle your extended challenges, but I believe it would make them easier to implement:
\define test_value_pair(value_pair, state_field) <$list filter="[subfilter<__value_pair__>] +[match<currentValue>]" variable=nul> <$select tiddler=<<tiddlername>> field=<<__state_field__>> default=<<currentValue>> > <$list filter='[subfilter<__value_pair__>]'> <option value=<<currentTiddler>>><$view field='title'/></option> </$list> </$select> </$list> \end \define smart-configure(tiddlername fieldname:"fieldname") <$set name=tiddlername value="$tiddlername$" emptyValue=<<currentTiddler>> > <$set name=currentValue value={{{ [<tiddlername>get[$fieldname$]] }}}> tiddlername=<<tiddlername>>, fieldname=$fieldname$, currentValue=<<currentValue>><br> <$list filter="[<currentValue>is[blank]]" variable=nul> Select initial value: <$select tiddler=<<tiddlername>> field="$fieldname$" default=<<currentValue>> > <$list filter='yes no show hide true false left right top bottom'> <option value=<<currentTiddler>>><$view field='title'/></option> </$list> </$select> </$list> <$list filter="[[yes no]] [[show hide]] [[true false]] [[left right]] [[top bottom]]" variable=config_pair> <$macrocall $name="test_value_pair" value_pair=<<config_pair>> state_field=<<__fieldname__>> /> </$list> </$set></$set> \end <<smart-configure "$:/config/Tiddlers/TitleLinks" text>> Cheers, -- Xavier Cazin On Sat, Jul 4, 2020 at 6:33 AM TW Tones <anthony.mus...@gmail.com> wrote: > Folks, > > Fancy yourself a tiddlywiki wizard (or wannabee)?, are you up to the > challenge?, think the solution is obvious?, like to learn through trying? > > This is an *optional* coding challenge to provide a better solution, more > concise code, if you are interested. > > - I am in the middle of creating a solution, the solution contains a > configuration tiddler $:/config/name > - I have long sought to automate configuration settings and have done > so with the code below. > - I would like to see if it can be simplified further. > - I thought I would open this as a coding challenge for anyone > interested, basically since each select statement differs only on value > pairs > eg yes no / show hide, there may be a way to simplify, or shorten the > macro. > > *The solution* > > - You call this macro with a tiddlername (defaults to current tiddler) > and fieldname, default field is "fieldname", (because text could be > dangerous) > - Based on the value it finds there, it allows you to select the value > to its natural alternative, eg Yes you can toggle to no, true to false > etc... > - If no value is found the first select widget, allows you to select > one from all the available values "yes no show hide true false left right > top bottom" > - However there is a select widget for each of the common pairs of > values and they differ only by the two filter used. > > *The challenge;* > > - See if you can write the same code in much shorter yet easier to > configure/customisation form. For example add the additional options > enable/disable. > > *Extended challenges *(for the foolhardily) > > - Once a config value pair is selected, set the config-values field in > the config tiddler to those two values eg config-values="true false" > - Allow the order to be set so the first value in config-values is > considered the default. > - Create a view template that detects tiddlers containing one of these > values and show the config value select macro on those tiddlers > > *I will do this eventually myself but do not yet have the required > inspiration as to how, so I thought I would open it to the community as a > challenge.* > > The tiddler is also attached for your convenience, works on empty.html, > tiddlywiki.com or my playground > <https://anthonymuscio.github.io/playground.html>. The macro is both > defined and called in this tiddler. > > \define smart-configure(tiddlername fieldname:"fieldname") > <$set name=tiddlername value="$tiddlername$" emptyValue=<<currentTiddler>> > > > <$set name=currentValue value={{{ [<tiddlername>get[$fieldname$]] }}}> > tiddlername=<<tiddlername>>, fieldname=$fieldname$, currentValue=<< > currentValue>><br> > > <$list filter="[<currentValue>is[blank]]" variable=nul> > Select initial value: > <$select tiddler=<<tiddlername>> field="$fieldname$" default=<< > currentValue>> > > <$list filter='yes no show hide true false left right top bottom'> > <option value=<<currentTiddler>>><$view field='title'/></option> > </$list> > </$select> > </$list> > > <$list filter="yes no +[match<currentValue>]" variable=nul> > <$select tiddler=<<tiddlername>> field="$fieldname$" > default=<<currentValue>> > > <$list filter='yes no'> > <option value=<<currentTiddler>>><$view field='title'/></option> > </$list> > </$select> > </$list> > > <$list filter="show hide +[match<currentValue>]" variable=nul> > <$select tiddler=<<tiddlername>> field="$fieldname$" > default=<<currentValue>> > > <$list filter='show hide'> > <option value=<<currentTiddler>>><$view field='title'/></option> > </$list> > </$select> > </$list> > > <$list filter="true false +[match<currentValue>]" variable=nul> > <$select tiddler=<<tiddlername>> field="$fieldname$" > default=<<currentValue>> > > <$list filter='true false'> > <option value=<<currentTiddler>>><$view field='title'/></option> > </$list> > </$select> > </$list> > > <$list filter="left right +[match<currentValue>]" variable=nul> > <$select tiddler=<<tiddlername>> field="$fieldname$" > default=<<currentValue>> > > <$list filter='left right'> > <option value=<<currentTiddler>>><$view field='title'/></option> > </$list> > </$select> > </$list> > > <$list filter="top bottom +[match<currentValue>]" variable=nul> > <$select tiddler=<<tiddlername>> field="$fieldname$" > default=<<currentValue>> > > <$list filter='top bottom'> > <option value=<<currentTiddler>>><$view field='title'/></option> > </$list> > </$select> > </$list> > </$set></$set> > \end > > <<smart-configure "$:/config/Tiddlers/TitleLinks" text>> > > *In closing* > > - Do you like the idea of such challenges, > - shall I release more? > - Is there one you would like to raise? > - Or a challenge you would like me to post? > - Let me know here or privately. > > Regards > TW Tones > > > > -- > 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 tiddlywiki+unsubscr...@googlegroups.com. > To view this discussion on the web visit > https://groups.google.com/d/msgid/tiddlywiki/8bdd0936-16e7-48c8-a6f1-9d6cb587784fo%40googlegroups.com > <https://groups.google.com/d/msgid/tiddlywiki/8bdd0936-16e7-48c8-a6f1-9d6cb587784fo%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 tiddlywiki+unsubscr...@googlegroups.com. To view this discussion on the web visit https://groups.google.com/d/msgid/tiddlywiki/CADeSwYPMLGnD0VH1MVqq0oUT1q8aMUhyQ01igo1w4os7o1eyVA%40mail.gmail.com.