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.

Reply via email to