From 413dec5a606d0bcff727eaadd6b80b5955301753 Mon Sep 17 00:00:00 2001 From: Mario Pietsch Date: Thu, 23 Apr 2026 11:51:21 +0200 Subject: [PATCH] WIP - initial commit: plugin-config UI inside wikilabs/bundler MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Adds the plugin-config scaffold under plugins/wikilabs/bundler/tiddlers/: ui/Plugins.tid New sidebar tab listing every $:/tags/PluginConfig with status pill, filter input, and "+ New plugin config" button. ui/plugin-config/ canvas.tid — body-template root, transcludes 7 sections PluginsList.tid — sidebar list rendering status-pill.tid — draft / no-target / unbuilt / built pill helpers.tid — wlpc-collapsible procedure (state-persistent replacement for
) and bundle-resolution helpers (bundle-tids/lane-tids — currently broken for multi-bundle filter resolution, rewrite pending) section-draft-banner — Activate banner for new configs section-header — config title + Verify/Build (Build is a stub that writes a log; verify is a state setter) section-identity — template dropdown, target plugin field, version-policy select section-pending — pending-changes detection via modified > last-built (wired but no real build sets last-built yet) section-sources — three lanes (Sources / Skip this build / Drop from plugin) with per-lane border accent; Skip dropdown only lists already-included bundles section-resolved — list + count of resolved tiddlers (count broken for multi-bundle filter lanes — rewrite pending using nested $list dispatch) section-snapshot — single-button auto-snapshot to a Bundle tagged $:/tags/Bundle $:/tags/Milestone system/viewtemplate-cascade/$:/config/ViewTemplateBodyFilters/PluginConfig Routes $:/tags/PluginConfig tiddlers to the canvas body template. styles/plugin-config-styles.tid Palette-aware styles for canvas, sections, collapsibles, lanes, pills. Uses TW core tc-{tiny|small|big}-gap-{left|right} classes for inline spacing where \whitespace trim strips it. Known issues to address next: - Bundle resolution for filter-tagged bundles inside :map / function bodies returns wrong counts; replace with nested wikitext $list rendering using the verified =>filter [subfilter] pattern. - Real build wiring (currently a stub). - Identity template seeding is unwired (dropdown sets the field but doesn't apply template metadata to the plugin tiddler yet). --- .../tiddlers/styles/plugin-config-styles.tid | 354 ++++++++++++++++++ ...g_ViewTemplateBodyFilters_PluginConfig.tid | 8 + wikilabs/bundler/tiddlers/ui/Plugins.tid | 8 + .../tiddlers/ui/plugin-config/PluginsList.tid | 56 +++ .../tiddlers/ui/plugin-config/canvas.tid | 24 ++ .../tiddlers/ui/plugin-config/helpers.tid | 33 ++ .../ui/plugin-config/section-draft-banner.tid | 30 ++ .../ui/plugin-config/section-header.tid | 53 +++ .../ui/plugin-config/section-identity.tid | 46 +++ .../ui/plugin-config/section-pending.tid | 39 ++ .../ui/plugin-config/section-resolved.tid | 45 +++ .../ui/plugin-config/section-snapshot.tid | 41 ++ .../ui/plugin-config/section-sources.tid | 83 ++++ .../tiddlers/ui/plugin-config/status-pill.tid | 25 ++ 14 files changed, 845 insertions(+) create mode 100644 wikilabs/bundler/tiddlers/styles/plugin-config-styles.tid create mode 100644 wikilabs/bundler/tiddlers/system/viewtemplate-cascade/$__config_ViewTemplateBodyFilters_PluginConfig.tid create mode 100644 wikilabs/bundler/tiddlers/ui/Plugins.tid create mode 100644 wikilabs/bundler/tiddlers/ui/plugin-config/PluginsList.tid create mode 100644 wikilabs/bundler/tiddlers/ui/plugin-config/canvas.tid create mode 100644 wikilabs/bundler/tiddlers/ui/plugin-config/helpers.tid create mode 100644 wikilabs/bundler/tiddlers/ui/plugin-config/section-draft-banner.tid create mode 100644 wikilabs/bundler/tiddlers/ui/plugin-config/section-header.tid create mode 100644 wikilabs/bundler/tiddlers/ui/plugin-config/section-identity.tid create mode 100644 wikilabs/bundler/tiddlers/ui/plugin-config/section-pending.tid create mode 100644 wikilabs/bundler/tiddlers/ui/plugin-config/section-resolved.tid create mode 100644 wikilabs/bundler/tiddlers/ui/plugin-config/section-snapshot.tid create mode 100644 wikilabs/bundler/tiddlers/ui/plugin-config/section-sources.tid create mode 100644 wikilabs/bundler/tiddlers/ui/plugin-config/status-pill.tid diff --git a/wikilabs/bundler/tiddlers/styles/plugin-config-styles.tid b/wikilabs/bundler/tiddlers/styles/plugin-config-styles.tid new file mode 100644 index 00000000..9704cf8f --- /dev/null +++ b/wikilabs/bundler/tiddlers/styles/plugin-config-styles.tid @@ -0,0 +1,354 @@ +created: 20260423144200000 +modified: 20260423144200000 +tags: $:/tags/Stylesheet +title: $:/plugins/wikilabs/bundler/styles/plugin-config + +/* Plugin-config UI styles — palette-aware, no hardcoded colors */ + +.wlpc-tab-toolbar { + display: flex; + align-items: center; + gap: 0.4em; + margin-bottom: 0.5em; +} + +.wlpc-filter-input { + flex: 1 1 auto; + min-width: 6em; +} + +.wlpc-list { + display: flex; + flex-direction: column; + gap: 0.4em; +} + +.wlpc-row { + border: 1px solid <>; + border-radius: 4px; + padding: 0.4em 0.5em; + background: <>; +} + +.wlpc-row-line1 { + display: flex; + align-items: center; + gap: 0.4em; + flex-wrap: wrap; +} + +.wlpc-row-line2 { + display: flex; + align-items: center; + gap: 0.6em; + flex-wrap: wrap; + font-size: 0.85em; + color: <>; + margin-top: 0.15em; +} + +.wlpc-row-title { + font-weight: 600; +} + +.wlpc-row-target { + font-family: <>; + font-size: 0.85em; +} + +.wlpc-row-counts { + margin-left: auto; +} + +.wlpc-empty { + padding: 0.6em; + color: <>; + font-style: italic; +} + +.wlpc-muted { + color: <>; +} + +.wlpc-small-gap-top { margin-top: 0.6em; } +/* For inline horizontal gaps use TW core: tc-{tiny|small|big}-gap-{left|right} */ + +/* Status pills */ + +.wlpc-pill { + display: inline-block; + padding: 0.05em 0.5em; + font-size: 0.75em; + border-radius: 999px; + border: 1px solid <>; + background: <>; + color: <>; + line-height: 1.4; + white-space: nowrap; +} + +.wlpc-pill-draft { + background: <>; + border-color: <>; + color: <>; +} + +.wlpc-pill-warn { + background: <>; + border-color: <>; + color: <>; +} + +.wlpc-pill-new { + background: <>; + border-color: <>; + color: <>; +} + +.wlpc-pill-clean { + background: <>; + border-color: <>; + color: <>; +} + +.wlpc-pill-info { + background: <>; + border-color: <>; + color: <>; +} + +/* Canvas */ + +.wlpc-canvas { + display: flex; + flex-direction: column; + gap: 0.8em; +} + +.wlpc-section { + border: 1px solid <>; + border-radius: 6px; + padding: 0; + background: <>; +} + +.wlpc-collapsible { + overflow: hidden; +} + +.wlpc-summary { + display: flex; + align-items: center; + gap: 0.4em; + width: 100%; + padding: 0.5em 0.7em; + background: <>; + border: none; + font-weight: 600; + cursor: pointer; + text-align: left; + color: <>; +} + +.wlpc-summary:hover { + background: <>; + color: <>; +} + +.wlpc-caret { + display: inline-flex; + align-items: center; + width: 1em; + height: 1em; + fill: <>; +} + +.wlpc-caret svg { + width: 1em; + height: 1em; + fill: currentColor; +} + +.wlpc-summary:hover .wlpc-caret { + color: <>; +} + +.wlpc-section-title { + letter-spacing: 0.02em; +} + +.wlpc-section-body { + padding: 0.7em; + border-top: 1px solid <>; +} + +.wlpc-eyebrow { + font-size: 0.7em; + letter-spacing: 0.1em; + text-transform: uppercase; + color: <>; + margin-right: 0.4em; +} + +/* Header section */ + +.wlpc-header { + padding: 0.7em 0.9em; + display: flex; + align-items: flex-start; + justify-content: space-between; + gap: 0.8em; + flex-wrap: wrap; +} + +.wlpc-header-title h2 { + margin: 0.1em 0 0.2em 0; + font-size: 1.15em; +} + +.wlpc-header-target code { + background: <>; + padding: 0.05em 0.35em; + border-radius: 3px; +} + +.wlpc-header-actions { + display: flex; + gap: 0.4em; + align-items: center; +} + +/* Draft banner */ + +.wlpc-banner { + border-radius: 6px; + padding: 0.6em 0.8em; + display: flex; + gap: 0.8em; + align-items: center; + justify-content: space-between; + flex-wrap: wrap; +} + +.wlpc-banner-draft { + background: <>; + border: 1px solid <>; + color: <>; +} + +/* Form rows */ + +.wlpc-row-form { + display: flex; + align-items: center; + gap: 0.5em; + margin-bottom: 0.4em; + flex-wrap: wrap; +} + +.wlpc-label { + min-width: 9em; + font-weight: 500; + color: <>; +} + +.wlpc-input-wide { + flex: 1 1 18em; + min-width: 12em; +} + +/* Sources lanes */ + +.wlpc-lane { + border: 1px solid <>; + border-left: 4px solid <>; + border-radius: 4px; + padding: 0.5em 0.6em; + margin-bottom: 0.5em; + background: transparent; + color: <>; +} + +.wlpc-lane-include { border-left-color: <>; } +.wlpc-lane-exclude { border-left-color: <>; } +.wlpc-lane-remove { border-left-color: <>; } + +.wlpc-lane-header { + display: flex; + align-items: baseline; + gap: 0.6em; + margin-bottom: 0.3em; + flex-wrap: wrap; +} + +.wlpc-lane-label { + font-weight: 600; + color: <>; +} + +.wlpc-lane-help { + font-size: 0.85em; + color: <>; +} + +.wlpc-lane-body { + display: flex; + flex-wrap: wrap; + gap: 0.3em; + margin-bottom: 0.3em; + min-height: 1.6em; +} + +.wlpc-lane-empty { font-style: italic; } + +.wlpc-bundle-chip { + display: inline-flex; + align-items: center; + gap: 0.3em; + background: <>; + border: 1px solid <>; + border-radius: 999px; + padding: 0.05em 0.6em; + font-size: 0.85em; +} + +.wlpc-chip-count { + color: <>; + font-size: 0.85em; +} + +.wlpc-chip-remove { + color: <>; + font-size: 0.95em; + line-height: 1; + padding: 0 0.15em; +} + +.wlpc-lane-add { + display: flex; + align-items: center; + gap: 0.4em; +} + +/* Resolved set */ + +.wlpc-resolved-row { + padding: 0.15em 0; + border-bottom: 1px solid <>; + font-family: <>; + font-size: 0.85em; +} + +.wlpc-resolved-extra { + display: flex; + align-items: center; + gap: 0.5em; +} + +/* Pending changes */ + +.wlpc-pending-row { + padding: 0.15em 0; + display: flex; + align-items: baseline; +} diff --git a/wikilabs/bundler/tiddlers/system/viewtemplate-cascade/$__config_ViewTemplateBodyFilters_PluginConfig.tid b/wikilabs/bundler/tiddlers/system/viewtemplate-cascade/$__config_ViewTemplateBodyFilters_PluginConfig.tid new file mode 100644 index 00000000..189be184 --- /dev/null +++ b/wikilabs/bundler/tiddlers/system/viewtemplate-cascade/$__config_ViewTemplateBodyFilters_PluginConfig.tid @@ -0,0 +1,8 @@ +created: 20260423143300000 +list-before: $:/config/ViewTemplateBodyFilters/code-body +modified: 20260423143300000 +tags: $:/tags/ViewTemplateBodyFilter +title: $:/config/ViewTemplateBodyFilters/PluginConfig +type: text/vnd.tiddlywiki + +[tag[$:/tags/PluginConfig]then[$:/plugins/wikilabs/bundler/ui/plugin-config/canvas]] diff --git a/wikilabs/bundler/tiddlers/ui/Plugins.tid b/wikilabs/bundler/tiddlers/ui/Plugins.tid new file mode 100644 index 00000000..9c561c19 --- /dev/null +++ b/wikilabs/bundler/tiddlers/ui/Plugins.tid @@ -0,0 +1,8 @@ +caption: Plugins +created: 20260423143000000 +modified: 20260423143000000 +tags: $:/tags/SideBar +title: $:/plugins/wikilabs/bundler/ui/Plugins +type: text/vnd.tiddlywiki + +{{$:/plugins/wikilabs/bundler/ui/plugin-config/PluginsList}} diff --git a/wikilabs/bundler/tiddlers/ui/plugin-config/PluginsList.tid b/wikilabs/bundler/tiddlers/ui/plugin-config/PluginsList.tid new file mode 100644 index 00000000..428747d8 --- /dev/null +++ b/wikilabs/bundler/tiddlers/ui/plugin-config/PluginsList.tid @@ -0,0 +1,56 @@ +created: 20260423143100000 +modified: 20260423143100000 +title: $:/plugins/wikilabs/bundler/ui/plugin-config/PluginsList +type: text/vnd.tiddlywiki + +\whitespace trim + +\procedure new-plugin-config-actions() +<$action-sendmessage $message="tm-new-tiddler" + title="new.plugin-config" + tags="$:/tags/PluginConfig" + draft="yes" + plugin="" + template="" + include-bundles="" + exclude-bundles="" + remove-bundles="" + version-policy="patch" + text="A new plugin configuration. Pick a template, set the target plugin, and add at least one source bundle to activate." +/> +\end + +
+ <$button actions=<> tooltip="Create a new plugin configuration" class="tc-btn-invisible tc-btn-mini-padding wlpc-btn-action"> + {{$:/core/images/new-button}} New plugin config + + <$edit-text tag="input" placeholder="Filter list" tiddler="$:/temp/plugin-config/listFilter" class="tc-tiny-gap-left wlpc-filter-input"/> + <$button class="tc-small-gap-left tc-btn-invisible tc-btn-icon" tooltip="Clear filter"> + {{$:/core/images/close-button}} + <$action-deletetiddler $tiddler="$:/temp/plugin-config/listFilter"/> + +
+ +
+ <$list filter="[tag[$:/tags/PluginConfig]] :filter[search:title{$:/temp/plugin-config/listFilter}]" emptyMessage="
No plugin configs yet — click ''New plugin config'' to start.
"> +
+
+ <$link to=<> class="wlpc-row-title"><$view field="title"/> + {{||$:/plugins/wikilabs/bundler/ui/plugin-config/status-pill}} +
+
+ <$list filter="[all[current]has[plugin]get[plugin]!is[blank]]" variable="targetPlugin"> + → <> + + <$list filter="[all[current]!has[plugin]] [all[current]get[plugin]is[blank]]" variable="ignore"> + no target plugin + + + <$count filter="[enlist{!!include-bundles}]"/> src · + <$count filter="[enlist{!!exclude-bundles}]"/> skip · + <$count filter="[enlist{!!remove-bundles}]"/> drop + +
+
+ +
diff --git a/wikilabs/bundler/tiddlers/ui/plugin-config/canvas.tid b/wikilabs/bundler/tiddlers/ui/plugin-config/canvas.tid new file mode 100644 index 00000000..1a0b5539 --- /dev/null +++ b/wikilabs/bundler/tiddlers/ui/plugin-config/canvas.tid @@ -0,0 +1,24 @@ +created: 20260423143400000 +modified: 20260423143400000 +title: $:/plugins/wikilabs/bundler/ui/plugin-config/canvas +type: text/vnd.tiddlywiki + +\whitespace trim + +
+ +{{||$:/plugins/wikilabs/bundler/ui/plugin-config/section-draft-banner}} + +{{||$:/plugins/wikilabs/bundler/ui/plugin-config/section-header}} + +{{||$:/plugins/wikilabs/bundler/ui/plugin-config/section-identity}} + +{{||$:/plugins/wikilabs/bundler/ui/plugin-config/section-pending}} + +{{||$:/plugins/wikilabs/bundler/ui/plugin-config/section-sources}} + +{{||$:/plugins/wikilabs/bundler/ui/plugin-config/section-resolved}} + +{{||$:/plugins/wikilabs/bundler/ui/plugin-config/section-snapshot}} + +
diff --git a/wikilabs/bundler/tiddlers/ui/plugin-config/helpers.tid b/wikilabs/bundler/tiddlers/ui/plugin-config/helpers.tid new file mode 100644 index 00000000..697ffb41 --- /dev/null +++ b/wikilabs/bundler/tiddlers/ui/plugin-config/helpers.tid @@ -0,0 +1,33 @@ +created: 20260423145500000 +modified: 20260423145500000 +title: $:/plugins/wikilabs/bundler/ui/plugin-config/helpers +type: text/vnd.tiddlywiki + +\function bundle-list-tids(t) [tag[$:/tags/Bundle]get[text]enlist-input[]!prefix[---]] +\function bundle-filter-tids(t) [tag[$:/tags/Filter]get[filter]] :map[subfilter] +\function bundle-tids(t) [bundle-list-tids] [bundle-filter-tids] +\function lane-tids(field) [getenlist-input[]] :map[bundle-list-tids] [getenlist-input[]] :map[bundle-filter-tids] + +\procedure wlpc-collapsible(key, defaultOpen:"no") +\whitespace trim +<$let + state={{{ [[$:/state/plugin-config/]addsuffixaddsuffix[/]addsuffix] }}} + stateText={{{ [get[text]!is[blank]] ~[] }}} +> +
+ <$button set=<> setTo={{{ [match[yes]then[no]else[yes]] }}} class="tc-btn-invisible wlpc-summary"> + + <$list filter="[match[yes]]" variable="ignore" emptyMessage="{{$:/core/images/right-arrow}}"> + {{$:/core/images/down-arrow}} + + + <$slot $name="summary"/> + + <$reveal type="match" state=<> text="yes" default=<>> +
+ <$slot $name="body"/> +
+ +
+ +\end diff --git a/wikilabs/bundler/tiddlers/ui/plugin-config/section-draft-banner.tid b/wikilabs/bundler/tiddlers/ui/plugin-config/section-draft-banner.tid new file mode 100644 index 00000000..8984e80d --- /dev/null +++ b/wikilabs/bundler/tiddlers/ui/plugin-config/section-draft-banner.tid @@ -0,0 +1,30 @@ +created: 20260423143500000 +modified: 20260423143500000 +title: $:/plugins/wikilabs/bundler/ui/plugin-config/section-draft-banner +type: text/vnd.tiddlywiki + +\whitespace trim + +\procedure activate-actions() +<$action-setfield draft="no"/> +\end + +<$list filter="[get[draft]match[yes]]" variable="ignore"> +
+
+ Draft — pick a template, set a target plugin, and add at least one source bundle to activate this config. +
+
+ <$let + canActivate={{{ [get[plugin]!is[blank]] :and[get[include-bundles]!is[blank]] +[then[yes]else[no]] }}} + > + <$list filter="[match[yes]]" variable="ignore"> + <$button actions=<> class="tc-btn-boxed">Activate + + <$list filter="[match[no]]" variable="ignore"> + <$button class="tc-btn-boxed" disabled="yes" tooltip="Set a target plugin and at least one source bundle first">Activate + + +
+
+ diff --git a/wikilabs/bundler/tiddlers/ui/plugin-config/section-header.tid b/wikilabs/bundler/tiddlers/ui/plugin-config/section-header.tid new file mode 100644 index 00000000..491452f6 --- /dev/null +++ b/wikilabs/bundler/tiddlers/ui/plugin-config/section-header.tid @@ -0,0 +1,53 @@ +created: 20260423143600000 +modified: 20260423143600000 +title: $:/plugins/wikilabs/bundler/ui/plugin-config/section-header +type: text/vnd.tiddlywiki + +\whitespace trim + +\procedure build-stub-actions() +<$action-setfield + $tiddler="$:/temp/plugin-config/build-stub-log" + source=<> + text="""! Build stub invoked + +This is the UI prototype — no actual build happened. + +The real build will call `$tw.utils.bundlePlugin` with the source plugin-config's fields. That wiring lands in the next iteration. + +Source plugin-config: <$link to={{$:/temp/plugin-config/build-stub-log!!source}}><$view tiddler="$:/temp/plugin-config/build-stub-log" field="source"/> + +* Target plugin: `<$view tiddler={{$:/temp/plugin-config/build-stub-log!!source}} field="plugin"/>` +* Version policy: <$view tiddler={{$:/temp/plugin-config/build-stub-log!!source}} field="version-policy"/> +* Sources: `<$view tiddler={{$:/temp/plugin-config/build-stub-log!!source}} field="include-bundles"/>` +* Skip: `<$view tiddler={{$:/temp/plugin-config/build-stub-log!!source}} field="exclude-bundles"/>` +* Drop: `<$view tiddler={{$:/temp/plugin-config/build-stub-log!!source}} field="remove-bundles"/>` +""" +/> +<$action-navigate $to="$:/temp/plugin-config/build-stub-log"/> +\end + +\procedure verify-actions() +<$action-setfield $tiddler="$:/temp/plugin-config/verify-target" $value=<>/> + +\end + +
+
+ PLUGIN CONFIG +

<$view field="title"/>

+ <$list filter="[get[plugin]!is[blank]]" variable="ignore"> +
target: <$view field="plugin"/>
+ +
+
+ <$list filter="[get[draft]!match[yes]]" variable="ignore"> + <$button actions=<> class="tc-btn-boxed wlpc-btn-verify" tooltip="Render the resolved set + diff inline (read-only)"> + Verify + + <$button actions=<> class="tc-btn-boxed wlpc-btn-build" tooltip="Stub — writes a log to $:/temp/plugin-config/build-stub-log instead of running the real build"> + Build (stub) + + +
+
diff --git a/wikilabs/bundler/tiddlers/ui/plugin-config/section-identity.tid b/wikilabs/bundler/tiddlers/ui/plugin-config/section-identity.tid new file mode 100644 index 00000000..d07de0ff --- /dev/null +++ b/wikilabs/bundler/tiddlers/ui/plugin-config/section-identity.tid @@ -0,0 +1,46 @@ +created: 20260423143700000 +modified: 20260423150000000 +title: $:/plugins/wikilabs/bundler/ui/plugin-config/section-identity +type: text/vnd.tiddlywiki + +\whitespace trim +\import [[$:/plugins/wikilabs/bundler/ui/plugin-config/helpers]] + +<$transclude $variable="wlpc-collapsible" key="identity" defaultOpen="yes"> + <$fill $name="summary">Identity + <$fill $name="body"> + +
+ + <$select tiddler=<> field="template" default=""> + + <$list filter="[tag[$:/tags/PluginMetaTemplate]sort[caption]]"> + + + + <$list filter="[get[template]!is[blank]]" variable="ignore"> + ↺ resync (not wired yet) + +
+ +
+ + <$edit-text tiddler=<> field="plugin" tag="input" placeholder="$:/plugins/author/name" class="wlpc-input-wide"/> +
+ +
+ + <$select tiddler=<> field="version-policy" default="patch"> + + + + + +
+ +
+ Identity is wired up minimally for the prototype scaffold. Template seeding, per-field override markers, and inline metadata editing arrive in the next iteration. +
+ + + diff --git a/wikilabs/bundler/tiddlers/ui/plugin-config/section-pending.tid b/wikilabs/bundler/tiddlers/ui/plugin-config/section-pending.tid new file mode 100644 index 00000000..ee726ef0 --- /dev/null +++ b/wikilabs/bundler/tiddlers/ui/plugin-config/section-pending.tid @@ -0,0 +1,39 @@ +created: 20260423143800000 +modified: 20260423150000000 +title: $:/plugins/wikilabs/bundler/ui/plugin-config/section-pending +type: text/vnd.tiddlywiki + +\whitespace trim +\import [[$:/plugins/wikilabs/bundler/ui/plugin-config/helpers]] + +\procedure pending-count() +<$count filter="[get[plugin]plugintiddlers[]] :filter[get[modified]compare:string:gt{$(pluginConfig)$!!last-built}]"/> +\end + +\procedure pending-list-body() +<$list filter="[get[plugin]plugintiddlers[]] :filter[get[modified]compare:string:gt{$(pluginConfig)$!!last-built}]" emptyMessage="
No pending changes since last build.
"> +
+ <$link to=<>><> + modified <$view field="modified" format="date" template="YYYY-0MM-0DD 0hh:0mm"/> +
+ +\end + +<$let pluginConfig=<>> +<$transclude $variable="wlpc-collapsible" key="pending" defaultOpen="no"> + <$fill $name="summary"> + Pending changes + <$list filter="[has[last-built]]" variable="ignore"> + <> + + + <$fill $name="body"> + <$list filter="[!has[last-built]]" variable="ignore"> +
No build recorded yet — pending detection activates after the first build.
+ + <$list filter="[has[last-built]]" variable="ignore"> + <> + + + + diff --git a/wikilabs/bundler/tiddlers/ui/plugin-config/section-resolved.tid b/wikilabs/bundler/tiddlers/ui/plugin-config/section-resolved.tid new file mode 100644 index 00000000..0d9a907a --- /dev/null +++ b/wikilabs/bundler/tiddlers/ui/plugin-config/section-resolved.tid @@ -0,0 +1,45 @@ +created: 20260423144000000 +modified: 20260423150500000 +title: $:/plugins/wikilabs/bundler/ui/plugin-config/section-resolved +type: text/vnd.tiddlywiki + +\whitespace trim +\import [[$:/plugins/wikilabs/bundler/ui/plugin-config/helpers]] + +\procedure resolved-list-body() +<$list filter="[lane-tids[include-bundles]] -[lane-tids[exclude-bundles]] -[lane-tids[remove-bundles]] +[unique[]] +[sort[title]]" emptyMessage="
No tiddlers resolve from current sources. Add a Source bundle above.
"> +
+ <$view field="title"/> +
+ +\end + +\procedure resolved-count() +<$count filter="[lane-tids[include-bundles]] -[lane-tids[exclude-bundles]] -[lane-tids[remove-bundles]] +[unique[]]"/> +\end + +<$let pluginConfig=<>> +<$transclude $variable="wlpc-collapsible" key="resolved" defaultOpen="no"> + <$fill $name="summary"> + Resolved set + <> tiddlers + + <$fill $name="body"> + <> + + <$list filter="[get[plugin]!is[blank]]" variable="ignore"> +
+ Currently in plugin payload + + <$count filter="[get[plugin]plugintiddlers[]]"/> + +
+ + +
+ Provenance per-row, conflict markers, and add/remove diff vs. the current plugin payload arrive in the next iteration. +
+ + + + diff --git a/wikilabs/bundler/tiddlers/ui/plugin-config/section-snapshot.tid b/wikilabs/bundler/tiddlers/ui/plugin-config/section-snapshot.tid new file mode 100644 index 00000000..2c0f38c4 --- /dev/null +++ b/wikilabs/bundler/tiddlers/ui/plugin-config/section-snapshot.tid @@ -0,0 +1,41 @@ +created: 20260423144100000 +modified: 20260423145800000 +title: $:/plugins/wikilabs/bundler/ui/plugin-config/section-snapshot +type: text/vnd.tiddlywiki + +\whitespace trim +\import [[$:/plugins/wikilabs/bundler/ui/plugin-config/helpers]] + +\procedure snapshot-actions() +<$let + pluginConfig=<> + timestamp=<> + snapName={{{ [addsuffix[-snap-]addsuffixaddsuffix[.bundle]] }}} + snapBody={{{ [get[include-bundles]enlist-input[]] [get[exclude-bundles]enlist-input[]] [get[remove-bundles]enlist-input[]] [lane-tids[include-bundles]] [lane-tids[exclude-bundles]] [lane-tids[remove-bundles]] +[unique[]sort[title]format:titlelist[]join[ ]] }}} +> + <$action-sendmessage $message="tm-new-tiddler" + title=<> + tags="$:/tags/Bundle $:/tags/Milestone" + text=<> + caption=<> + source-plugin-config=<> + /> + +\end + +<$transclude $variable="wlpc-collapsible" key="snapshot" defaultOpen="no"> + <$fill $name="summary">Snapshot + <$fill $name="body"> + +
+ Creates a milestone bundle from the current resolved set. Auto-named, auto-tagged, ready to drag-export as a backup. +
+ +
+ <$button actions=<> class="tc-btn-boxed"> + {{$:/core/images/save-button}} Create snapshot + +
+ + + diff --git a/wikilabs/bundler/tiddlers/ui/plugin-config/section-sources.tid b/wikilabs/bundler/tiddlers/ui/plugin-config/section-sources.tid new file mode 100644 index 00000000..962a6298 --- /dev/null +++ b/wikilabs/bundler/tiddlers/ui/plugin-config/section-sources.tid @@ -0,0 +1,83 @@ +created: 20260423143900000 +modified: 20260423143900000 +title: $:/plugins/wikilabs/bundler/ui/plugin-config/section-sources +type: text/vnd.tiddlywiki + +\whitespace trim +\import [[$:/plugins/wikilabs/bundler/ui/plugin-config/helpers]] + +\procedure lane(field, label, helpText, addLabel, kind) +<$let + pluginConfig=<> + laneField={{{ [addprefix[lane-]] }}} + laneClass={{{ [[wlpc-lane wlpc-lane-]addsuffix] }}} +> +
>> +
+ < + <> +
+
+ <$list filter="[getenlist-input[]]" variable="bundle" emptyMessage="
(none)
"> + + <$link to=<>><> + + <$let + listCount={{{ [tag[$:/tags/Bundle]get[text]enlist-input[]!prefix[---]] +[count[]] }}} + filterCount={{{ [tag[$:/tags/Filter]get[filter]] =>filter [subfilter] +[count[]] }}} + total={{{ [add] }}} + > + <> + + + <$button class="tc-btn-invisible wlpc-chip-remove" tooltip="Remove from this lane"> + <$action-listops $tiddler=<> $field=<> $subfilter="-[]"/> + × + + + +
+
+ <$select tiddler="$:/temp/plugin-config/add-to-lane" field=<> default=""> + + <$list filter="[match[exclude]]" variable="ignore"> + <$list filter="[get[include-bundles]enlist-input[]] -[get[exclude-bundles]enlist-input[]] +[sort[title]]"> + + + + <$list filter="[!match[exclude]]" variable="ignore"> + <$list filter="[tag[$:/tags/Bundle]] [tag[$:/tags/Filter]] -[get[include-bundles]enlist-input[]] -[get[exclude-bundles]enlist-input[]] -[get[remove-bundles]enlist-input[]] +[sort[title]]"> + + + + + <$button tooltip="Add the picked bundle to this lane" class="tc-btn-boxed tc-tiny-gap-left"> + <$let pickedBundle={{{ [[$:/temp/plugin-config/add-to-lane]get] }}}> + <$list filter="[!is[blank]]" variable="ignore"> + <$action-listops $tiddler=<> $field=<> $subfilter="[]"/> + <$action-deletefield $tiddler="$:/temp/plugin-config/add-to-lane" $field=<>/> + + + <> + +
+
+ +\end + +<$transclude $variable="wlpc-collapsible" key="sources" defaultOpen="yes"> + <$fill $name="summary">Sources + <$fill $name="body"> + + <> + + <> + + <> + +
+ Inline filters and drag-from-Bundles-tab are not yet wired in this scaffold — for now, pick from the dropdowns. Chip counts assume a bundle uses either a list (`$:/tags/Bundle`) or a filter (`$:/tags/Filter`). +
+ + + diff --git a/wikilabs/bundler/tiddlers/ui/plugin-config/status-pill.tid b/wikilabs/bundler/tiddlers/ui/plugin-config/status-pill.tid new file mode 100644 index 00000000..ab25f071 --- /dev/null +++ b/wikilabs/bundler/tiddlers/ui/plugin-config/status-pill.tid @@ -0,0 +1,25 @@ +created: 20260423143200000 +modified: 20260423143200000 +title: $:/plugins/wikilabs/bundler/ui/plugin-config/status-pill +type: text/vnd.tiddlywiki + +\whitespace trim + +<$let + isDraft={{{ [all[current]get[draft]match[yes]then[yes]else[no]] }}} + hasBuilt={{{ [all[current]has[last-built]then[yes]else[no]] }}} + hasPlugin={{{ [all[current]get[plugin]!is[blank]then[yes]else[no]] }}} +> + <$list filter="[match[yes]]" variable="ignore"> + draft + + <$list filter="[match[no]] :and[match[no]]" variable="ignore"> + no target + + <$list filter="[match[no]] :and[match[yes]] :and[match[no]]" variable="ignore"> + unbuilt + + <$list filter="[match[no]] :and[match[yes]] :and[match[yes]]" variable="ignore"> + built + +