You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
'ImportExportWorkspace is the Phase 6 app-side feature boundary for import/export controls, format selection, text preview/editing, and options-panel composition.',
100
+
'ImportExportWorkspace is the app-side component-owned import/export feature. It composes the toolbar, format selector, options panel, preview/edit text editor, row-count control, file import, copy, and download behavior without delegating to the old legacy controls.',
87
101
},
88
102
},
89
103
},
90
104
args: {
91
105
format: 'csv',
92
106
previewRowLimit: 10,
107
+
importBusy: false,
108
+
exportBusy: false,
109
+
importStatusMessage: '',
110
+
importStatusLoading: false,
111
+
exportStatusMessage: '',
112
+
exportStatusLoading: false,
113
+
errorStatusMessage: '',
114
+
unsupported: false,
93
115
},
94
116
argTypes: {
95
117
format: {
@@ -151,3 +173,64 @@ export const JsonPreview = {
151
173
awaitexpect(applyButton).toBeEnabled();
152
174
},
153
175
};
176
+
177
+
exportconstImportBusy={
178
+
args: {
179
+
importBusy: true,
180
+
importStatusMessage: 'Importing full data into grid...',
181
+
importStatusLoading: true,
182
+
},
183
+
parameters: {
184
+
docs: {
185
+
description: {
186
+
story:
187
+
'Shows the workspace while an import is active. The Set Text From Grid and Download affordances become busy/disabled, and the import status remains visible with loading styling.',
188
+
},
189
+
},
190
+
},
191
+
};
192
+
193
+
exportconstExportBusy={
194
+
args: {
195
+
exportBusy: true,
196
+
exportStatusMessage: 'Generating export text...',
197
+
exportStatusLoading: true,
198
+
},
199
+
parameters: {
200
+
docs: {
201
+
description: {
202
+
story:
203
+
'Shows the workspace while a download/export is active. The download button is disabled and the export status explains the current operation.',
204
+
},
205
+
},
206
+
},
207
+
};
208
+
209
+
exportconstUnsupportedFormat={
210
+
args: {
211
+
format: 'json',
212
+
unsupported: true,
213
+
},
214
+
parameters: {
215
+
docs: {
216
+
description: {
217
+
story:
218
+
'Shows how the toolbar renders when the selected format is not importable or exportable. Import controls and download are hidden while the selector/editor remain mounted.',
'Shows the persistent error/status surface used when import/export validation or parsing fails. Retry Set Grid From Text after editing the preview text.',
Copy file name to clipboardExpand all lines: apps/web/src/stories/text-preview-editor.stories.js
+1-1Lines changed: 1 addition & 1 deletion
Original file line number
Diff line number
Diff line change
@@ -24,7 +24,7 @@ const meta = {
24
24
docs: {
25
25
description: {
26
26
component:
27
-
'TextPreviewEditor is the Phase 6 app-side component that owns preview/edit controls, the shared text area, and the options/preview split-panel shell.',
27
+
'TextPreviewEditor is the app-side preview/edit component. It renders the Preview/Edit toggle, Auto Preview checkbox, compact preview row-count spinbutton, shared text area, copy button, and options/preview split-panel shell.',
Copy file name to clipboardExpand all lines: docs/frontend-component-architecture.md
+7-1Lines changed: 7 additions & 1 deletion
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -68,7 +68,13 @@ Storybook is a review, documentation, and lightweight interaction-example layer.
68
68
- When practical, presenter stories should include a destroy-and-remount example so reviewers can confirm lifecycle safety without reading Jest tests first.
69
69
- Storybook cleanup is centralized in `.storybook/preview.js`; stories may expose `root.__storybookCleanup`, and the global decorator will run that teardown before the next story and remove common body-level artifacts such as modals, method-picker overlays, tooltip poppers, and inline help containers.
70
70
- Prefer returning the story root directly instead of manually appending it to `document.body` unless the component behavior genuinely depends on top-level overlays or body-scoped positioning.
71
-
- Current intentional body-aware Storybook exceptions are the app page bootstrap story and the export-preview harness, because both still exercise document-scoped page/bootstrap behavior rather than a purely root-scoped component contract.
71
+
- Current intentional body-aware Storybook exception is the app page bootstrap story, because it still exercises document-scoped page/bootstrap behavior rather than a purely root-scoped component contract.
72
+
73
+
## Format Options
74
+
75
+
`FormatOptionsPanel` renders format-specific option panels from declarative definitions under `shared/format-options-panel/`. A format option panel definition owns the field schema and returns a panel object with `render`, `read`, `write`, `validate`, `setDirty`, `destroy`, and `onApply` behavior. The shared view mounts those panels directly; there is no separate legacy `options_panels/*` class layer or `addToGui()` adapter path.
76
+
77
+
Option sanitization remains in the generator/app options services, not in the view. The view reads user input into an explicit `{ outputFormat, options }` payload and the controller sends that payload through the injected sanitization service before emitting applied options.
Copy file name to clipboardExpand all lines: docs/frontend-component-migration-plan.md
+7-1Lines changed: 7 additions & 1 deletion
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -9,6 +9,12 @@ This is an internal engineering plan for moving the current plain JavaScript UI
9
9
10
10
This plan intentionally does not require React, Vue, Svelte, or Lit. The structure should make a future Lit migration possible by replacing `ThingView` with a Lit element while keeping controllers, services, and adapters stable.
11
11
12
+
## Status Note
13
+
14
+
The first component migration established the main page and feature component boundaries, but later review found that several componentized shells still delegate core behavior to older controls, DOM helpers, or compatibility facades. For the stricter goal of eliminating legacy UI approaches before a future React, Web Components, or Lit migration, use `docs/frontend-legacy-ui-elimination-plan.md` as the active follow-on plan. That document supersedes any "complete" status in this migration checklist where old UI orchestration still remains underneath a component boundary.
15
+
16
+
For the related test-layer cleanup needed after app/generator component sharing increased, use `docs/frontend-ui-matrix-rationalization-plan.md` to track reduction of redundant app-vs-generator UI matrix coverage.
17
+
12
18
## Goals
13
19
14
20
- Split the app and generator UIs into feature components that can be mounted independently.
@@ -363,7 +369,7 @@ Current status:
363
369
- `ImportExportWorkspace` now lives under `app/import-export-workspace/` with a controller, view, and create-component factory.
364
370
- `ImportExportToolbar`, `FormatSelector`, and `TextPreviewEditor` now live under their own app feature folders and are mounted through `ImportExportWorkspace` rather than through direct page bootstrap wiring.
365
371
- The app bootstrap now mounts the import/export area through `createImportExportWorkspaceComponent(...)`, and the `tabbedTextArea` preview region now lives inside that feature boundary instead of as a separate sibling shell.
366
-
- The extracted workspace reuses the shared `FormatOptionsPanel` while preserving the current import/export behavior through the existing import/export controls path underneath.
372
+
- The extracted workspace reuses the shared `FormatOptionsPanel`, and the current import/export behavior now runs through the workspace controller/services path instead of the old import/export controls path underneath.
367
373
- File input, drag/drop, file reading, download, and clipboard behavior now flow through explicit Phase 6 app-side adapters/services under `app/import-export-adapters/`, so the legacy import/export control layer no longer talks directly to `FileReader`, `DragDropControl`, or download/copy browser APIs.
368
374
- Storybook now documents `ImportExportWorkspace`, `ImportExportToolbar`, `FormatSelector`, and `TextPreviewEditor` directly with small component stories instead of relying only on the older broader app/export harnesses.
369
375
- The export-format preview stories now mount through `ImportExportWorkspace` via a dedicated `export-preview-story-harness.js` helper rather than the older split `ImportExportControls + TabbedTextControl` story path or the broader omnibus `storybook-harnesses.js` module.
0 commit comments