mirror of
https://github.com/Jermolene/TiddlyWiki5
synced 2024-12-29 11:30:28 +00:00
e9405ac810
* Fix for Bug #6618 This Commit fixes Bug #6618. It is a little bit more complicated than using one tiddler to store the new value for a field. Because the following can happen: * The user types "not-a-date" into the field value of a simple text field. * The user now selects a field name that uses a HTML5 date editor. The Editor will show no date because the value cannot be parsed. * The user saves the tiddler by clicking the checkmark. Now the date-field contains the value "not-a-date" but the user was not aware that this will be added. The edit control showed no date (because the value was invalid) and the user assumed the field was empty and won't be added to the tiddler. To prevent this, every kind of field editor gets its own storage tiddler. Its name is derived from the SHA256-hash of the name of the tiddler that is returned by the Field Editor Cascade. That way every editor in the cascade is only seeing its input. As long as the default setup (with one default editor) is used, everything works like in 5.2.1. This commit also fixes the bug that the after adding a field the field-type input box was not focused again. * Update Documentation for Field Editor Cascade The fix for bug #6618 makes the handling of the tiddler backing the edit operation much more complicated. See previous commit "Fix for Bug #6618" for more details.
151 lines
6.8 KiB
Plaintext
151 lines
6.8 KiB
Plaintext
title: $:/core/ui/EditTemplate/fields
|
|
tags: $:/tags/EditTemplate
|
|
|
|
\define lingo-base() $:/language/EditTemplate/
|
|
\define config-title()
|
|
$:/config/EditTemplateFields/Visibility/$(currentField)$
|
|
\end
|
|
|
|
\define config-filter()
|
|
[[hide]] -[title{$(config-title)$}]
|
|
\end
|
|
|
|
\define current-tiddler-new-field-selector()
|
|
[data-tiddler-title="$(currentTiddlerCSSescaped)$"] .tc-edit-field-add-name-wrapper input
|
|
\end
|
|
|
|
\define new-field-actions()
|
|
\whitespace trim
|
|
<$action-sendmessage $message="tm-add-field" $name={{{ [<newFieldNameTiddler>get[text]] }}} $value={{{ [<newFieldNameTiddler>get[text]] :map[subfilter<get-field-value-tiddler-filter>get[text]] }}}/>
|
|
<$action-deletetiddler $filter="[<newFieldNameTiddler>] [prefix<newFieldValueTiddlerPrefix>] [<storeTitle>] [<searchListState>]"/>
|
|
<$action-sendmessage $message="tm-focus-selector" $param=<<current-tiddler-new-field-selector>>/>
|
|
\end
|
|
|
|
\define delete-state-tiddlers() <$action-deletetiddler $filter="[<newFieldNameTiddler>] [<storeTitle>] [<searchListState>]"/>
|
|
|
|
\define cancel-search-actions-inner()
|
|
\whitespace trim
|
|
<$list
|
|
filter="[<storeTitle>has[text]] [<newFieldNameTiddler>has[text]]"
|
|
variable="ignore"
|
|
emptyMessage="<<cancel-delete-tiddler-actions 'cancel'>>">
|
|
<<delete-state-tiddlers>>
|
|
</$list>
|
|
\end
|
|
|
|
\define cancel-search-actions()
|
|
\whitespace trim
|
|
<$set name="userInput" value={{{ [<storeTitle>get[text]] }}}>
|
|
<$list
|
|
filter="[<newFieldNameTiddler>get[text]!match<userInput>]"
|
|
emptyMessage="<<cancel-search-actions-inner>>">
|
|
<$action-setfield $tiddler=<<newFieldNameTiddler>> text=<<userInput>>/><$action-setfield $tiddler=<<refreshTitle>> text="yes"/>
|
|
</$list>
|
|
</$set>
|
|
\end
|
|
|
|
\define new-field()
|
|
\whitespace trim
|
|
<$vars name={{{ [<newFieldNameTiddler>get[text]] }}}>
|
|
<$reveal type="nomatch" text="" default=<<name>>>
|
|
<$button tooltip=<<lingo Fields/Add/Button/Hint>>>
|
|
<$action-sendmessage $message="tm-add-field"
|
|
$name=<<name>>
|
|
$value={{{ [subfilter<get-field-value-tiddler-filter>get[text]] }}}/>
|
|
<$action-deletetiddler $filter="[<newFieldNameTiddler>] [prefix<newFieldValueTiddlerPrefix>] [<storeTitle>] [<searchListState>]"/>
|
|
<<lingo Fields/Add/Button>>
|
|
</$button>
|
|
</$reveal>
|
|
<$reveal type="match" text="" default=<<name>>>
|
|
<$button>
|
|
<<lingo Fields/Add/Button>>
|
|
</$button>
|
|
</$reveal>
|
|
</$vars>
|
|
\end
|
|
\whitespace trim
|
|
|
|
<div class="tc-edit-fields">
|
|
<table class={{{ [all[current]fields[]] :filter[lookup[$:/config/EditTemplateFields/Visibility/]!match[hide]] +[count[]!match[0]] +[then[tc-edit-fields]] ~[[tc-edit-fields tc-edit-fields-small]] }}}>
|
|
<tbody>
|
|
<$list filter="[all[current]fields[]] +[sort[title]]" variable="currentField" storyview="pop">
|
|
<$list filter=<<config-filter>> variable="temp">
|
|
<tr class="tc-edit-field">
|
|
<td class="tc-edit-field-name">
|
|
<$text text=<<currentField>>/>:</td>
|
|
<td class="tc-edit-field-value">
|
|
<$keyboard key="((delete-field))" actions="""<$action-deletefield $field=<<currentField>>/><$set name="currentTiddlerCSSescaped" value={{{ [<currentTiddler>escapecss[]] }}}><$action-sendmessage $message="tm-focus-selector" $param=<<current-tiddler-new-field-selector>>/></$set>""">
|
|
<$transclude tiddler={{{ [<currentField>] :cascade[all[shadows+tiddlers]tag[$:/tags/FieldEditorFilter]!is[draft]get[text]] :and[!is[blank]else{$:/core/ui/EditTemplate/fieldEditor/default}] }}} />
|
|
</$keyboard>
|
|
</td>
|
|
<td class="tc-edit-field-remove">
|
|
<$button class="tc-btn-invisible" tooltip={{$:/language/EditTemplate/Field/Remove/Hint}} aria-label={{$:/language/EditTemplate/Field/Remove/Caption}}>
|
|
<$action-deletefield $field=<<currentField>>/><$set name="currentTiddlerCSSescaped" value={{{ [<currentTiddler>escapecss[]] }}}><$action-sendmessage $message="tm-focus-selector" $param=<<current-tiddler-new-field-selector>>/></$set>
|
|
{{$:/core/images/delete-button}}
|
|
</$button>
|
|
</td>
|
|
</tr>
|
|
</$list>
|
|
</$list>
|
|
</tbody>
|
|
</table>
|
|
</div>
|
|
|
|
<$fieldmangler>
|
|
<div class="tc-edit-field-add">
|
|
<em class="tc-edit tc-small-gap-right">
|
|
<<lingo Fields/Add/Prompt>>
|
|
</em>
|
|
<$vars refreshTitle=<<qualify "$:/temp/fieldname/refresh">> storeTitle=<<newFieldNameInputTiddler>> searchListState=<<newFieldNameSelectionTiddler>>>
|
|
<div class="tc-edit-field-add-name-wrapper">
|
|
<$macrocall $name="keyboard-driven-input" tiddler=<<newFieldNameTiddler>> storeTitle=<<storeTitle>> refreshTitle=<<refreshTitle>>
|
|
selectionStateTitle=<<searchListState>> tag="input" default="" placeholder={{$:/language/EditTemplate/Fields/Add/Name/Placeholder}}
|
|
focusPopup=<<qualify "$:/state/popup/field-dropdown">> class="tc-edit-texteditor tc-popup-handle" tabindex={{$:/config/EditTabIndex}}
|
|
focus={{{ [{$:/config/AutoFocus}match[fields]then[true]] ~[[false]] }}} cancelPopups="yes"
|
|
configTiddlerFilter="[[$:/config/EditMode/fieldname-filter]]" inputCancelActions=<<cancel-search-actions>> />
|
|
<$button popup=<<qualify "$:/state/popup/field-dropdown">> class="tc-btn-invisible tc-btn-dropdown tc-small-gap" tooltip={{$:/language/EditTemplate/Field/Dropdown/Hint}} aria-label={{$:/language/EditTemplate/Field/Dropdown/Caption}}>{{$:/core/images/down-arrow}}</$button>
|
|
<$reveal state=<<qualify "$:/state/popup/field-dropdown">> type="nomatch" text="" default="">
|
|
<div class="tc-block-dropdown tc-edit-type-dropdown">
|
|
<$set name="tv-show-missing-links" value="yes">
|
|
<$linkcatcher to=<<newFieldNameTiddler>>>
|
|
<div class="tc-dropdown-item">
|
|
<<lingo Fields/Add/Dropdown/User>>
|
|
</div>
|
|
<$set name="newFieldName" value={{{ [<storeTitle>get[text]] }}}>
|
|
<$list filter="[!is[shadow]!is[system]fields[]search:title<newFieldName>sort[]] -created -creator -draft.of -draft.title -modified -modifier -tags -text -title -type" variable="currentField">
|
|
<$list filter="[<currentField>addsuffix[-primaryList]] -[<searchListState>get[text]]" emptyMessage="""<$link to=<<currentField>> class="tc-list-item-selected"><$text text=<<currentField>>/></$link>""">
|
|
<$link to=<<currentField>>>
|
|
<$text text=<<currentField>>/>
|
|
</$link>
|
|
</$list>
|
|
</$list>
|
|
<div class="tc-dropdown-item">
|
|
<<lingo Fields/Add/Dropdown/System>>
|
|
</div>
|
|
<$list filter="[fields[]search:title<newFieldName>sort[]] -[!is[shadow]!is[system]fields[]]" variable="currentField">
|
|
<$list filter="[<currentField>addsuffix[-secondaryList]] -[<searchListState>get[text]]" emptyMessage="""<$link to=<<currentField>> class="tc-list-item-selected"><$text text=<<currentField>>/></$link>""">
|
|
<$link to=<<currentField>>>
|
|
<$text text=<<currentField>>/>
|
|
</$link>
|
|
</$list>
|
|
</$list>
|
|
</$set>
|
|
</$linkcatcher>
|
|
</$set>
|
|
</div>
|
|
</$reveal>
|
|
</div>
|
|
<$let currentTiddlerCSSescaped={{{ [<currentTiddler>escapecss[]] }}} currentTiddler={{{ [subfilter<get-field-value-tiddler-filter>] }}} currentField="text" currentFieldName={{{ [<newFieldNameTiddler>get[text]] }}}>
|
|
<span class="tc-edit-field-add-value tc-small-gap-right">
|
|
<$keyboard key="((add-field))" actions=<<new-field-actions>>>
|
|
<$transclude tiddler={{{ [subfilter<get-field-editor-filter>] }}} />
|
|
</$keyboard>
|
|
</span>
|
|
<span class="tc-edit-field-add-button">
|
|
<$macrocall $name="new-field"/>
|
|
</span>
|
|
</$let>
|
|
</$vars>
|
|
</div>
|
|
</$fieldmangler>
|