Skip to content

Commit d48a049

Browse files
authored
Merge pull request #150 from eviltester/140-text-to-control-auto-preview-number-rather-than-fix-10-as-default
configurable row count
2 parents 70bed06 + efa6ed2 commit d48a049

19 files changed

Lines changed: 488 additions & 22 deletions

AGENTS.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@ When changing frontend UI code, Storybook stories, UI test abstractions, or brow
6060

6161
- read `docs/frontend-component-migration-plan.md` before making changes
6262
- read `docs/frontend-component-architecture.md` for the current page/component/service layering model
63+
- read `docs/frontend-legacy-ui-elimination-plan.md` when changing or discovering UI code that still uses legacy controls, broad imperative helpers, document-scoped lookup, or compatibility facades
6364
- prefer the `Controller + View + createComponent` pattern for new or migrated UI components
6465
- keep components mounted into one explicit root element
6566
- avoid global `document.querySelector`/`getElementById` inside reusable components; query within the component root instead

apps/web/src/stories/export-format-interactions.js

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { expect, userEvent, waitFor, within } from 'storybook/test';
22

33
async function clickByText(canvas, text) {
4-
const button = canvas.getByText(text);
4+
const button = canvas.getByRole('button', { name: text });
55
await userEvent.click(button);
66
return button;
77
}
@@ -48,7 +48,7 @@ async function playSetTextFromGrid({ canvasElement }) {
4848

4949
async function playCsvRoundTrip({ canvasElement }) {
5050
const canvas = within(canvasElement);
51-
await clickByText(canvas, 'Preview (10)');
51+
await clickByText(canvas, 'Preview');
5252
await waitFor(() => expect(canvas.getByText('Edit')).toBeTruthy());
5353

5454
const textArea = await setTextareaValue(canvasElement, 'Name,Role\nAda,Engineer\nBob,Tester');
@@ -70,12 +70,12 @@ async function playJsonOptionsPreview({ canvasElement }) {
7070

7171
async function playPreviewEditMode({ canvasElement }) {
7272
const canvas = within(canvasElement);
73-
const modeButton = canvas.getByText('Preview (10)');
73+
const modeButton = canvas.getByRole('button', { name: 'Preview' });
7474
await userEvent.click(modeButton);
75-
await waitFor(() => expect(canvas.getByText('Edit')).toBeTruthy());
75+
await waitFor(() => expect(canvas.getByRole('button', { name: 'Edit' })).toBeTruthy());
7676

77-
await userEvent.click(canvas.getByText('Edit'));
78-
await waitFor(() => expect(canvas.getByText('Preview (10)')).toBeTruthy());
77+
await userEvent.click(canvas.getByRole('button', { name: 'Edit' }));
78+
await waitFor(() => expect(canvas.getByRole('button', { name: 'Preview' })).toBeTruthy());
7979
}
8080

8181
async function playDelimitedOptionsPreview({ canvasElement }) {
@@ -103,7 +103,8 @@ async function playPreviewAlreadyRendered({ canvasElement }) {
103103
expect(textArea?.value?.length || 0).toBeGreaterThan(0);
104104
});
105105

106-
await expect(canvas.getByRole('button', { name: 'Preview (10)' })).toBeTruthy();
106+
await expect(canvas.getByRole('button', { name: 'Preview' })).toBeTruthy();
107+
await expect(canvas.getByRole('spinbutton', { name: 'Preview row count' })).toHaveValue(10);
107108
await userEvent.click(canvas.getByRole('button', { name: 'Copy' }));
108109
await waitFor(() => {
109110
expect(textArea?.value?.length || 0).toBeGreaterThan(0);

apps/web/src/stories/export-preview-story-harness.js

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -265,11 +265,12 @@ function setCheckboxValue(input, checked) {
265265
}
266266

267267
function setPreviewRowLimit(surface, value) {
268-
const previewButton = surface.querySelector('#previewEditModeButton');
269-
if (!previewButton) {
268+
const previewRowsInput = surface.querySelector('#previewRowsCount');
269+
if (!previewRowsInput) {
270270
return;
271271
}
272-
previewButton.textContent = `Preview (${value})`;
272+
previewRowsInput.value = String(value);
273+
previewRowsInput.dispatchEvent(new Event('input', { bubbles: true }));
273274
}
274275

275276
function getActiveExportSelection(surface) {
@@ -454,6 +455,9 @@ function renderGridPreviewStory({
454455
const workspace = createImportExportWorkspaceComponent({
455456
root: workspaceHost,
456457
documentObj: document,
458+
props: {
459+
previewRowLimit,
460+
},
457461
services: {
458462
importExportControls: legacyControls,
459463
},
@@ -509,7 +513,6 @@ function renderGridPreviewStory({
509513
return result;
510514
};
511515

512-
importExportController.previewRowLimit = previewRowLimit;
513516
setPreviewRowLimit(surface, previewRowLimit);
514517
withScopedDocument(surface, () => {
515518
selectExportFormat(surface, format);

apps/web/src/stories/import-export-workspace.stories.js

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,9 @@ function renderImportExportWorkspaceStory(args) {
5353
const component = createImportExportWorkspaceComponent({
5454
root,
5555
documentObj: document,
56+
props: {
57+
previewRowLimit: args.previewRowLimit,
58+
},
5659
});
5760

5861
component.setExporter(exporter);
@@ -86,12 +89,16 @@ const meta = {
8689
},
8790
args: {
8891
format: 'csv',
92+
previewRowLimit: 10,
8993
},
9094
argTypes: {
9195
format: {
9296
control: 'select',
9397
options: ['csv', 'json', 'markdown'],
9498
},
99+
previewRowLimit: {
100+
control: { type: 'number', min: 1, max: 50, step: 1 },
101+
},
95102
},
96103
render: renderImportExportWorkspaceStory,
97104
};
@@ -103,12 +110,13 @@ export const Default = {
103110
docs: {
104111
description: {
105112
story:
106-
'Shows the composed app-side import/export workspace mounted through the new Phase 6 feature boundary. Click Set Text From Grid to refresh preview text, switch formats, and use the options panel inside the same mounted component tree.',
113+
'Shows the composed app-side import/export workspace mounted through the new Phase 6 feature boundary. Use the compact preview row-count input next to Preview to change the sample size, click Set Text From Grid to refresh preview text, and switch formats inside the same mounted component tree.',
107114
},
108115
},
109116
},
110117
play: async ({ canvasElement }) => {
111118
const canvas = within(canvasElement);
119+
await expect(canvas.getByRole('spinbutton', { name: 'Preview row count' })).toHaveValue(10);
112120
await userEvent.click(canvas.getByRole('button', { name: 'v Set Text From Grid v' }));
113121
await waitFor(() => {
114122
expect(canvasElement.querySelector('#markdownarea')?.value?.length || 0).toBeGreaterThan(0);
@@ -128,7 +136,7 @@ export const JsonPreview = {
128136
docs: {
129137
description: {
130138
story:
131-
'Shows the same workspace after switching to JSON so the shared format selector, preview editor, and options panel can be reviewed together in a non-CSV state.',
139+
'Shows the same workspace after switching to JSON so the shared format selector, preview editor, row-count control, and options panel can be reviewed together in a non-CSV state.',
132140
},
133141
},
134142
},

apps/web/src/stories/text-preview-editor.stories.js

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ export const PreviewMode = {
4343
docs: {
4444
description: {
4545
story:
46-
'Preview-mode state with Auto Preview enabled and the preview-row count reflected in the toggle button label.',
46+
'Shows Preview mode with Auto Preview enabled and the dedicated preview row-count spinbutton set to 10. Reviewers should hover the help button, confirm the tooltip mentions the first 10 rows, and try changing the Preview row count to see how the preview-specific guidance follows that value while the toggle button remains labeled Preview.',
4747
},
4848
},
4949
},
@@ -59,7 +59,8 @@ export const PreviewMode = {
5959
});
6060

6161
await expect(autoPreviewCheckbox).toBeEnabled();
62-
await expect(canvas.getByRole('button', { name: 'Preview (10)' })).toBeTruthy();
62+
await expect(canvas.getByRole('button', { name: 'Preview' })).toBeTruthy();
63+
await expect(canvas.getByRole('spinbutton', { name: 'Preview row count' })).toHaveValue(10);
6364
},
6465
};
6566

apps/web/styles.css

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -950,6 +950,10 @@ body.theme-dark .generator-status-text[data-severity='info'] {
950950
width: 6rem;
951951
}
952952

953+
.app-preview-row-count-control #previewRowsCount {
954+
width: 3.25rem;
955+
}
956+
953957
#generator-preview-grid {
954958
width: 100%;
955959
height: 420px;

0 commit comments

Comments
 (0)