docs: add market selection export design
This commit is contained in:
parent
3e2d7b36f2
commit
06737918bc
@ -0,0 +1,183 @@
|
|||||||
|
# Market Selection Export Design
|
||||||
|
|
||||||
|
## Goal
|
||||||
|
|
||||||
|
Add row-level selection checkboxes to the market table so users can selectively export CSV data and submit batches for chosen creators, while preserving the existing export range workflow.
|
||||||
|
|
||||||
|
## Confirmed Decisions
|
||||||
|
|
||||||
|
- Add one checkbox column before each creator row.
|
||||||
|
- Add a header checkbox that selects or clears only the creators visible on the current page.
|
||||||
|
- Selection state persists across pagination.
|
||||||
|
- Selection affects both:
|
||||||
|
- CSV export
|
||||||
|
- batch submission
|
||||||
|
- If the current export range contains any selected creators, export and submit only those selected creators within that range.
|
||||||
|
- If the current export range contains no selected creators, fall back to all creators in the current export range.
|
||||||
|
- Keep the existing export range selector and current toolbar layout.
|
||||||
|
- Do not change the CSV column schema.
|
||||||
|
- Do not change the batch payload shape. Only change which records are included.
|
||||||
|
|
||||||
|
## User Experience
|
||||||
|
|
||||||
|
### Table Controls
|
||||||
|
|
||||||
|
- Each creator row gets a checkbox at the far left.
|
||||||
|
- The table header gets a tri-state checkbox:
|
||||||
|
- unchecked: none of the current page creators are selected
|
||||||
|
- indeterminate: some but not all current page creators are selected
|
||||||
|
- checked: all current page creators are selected
|
||||||
|
- Clicking the header checkbox toggles selection for the current visible page only.
|
||||||
|
|
||||||
|
### Export and Submit Behavior
|
||||||
|
|
||||||
|
- Export still starts from the current range selector:
|
||||||
|
- current page
|
||||||
|
- first 5 pages
|
||||||
|
- custom pages
|
||||||
|
- all pages
|
||||||
|
- After range resolution:
|
||||||
|
- if any creators in that resolved range are selected, use only those selected creators
|
||||||
|
- if none are selected in that resolved range, use the full resolved range
|
||||||
|
- Batch submit uses the same filtered creator set as CSV export.
|
||||||
|
|
||||||
|
### Status Feedback
|
||||||
|
|
||||||
|
- Keep the existing export status area.
|
||||||
|
- Add lightweight selection feedback in the toolbar status text when helpful, for example:
|
||||||
|
- `已勾选 7 位达人`
|
||||||
|
- Do not add extra selection mode toggles or secondary panels.
|
||||||
|
|
||||||
|
## Data Model
|
||||||
|
|
||||||
|
Selection is UI state, not record data.
|
||||||
|
|
||||||
|
- Maintain selection in the controller as a `Set<string>` keyed by `authorId`.
|
||||||
|
- Do not store selection inside the CSV exporter.
|
||||||
|
- Do not mutate `MarketRecord` with persistent selection fields unless required for DOM wiring.
|
||||||
|
- Resolve selection against `authorId` only so sorting, filtering, and row reordering do not break checkbox state.
|
||||||
|
|
||||||
|
## DOM Design
|
||||||
|
|
||||||
|
### Synthetic Table
|
||||||
|
|
||||||
|
- Insert a selectable header cell before the author column.
|
||||||
|
- Insert one checkbox cell per row.
|
||||||
|
- Expose the row checkbox and header checkbox through `MarketRowDom` and table DOM helpers.
|
||||||
|
|
||||||
|
### Div Grid Table
|
||||||
|
|
||||||
|
- Clone a narrow column before the native author column.
|
||||||
|
- Render checkbox cells aligned to each creator row.
|
||||||
|
- Render the header checkbox in the sticky header section.
|
||||||
|
- Reuse the existing plugin section insertion pattern so checkbox layout survives page refresh and plugin re-sync.
|
||||||
|
|
||||||
|
## Controller Design
|
||||||
|
|
||||||
|
### New Responsibilities
|
||||||
|
|
||||||
|
- Track selected creator ids across page changes.
|
||||||
|
- Re-apply checkbox state after every DOM re-sync.
|
||||||
|
- Update header checkbox state after:
|
||||||
|
- row checkbox changes
|
||||||
|
- header checkbox changes
|
||||||
|
- pagination changes
|
||||||
|
- sorting and filtering changes
|
||||||
|
|
||||||
|
### Export Flow
|
||||||
|
|
||||||
|
Current flow:
|
||||||
|
- resolve export target
|
||||||
|
- collect `MarketRecord[]`
|
||||||
|
- build CSV
|
||||||
|
|
||||||
|
New flow:
|
||||||
|
- resolve export target
|
||||||
|
- collect `MarketRecord[]`
|
||||||
|
- filter records by selection-with-fallback rule
|
||||||
|
- build CSV
|
||||||
|
|
||||||
|
### Batch Flow
|
||||||
|
|
||||||
|
Current flow:
|
||||||
|
- resolve export target
|
||||||
|
- collect `MarketRecord[]`
|
||||||
|
- build batch payload
|
||||||
|
- submit
|
||||||
|
|
||||||
|
New flow:
|
||||||
|
- resolve export target
|
||||||
|
- collect `MarketRecord[]`
|
||||||
|
- filter records by selection-with-fallback rule
|
||||||
|
- build batch payload from filtered records
|
||||||
|
- submit
|
||||||
|
|
||||||
|
## Filtering Rule
|
||||||
|
|
||||||
|
Given the resolved export records:
|
||||||
|
|
||||||
|
1. Find the subset whose `authorId` exists in the selection set.
|
||||||
|
2. If that subset is non-empty, use it.
|
||||||
|
3. If that subset is empty, use the original resolved records.
|
||||||
|
|
||||||
|
This rule intentionally scopes selection to the chosen export range. For example:
|
||||||
|
|
||||||
|
- If the user selected creators on page 1 and page 3
|
||||||
|
- then exports `当前页` while viewing page 1
|
||||||
|
- only page 1 selected creators are used
|
||||||
|
- page 3 selections remain stored for later exports
|
||||||
|
|
||||||
|
## File Impact
|
||||||
|
|
||||||
|
- Modify: `src/content/market/dom-sync.ts`
|
||||||
|
- checkbox column insertion
|
||||||
|
- row and header checkbox lookup
|
||||||
|
- checkbox state sync helpers
|
||||||
|
- Modify: `src/content/market/index.ts`
|
||||||
|
- selection state storage
|
||||||
|
- event handling
|
||||||
|
- export and batch record filtering
|
||||||
|
- Modify: `src/content/market/types.ts`
|
||||||
|
- minimal DOM type additions if needed
|
||||||
|
- Test: `tests/market-dom-sync.test.ts`
|
||||||
|
- checkbox column rendering
|
||||||
|
- header checkbox presence
|
||||||
|
- Test: `tests/market-content-entry.test.ts`
|
||||||
|
- row selection
|
||||||
|
- current page header select all
|
||||||
|
- cross-page selection persistence
|
||||||
|
- export fallback when no selected creators are inside the resolved range
|
||||||
|
- export filtering when selected creators exist in the resolved range
|
||||||
|
- batch submit uses the same filtered set
|
||||||
|
|
||||||
|
## Risks and Mitigations
|
||||||
|
|
||||||
|
### Risk: Selection breaks after reordering
|
||||||
|
|
||||||
|
Mitigation:
|
||||||
|
- key selection only by `authorId`
|
||||||
|
- never key by row index or DOM order
|
||||||
|
|
||||||
|
### Risk: Header checkbox selects hidden or unloaded rows
|
||||||
|
|
||||||
|
Mitigation:
|
||||||
|
- limit header checkbox operations to current page visible row DOMs only
|
||||||
|
|
||||||
|
### Risk: User expects selection to always override export range
|
||||||
|
|
||||||
|
Mitigation:
|
||||||
|
- keep selection constrained to the resolved export range
|
||||||
|
- preserve current range selector semantics
|
||||||
|
|
||||||
|
### Risk: Selection UI adds visual clutter
|
||||||
|
|
||||||
|
Mitigation:
|
||||||
|
- use a narrow first column
|
||||||
|
- follow the host page checkbox look and spacing as closely as practical
|
||||||
|
|
||||||
|
## Out of Scope
|
||||||
|
|
||||||
|
- Bulk actions beyond export and batch submit
|
||||||
|
- Selection persistence across browser reloads
|
||||||
|
- Dedicated “selected only” mode in the toolbar
|
||||||
|
- Server-side storage of selected creators
|
||||||
Loading…
x
Reference in New Issue
Block a user