rowvia 0.2.4 → 0.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (132) hide show
  1. package/README.md +24 -8
  2. package/dist/fields.css +1 -0
  3. package/dist/fields.es.js +1913 -0
  4. package/dist/fields.umd.cjs +1 -0
  5. package/dist/rowvia.css +1 -1
  6. package/dist/rowvia.es.js +12167 -11319
  7. package/dist/rowvia.umd.cjs +93 -104
  8. package/dist/types/api.d.ts +1 -1
  9. package/dist/types/components/cells.d.ts +25 -0
  10. package/dist/types/components/detailDialog.d.ts +7 -1
  11. package/dist/types/components/scrollbars.d.ts +10 -0
  12. package/dist/types/contracts/work-item.d.ts +339 -0
  13. package/dist/types/core/clientSideRowModel.d.ts +1 -2
  14. package/dist/types/core/columnModel.d.ts +2 -2
  15. package/dist/types/core/gridHost.d.ts +365 -0
  16. package/dist/types/core/remoteRowModels.d.ts +2 -10
  17. package/dist/types/core/rowNode.d.ts +1 -2
  18. package/dist/types/core/valueService.d.ts +1 -1
  19. package/dist/types/createGrid.d.ts +10 -0
  20. package/dist/types/features/chartService.d.ts +2 -11
  21. package/dist/types/features/columnMenu.d.ts +1 -1
  22. package/dist/types/features/contextMenu.d.ts +2 -13
  23. package/dist/types/features/editService.d.ts +3 -8
  24. package/dist/types/features/exportService.d.ts +3 -2
  25. package/dist/types/features/filterGui.d.ts +1 -1
  26. package/dist/types/features/filterService.d.ts +2 -14
  27. package/dist/types/features/findService.d.ts +1 -1
  28. package/dist/types/features/formulaEditor.d.ts +1 -1
  29. package/dist/types/features/notesService.d.ts +1 -5
  30. package/dist/types/features/overlays.d.ts +1 -1
  31. package/dist/types/features/paginationService.d.ts +1 -2
  32. package/dist/types/features/popupService.d.ts +1 -1
  33. package/dist/types/features/rangeSelection.d.ts +1 -8
  34. package/dist/types/features/rowDragService.d.ts +1 -1
  35. package/dist/types/features/rowGroupPanel.d.ts +1 -1
  36. package/dist/types/features/selectionService.d.ts +1 -1
  37. package/dist/types/features/sideBar.d.ts +2 -5
  38. package/dist/types/features/sortService.d.ts +1 -1
  39. package/dist/types/features/statusBar.d.ts +2 -3
  40. package/dist/types/features/undoRedoService.d.ts +2 -9
  41. package/dist/types/fields/attachment-control.d.ts +2 -0
  42. package/dist/types/fields/base-field.d.ts +62 -0
  43. package/dist/types/{pages/work-items → fields}/cascade-control.d.ts +1 -1
  44. package/dist/types/{pages/work-items → fields}/choice-control.d.ts +2 -3
  45. package/dist/types/fields/composite-control.d.ts +3 -0
  46. package/dist/types/fields/controls.d.ts +19 -0
  47. package/dist/types/{pages/work-items → fields}/date-control.d.ts +1 -1
  48. package/dist/types/fields/field-types.d.ts +114 -0
  49. package/dist/types/fields/index.d.ts +8 -0
  50. package/dist/types/fields/internal/dom.d.ts +1 -0
  51. package/dist/types/fields/internal/focus-boundary.d.ts +7 -0
  52. package/dist/types/fields/internal/interaction.d.ts +23 -0
  53. package/dist/types/fields/internal/lifecycle.d.ts +12 -0
  54. package/dist/types/fields/internal/textarea.d.ts +1 -0
  55. package/dist/types/fields/location-control.d.ts +3 -0
  56. package/dist/types/fields/popup.d.ts +38 -0
  57. package/dist/types/{pages/work-items → fields}/rich-control.d.ts +1 -1
  58. package/dist/types/fields/text-control.d.ts +3 -0
  59. package/dist/types/fields/types.d.ts +185 -0
  60. package/dist/types/fields/value-control.d.ts +12 -0
  61. package/dist/types/fields/vote-control.d.ts +2 -0
  62. package/dist/types/forms/form-conditions.d.ts +29 -0
  63. package/dist/types/forms/form-surface.d.ts +13 -0
  64. package/dist/types/gantt/component.d.ts +5 -4
  65. package/dist/types/gantt/ganttChart.d.ts +7 -7
  66. package/dist/types/gantt/index.d.ts +3 -3
  67. package/dist/types/gantt/scale.d.ts +18 -0
  68. package/dist/types/grid.d.ts +21 -17
  69. package/dist/types/index.d.ts +21 -20
  70. package/dist/types/node-flow/canvas.d.ts +26 -0
  71. package/dist/types/node-flow/card.d.ts +23 -0
  72. package/dist/types/node-flow/cardSections.d.ts +14 -0
  73. package/dist/types/node-flow/component.d.ts +9 -0
  74. package/dist/types/node-flow/contextBar.d.ts +20 -0
  75. package/dist/types/node-flow/demo.d.ts +6 -0
  76. package/dist/types/node-flow/index.d.ts +13 -0
  77. package/dist/types/node-flow/model.d.ts +48 -0
  78. package/dist/types/node-flow/timeline.d.ts +16 -0
  79. package/dist/types/node-flow/types.d.ts +220 -0
  80. package/dist/types/personnel/component.d.ts +3 -2
  81. package/dist/types/personnel/index.d.ts +1 -1
  82. package/dist/types/personnel/render.d.ts +22 -0
  83. package/dist/types/render/headerView.d.ts +1 -1
  84. package/dist/types/render/rowComponent.d.ts +29 -0
  85. package/dist/types/render/rowContext.d.ts +39 -0
  86. package/dist/types/render/rowRenderer.d.ts +6 -73
  87. package/dist/types/shared/dom.d.ts +1 -0
  88. package/dist/types/shared/interaction.d.ts +1 -0
  89. package/dist/types/shared/lifecycle.d.ts +1 -0
  90. package/dist/types/shared/markup.d.ts +5 -0
  91. package/dist/types/shared/state.d.ts +5 -0
  92. package/dist/types/types.d.ts +3 -2
  93. package/dist/types/work-items/action-surface.d.ts +17 -0
  94. package/dist/types/work-items/detail/detail-comments.d.ts +44 -0
  95. package/dist/types/work-items/detail/detail-header.d.ts +23 -0
  96. package/dist/types/work-items/detail/detail-history.d.ts +38 -0
  97. package/dist/types/work-items/detail/history-model.d.ts +48 -0
  98. package/dist/types/work-items/fields/control-base.d.ts +17 -0
  99. package/dist/types/{pages/work-items → work-items/fields}/focus-editor.d.ts +1 -1
  100. package/dist/types/work-items/fields/registry.d.ts +5 -0
  101. package/dist/types/work-items/index.d.ts +27 -0
  102. package/dist/types/work-items/layers.d.ts +19 -0
  103. package/dist/types/work-items/model.d.ts +10 -0
  104. package/dist/types/work-items/selection-bar.d.ts +7 -0
  105. package/dist/types/work-items/style-scope.d.ts +1 -0
  106. package/dist/types/work-items/table/column-panels.d.ts +39 -0
  107. package/dist/types/work-items/table/columns.d.ts +28 -0
  108. package/dist/types/work-items/table/headers.d.ts +10 -0
  109. package/dist/types/work-items/table/table.d.ts +10 -0
  110. package/dist/types/work-items/tabs.d.ts +14 -0
  111. package/dist/types/work-items/toolbar.d.ts +11 -0
  112. package/dist/types/work-items/views/rule-panels.d.ts +28 -0
  113. package/dist/types/work-items/workflow-detail-model.d.ts +51 -0
  114. package/dist/types/work-items/workflow-detail-types.d.ts +95 -0
  115. package/dist/types/work-items/workflow-detail.d.ts +3 -0
  116. package/package.json +24 -6
  117. package/dist/types/pages/finance/component.d.ts +0 -2
  118. package/dist/types/pages/finance/data.d.ts +0 -14
  119. package/dist/types/pages/hr/component.d.ts +0 -2
  120. package/dist/types/pages/hr/data.d.ts +0 -21
  121. package/dist/types/pages/index.d.ts +0 -13
  122. package/dist/types/pages/inventory/component.d.ts +0 -2
  123. package/dist/types/pages/inventory/data.d.ts +0 -26
  124. package/dist/types/pages/lifecycle.d.ts +0 -24
  125. package/dist/types/pages/performance/component.d.ts +0 -2
  126. package/dist/types/pages/performance/data.d.ts +0 -33
  127. package/dist/types/pages/server-side/component.d.ts +0 -2
  128. package/dist/types/pages/work-items/config.d.ts +0 -118
  129. package/dist/types/pages/work-items/controls.d.ts +0 -50
  130. package/dist/types/pages/work-items/field-controls.d.ts +0 -4
  131. package/dist/types/pages/work-items/model.d.ts +0 -72
  132. package/dist/types/pages/work-items/page.d.ts +0 -24
@@ -0,0 +1,28 @@
1
+ import type { FieldConfig } from '../../contracts/work-item';
2
+ import { createControlRegistry, type ControlEditor } from "../fields/registry";
3
+ import { type ColorRule, type Field, type ViewState, type WorkItem } from "../model";
4
+ /** Services and state accessors the rule panels borrow from the page host. */
5
+ export interface RulePanelDeps {
6
+ view: () => ViewState;
7
+ fields: [string, string][];
8
+ fieldConfig: (key: string) => FieldConfig | undefined;
9
+ options: Record<string, string[]>;
10
+ controls: ReturnType<typeof createControlRegistry>;
11
+ newItem: () => WorkItem;
12
+ fieldPicker: (anchor: HTMLElement, onSelect: (field: Field) => void, settings?: {
13
+ available?: (field: Field) => boolean;
14
+ onCreate?: () => void;
15
+ }) => void;
16
+ showPopup: (anchor: HTMLElement, title: string, content: string, width?: number, className?: string) => HTMLElement;
17
+ applyView: () => void;
18
+ popup: () => HTMLElement | null;
19
+ getPopupEditor: () => ControlEditor | null;
20
+ setPopupEditor: (editor: ControlEditor | null) => void;
21
+ setActiveRulePanel: (name: string) => void;
22
+ }
23
+ /** Filter / sort / group / color condition panels, extracted from the page factory. */
24
+ export declare function createRulePanels(deps: RulePanelDeps): {
25
+ colorRuleMatches: (item: WorkItem, rule: ColorRule) => boolean;
26
+ colorPanel: (anchor: HTMLElement) => void;
27
+ rulePanel: (kind: string, anchor: HTMLElement) => void;
28
+ };
@@ -0,0 +1,51 @@
1
+ import type { FlowDefinition, FlowNode } from '../node-flow/types';
2
+ /** demand_fetch 的 modules / biz_data / ui_data 在 demo 中的轻量投影。
3
+ * 配置控制区域与字段,FlowNode 只提供实例值;不依赖 node-flow 组件。 */
4
+ export declare function projectWorkflowDetail(flow: FlowDefinition): {
5
+ controls: {
6
+ roles: {
7
+ id: string;
8
+ label: string;
9
+ color?: string;
10
+ nodeIds?: string[];
11
+ enabled?: boolean;
12
+ tooltip?: string;
13
+ }[];
14
+ switches: {
15
+ id: string;
16
+ label: string;
17
+ checked: boolean;
18
+ nodeIds?: string[];
19
+ }[];
20
+ };
21
+ graph: {
22
+ nodes: FlowNode[];
23
+ edges: {
24
+ from: string;
25
+ to: string;
26
+ }[];
27
+ };
28
+ nodeList: FlowNode[];
29
+ node: (node: FlowNode) => {
30
+ data: FlowNode;
31
+ form: import("..").FormItem[];
32
+ fields: {
33
+ key: "owner" | "schedule" | "estimate";
34
+ label: string;
35
+ }[];
36
+ sections: ("form" | "tasks")[];
37
+ completeLabel: string;
38
+ deletable: boolean;
39
+ };
40
+ };
41
+ /** 按实际依赖拓扑分列,不根据阶段名猜测连线。 */
42
+ export declare function layoutWorkflowGraph(graph: ReturnType<typeof projectWorkflowDetail>['graph']): {
43
+ nodes: {
44
+ node: FlowNode;
45
+ x: number;
46
+ y: number;
47
+ width: number;
48
+ }[];
49
+ paths: string[];
50
+ width: number;
51
+ };
@@ -0,0 +1,95 @@
1
+ import type { CustomButton, FlowDefinition, FlowNode, FormItem, NodeField, SubTask } from '../node-flow/types';
2
+ export type WorkflowDetailCommand = {
3
+ type: 'update-node';
4
+ nodeId: string;
5
+ patch: Partial<FlowNode>;
6
+ detail: string;
7
+ } | {
8
+ type: 'delete-node';
9
+ nodeId: string;
10
+ } | {
11
+ type: 'update-flow';
12
+ detail: NonNullable<FlowDefinition['detail']>;
13
+ } | {
14
+ type: 'action';
15
+ nodeId: string;
16
+ actionId: string;
17
+ };
18
+ export type WorkflowDetailPermission = 'edit' | 'complete' | 'delete' | 'create-task' | 'toggle-task' | 'configure' | 'action';
19
+ export interface WorkflowDetailRenderContext {
20
+ node: FlowNode;
21
+ surface: 'selected' | 'list';
22
+ readonly: boolean;
23
+ pending: boolean;
24
+ signal: AbortSignal;
25
+ context: WorkflowDetailContext;
26
+ can(permission: WorkflowDetailPermission, key?: string): boolean;
27
+ commit(patch: Partial<FlowNode>, detail?: string): Promise<boolean>;
28
+ action(actionId: string): Promise<boolean>;
29
+ }
30
+ export interface WorkflowDetailContext {
31
+ currentUser?: string;
32
+ people?: {
33
+ id: string;
34
+ name: string;
35
+ }[];
36
+ workItems?: {
37
+ id: string;
38
+ name: string;
39
+ }[];
40
+ }
41
+ export type WorkflowDetailResult = FlowDefinition | void | Promise<FlowDefinition | void>;
42
+ export interface WorkflowDetailCallbackContext {
43
+ flow: FlowDefinition;
44
+ signal: AbortSignal;
45
+ }
46
+ export interface WorkflowDetailOptions {
47
+ flow: FlowDefinition;
48
+ selectedNodeId?: string;
49
+ currentUser?: string;
50
+ workItems?: {
51
+ id: string;
52
+ name: string;
53
+ }[];
54
+ readonly?: boolean;
55
+ context?: WorkflowDetailContext;
56
+ can?: (permission: WorkflowDetailPermission, node?: FlowNode, key?: string) => boolean;
57
+ onChange?: (nodeId: string, patch: Partial<FlowNode>, detail: string, context: WorkflowDetailCallbackContext) => WorkflowDetailResult;
58
+ onComplete?: (nodeId: string, context: WorkflowDetailCallbackContext) => WorkflowDetailResult;
59
+ onAction?: (nodeId: string, actionId: string, context: WorkflowDetailCallbackContext) => WorkflowDetailResult;
60
+ onDelete?: (nodeId: string, context: WorkflowDetailCallbackContext) => WorkflowDetailResult;
61
+ onFlowChange?: (detail: NonNullable<FlowDefinition['detail']>, context: WorkflowDetailCallbackContext) => WorkflowDetailResult;
62
+ onCreateTask?: (nodeId: string, context: WorkflowDetailCallbackContext) => WorkflowDetailResult;
63
+ taskColumns?: (node: FlowNode) => {
64
+ key: string;
65
+ label: string;
66
+ }[];
67
+ renderTaskField?: (host: HTMLElement, task: SubTask, column: {
68
+ key: string;
69
+ label: string;
70
+ }, context: WorkflowDetailRenderContext) => void | (() => void);
71
+ onCommand?: (command: WorkflowDetailCommand, context: {
72
+ flow: FlowDefinition;
73
+ signal: AbortSignal;
74
+ }) => FlowDefinition | void | Promise<FlowDefinition | void>;
75
+ onError?: (error: unknown, command: WorkflowDetailCommand) => void;
76
+ onSelectNode?: (nodeId: string) => void;
77
+ renderField?: (container: HTMLElement, field: FormItem | NodeField, context: WorkflowDetailRenderContext) => void | (() => void);
78
+ renderSystemField?: (container: HTMLElement, field: {
79
+ key: 'owner' | 'schedule' | 'estimate';
80
+ label: string;
81
+ }, context: WorkflowDetailRenderContext) => void | (() => void);
82
+ renderActions?: (container: HTMLElement, buttons: CustomButton[], context: WorkflowDetailRenderContext) => void | (() => void);
83
+ renderNodeFields?: (node: FlowNode, host: HTMLElement, context: WorkflowDetailRenderContext) => void | (() => void);
84
+ renderNodeForm?: (node: FlowNode, host: HTMLElement, context: WorkflowDetailRenderContext) => void | (() => void);
85
+ }
86
+ export interface WorkflowDetailApi {
87
+ element: HTMLElement;
88
+ nodeListElement: HTMLElement;
89
+ renderNodeDetails(): HTMLElement;
90
+ setFlow(flow: FlowDefinition): void;
91
+ update(options: Partial<WorkflowDetailOptions>): void;
92
+ selectNode(nodeId: string): void;
93
+ getSelectedNode(): FlowNode | undefined;
94
+ destroy(): void;
95
+ }
@@ -0,0 +1,3 @@
1
+ import type { WorkflowDetailApi, WorkflowDetailOptions } from './workflow-detail-types';
2
+ export type * from './workflow-detail-types';
3
+ export declare function createWorkflowDetail(options: WorkflowDetailOptions): WorkflowDetailApi;
package/package.json CHANGED
@@ -1,25 +1,37 @@
1
1
  {
2
2
  "name": "rowvia",
3
- "version": "0.2.4",
3
+ "version": "0.3.1",
4
4
  "description": "零运行时依赖的 TypeScript 数据表格、甘特图与人员排期组件库",
5
5
  "type": "module",
6
6
  "scripts": {
7
7
  "dev": "vite",
8
8
  "build": "npm run build:demo && npm run build:lib",
9
9
  "build:demo": "vite build",
10
- "build:lib": "vite build --config vite.lib.config.ts && npm run build:types",
10
+ "build:lib": "vite build --config vite.lib.config.ts && vite build --config vite.fields.config.ts && npm run build:types",
11
11
  "preview": "vite preview",
12
12
  "typecheck": "tsc --noEmit",
13
- "test": "esbuild src/index.ts --bundle --format=esm --outfile=dist-test/rowvia.mjs --loader:.ts=ts --log-level=error && node test/smoke.mjs && node test/gantt.mjs && node test/personnel.mjs && node test/work-items.mjs && node test/field-controls.mjs",
13
+ "test": "esbuild src/index.ts --bundle --format=esm --outfile=dist-test/rowvia.mjs --loader:.ts=ts --log-level=error && node test/smoke.mjs && node test/gantt.mjs && node test/personnel.mjs && node test/work-items.mjs && node test/fields.mjs && node test/field-controls.mjs && node test/form-surface.mjs && node test/node-flow.mjs && node test/workflow-detail.mjs && node test/detail-comments.mjs && node test/detail-history.mjs && node test/refactor.mjs",
14
14
  "test:work-items": "node test/work-items.mjs",
15
+ "test:node-flow": "node test/node-flow.mjs",
16
+ "test:workflow-detail": "node test/workflow-detail.mjs",
17
+ "test:form-surface": "node test/form-surface.mjs",
15
18
  "build:types": "tsc -p tsconfig.build.json && node scripts/clean-types.mjs",
16
- "prepublishOnly": "npm run typecheck && npm test && npm run build:lib && npm run test:pages",
17
- "test:pages": "node test/pages.mjs"
19
+ "prepublishOnly": "npm run test:architecture && npm run lint && npm test && npm run build:lib && npm run test:pages",
20
+ "test:pages": "node test/pages.mjs",
21
+ "lint": "eslint .",
22
+ "test:architecture": "node scripts/check-dependencies.mjs",
23
+ "check": "npm run test:architecture && npm run typecheck && npm run lint && npm test && npm run build && npm run test:pages",
24
+ "test:comments": "node test/detail-comments.mjs",
25
+ "test:history": "node test/detail-history.mjs"
18
26
  },
19
27
  "devDependencies": {
28
+ "@eslint/js": "^10.0.1",
20
29
  "esbuild": "^0.21.3",
30
+ "eslint": "^10.11.0",
31
+ "globals": "^17.12.0",
21
32
  "jsdom": "^30.1.0",
22
33
  "typescript": "^5.6.0",
34
+ "typescript-eslint": "^8.70.1",
23
35
  "vite": "^5.4.0"
24
36
  },
25
37
  "main": "./dist/rowvia.umd.cjs",
@@ -34,7 +46,13 @@
34
46
  },
35
47
  "./style.css": "./dist/rowvia.css",
36
48
  "./dist/*": "./dist/*",
37
- "./package.json": "./package.json"
49
+ "./package.json": "./package.json",
50
+ "./fields": {
51
+ "types": "./dist/types/fields/index.d.ts",
52
+ "import": "./dist/fields.es.js",
53
+ "require": "./dist/fields.umd.cjs"
54
+ },
55
+ "./fields/style.css": "./dist/fields.css"
38
56
  },
39
57
  "files": [
40
58
  "dist"
@@ -1,2 +0,0 @@
1
- import { type GridPageOptions } from '../lifecycle';
2
- export declare function createFinancePage(container: HTMLElement, options?: GridPageOptions): import("rowvia").GridPageHandle;
@@ -1,14 +0,0 @@
1
- declare function logoFor(ticker: string): string;
2
- export interface Instrument {
3
- ticker: string;
4
- name: string;
5
- instrument: string;
6
- quantity: number;
7
- purchaseDate: string;
8
- purchasePrice: number;
9
- price: number;
10
- timeline: number[];
11
- }
12
- export declare function getData(): Instrument[];
13
- export declare function updateRows(rowData: Instrument[]): void;
14
- export { logoFor };
@@ -1,2 +0,0 @@
1
- import { type GridPageOptions } from '../lifecycle';
2
- export declare function createHrPage(container: HTMLElement, options?: GridPageOptions): import("rowvia").GridPageHandle;
@@ -1,21 +0,0 @@
1
- /** Deterministic pseudo random generator (LCG) so demos render identically. */
2
- export declare function createRandom(seed?: number): () => number;
3
- export declare const DEPARTMENTS: Record<string, string>;
4
- interface EmployeeRecord {
5
- orgHierarchy: string[];
6
- contact: string;
7
- jobTitle: string;
8
- employmentType: string;
9
- department: string;
10
- employeeId: number;
11
- location: string;
12
- joinDate: string;
13
- basicMonthlySalary: number;
14
- currency: string;
15
- paymentMethod: string;
16
- paymentStatus: string;
17
- image: string;
18
- flag: string;
19
- }
20
- export declare function getData(): EmployeeRecord[];
21
- export {};
@@ -1,13 +0,0 @@
1
- export { createFinancePage } from './finance/component';
2
- export { createHrPage } from './hr/component';
3
- export { createInventoryPage } from './inventory/component';
4
- export { createPerformancePage } from './performance/component';
5
- export { createServerSidePage } from './server-side/component';
6
- export type { GridPageOptions, GridPageHandle } from './lifecycle';
7
- export { createWorkItemPage } from './work-items/page';
8
- export { createControlRegistry, sanitizeRichText } from './work-items/controls';
9
- export type { FieldControl, ControlContext, ControlEditor, ControlSurface } from './work-items/controls';
10
- export type { WorkItemPageConfig, FieldConfig, FieldKind, FormConfig, FormFieldConfig } from './work-items/config';
11
- export type { FieldOption, AttachmentValue, VoteValue, FieldServices } from './work-items/config';
12
- export type { WorkItem, ViewState, SavedView, Rule, ColorRule } from './work-items/model';
13
- export { topicDemoConfig, dateDemoConfig } from './work-items/config';
@@ -1,2 +0,0 @@
1
- import { type GridPageOptions } from '../lifecycle';
2
- export declare function createInventoryPage(container: HTMLElement, options?: GridPageOptions): import("rowvia").GridPageHandle;
@@ -1,26 +0,0 @@
1
- /** Inventory demo data: 10 vinyl albums with variant details. */
2
- export interface VariantDetail {
3
- title: string;
4
- available: number;
5
- format: string;
6
- label: string;
7
- cat: string;
8
- country: string;
9
- year: string;
10
- }
11
- export interface Album {
12
- product: string;
13
- artist: string;
14
- category: string;
15
- year: string;
16
- status: 'active' | 'paused' | 'outOfStock';
17
- available: number;
18
- incoming: number;
19
- image: string;
20
- price: number;
21
- sold: number;
22
- priceIncrease: number;
23
- variants: number;
24
- variantDetails: VariantDetail[];
25
- }
26
- export declare function getData(): Album[];
@@ -1,24 +0,0 @@
1
- import type { GridOptions, GridApi, ColumnApi } from '../types';
2
- export interface GridPageOptions {
3
- /** Overrides the demo's columns, data, callbacks or remote datasource. */
4
- gridOptions?: Partial<GridOptions>;
5
- /** Finance sample stream; disable when supplying business data. */
6
- liveUpdates?: boolean;
7
- }
8
- export interface GridPageHandle {
9
- readonly api: GridApi | null;
10
- readonly columnApi: ColumnApi | null;
11
- destroy(): void;
12
- }
13
- export declare function createPageLifecycle(container: HTMLElement, name: string, markup: string, options: GridPageOptions): {
14
- host: HTMLElement;
15
- handle: GridPageHandle;
16
- timeout: (callback: () => void, delay: number) => number;
17
- cleanup(callback: () => void): void;
18
- interval(callback: () => void, delay: number): number;
19
- createGrid(element: HTMLElement, defaults: GridOptions): {
20
- api: GridApi;
21
- columnApi: ColumnApi;
22
- grid: import("../grid").Grid;
23
- };
24
- };
@@ -1,2 +0,0 @@
1
- import { type GridPageOptions } from '../lifecycle';
2
- export declare function createPerformancePage(container: HTMLElement, options?: GridPageOptions): import("rowvia").GridPageHandle;
@@ -1,33 +0,0 @@
1
- /** Performance demo data + column generation. */
2
- export interface RowItem {
3
- name: string;
4
- language: string;
5
- country: string;
6
- game: {
7
- name: string;
8
- bought: boolean;
9
- };
10
- bankBalance: number;
11
- rating: number;
12
- totalWinnings: number;
13
- [month: string]: any;
14
- [key: `col${number}`]: any;
15
- }
16
- export declare const COUNTRY_NAMES: string[];
17
- export declare const LANGUAGES: string[];
18
- export declare const GAMES: string[];
19
- export declare const MONTHS: string[];
20
- /** deterministic LCG so every reload produces identical data */
21
- export declare function createRandom(seed?: number): () => number;
22
- export declare function resetRandom(): void;
23
- export declare function createRowItem(index: number, extraColumnCount: number): RowItem;
24
- export declare function createData(rowCount: number, extraColumnCount: number): RowItem[];
25
- declare const DATA_TYPES: readonly ["currency", "percent", "rating", "text", "number"];
26
- export interface ExtraColumnConfig {
27
- field: string;
28
- group: string;
29
- dataType: (typeof DATA_TYPES)[number];
30
- width: number;
31
- }
32
- export declare function createExtraColumns(count: number): ExtraColumnConfig[];
33
- export {};
@@ -1,2 +0,0 @@
1
- import { type GridPageOptions } from '../lifecycle';
2
- export declare function createServerSidePage(container: HTMLElement, options?: GridPageOptions): import("rowvia").GridPageHandle;
@@ -1,118 +0,0 @@
1
- import type { FieldControl } from "./controls";
2
- import type { ColDef } from "rowvia";
3
- import { type WorkItem } from "./model";
4
- /** Stable identity is separate from the displayed label. Conditions are resolved by the host. */
5
- export interface FieldOption {
6
- id: string;
7
- label: string;
8
- color?: string;
9
- description?: string;
10
- disabled?: boolean;
11
- exclusive?: boolean;
12
- children?: FieldOption[];
13
- }
14
- export interface AttachmentValue {
15
- id: string;
16
- name: string;
17
- url?: string;
18
- size?: number;
19
- }
20
- export interface VoteValue {
21
- selected: string[];
22
- counts: Record<string, number>;
23
- total?: number;
24
- }
25
- /** The host owns authorization, persistence and idempotency. No network is built into controls. */
26
- export interface FieldServices {
27
- searchOptions?: (field: FieldConfig, query: string, signal: AbortSignal) => Promise<FieldOption[]>;
28
- upload?: (field: FieldConfig, files: File[], signal: AbortSignal) => Promise<AttachmentValue[]>;
29
- vote?: (field: FieldConfig, item: WorkItem, selected: string[], signal: AbortSignal) => Promise<VoteValue>;
30
- }
31
- export type FieldKind = (string & {}) | "richText" | "number" | "dateTime" | "detail" | "title" | "text" | "longText" | "multiSelect" | "select" | "status" | "person" | "date" | "vote" | "relation";
32
- export interface FieldConfig {
33
- key: string;
34
- label: string;
35
- kind?: FieldKind;
36
- /** Registered control ID; defaults to the field kind. */
37
- control?: string;
38
- width?: number;
39
- minWidth?: number;
40
- pinned?: "left" | "right" | null;
41
- hidden?: boolean;
42
- editable?: boolean;
43
- required?: boolean;
44
- options?: string[];
45
- choices?: FieldOption[];
46
- placeholder?: string;
47
- maxLength?: number;
48
- numberOptions?: {
49
- min?: number;
50
- max?: number;
51
- step?: number;
52
- decimals?: number;
53
- suffix?: string;
54
- thousandsSeparator?: boolean;
55
- };
56
- attachmentOptions?: {
57
- accept?: string;
58
- maxFiles?: number;
59
- maxBytes?: number;
60
- };
61
- compositeFields?: FieldConfig[];
62
- maxRows?: number;
63
- /** Maximum selected values for multiSelect; omitted means unlimited. */
64
- maxSelections?: number;
65
- /** Calendar features. date hides time by default; dateTime shows it. */
66
- dateOptions?: {
67
- showTime?: boolean;
68
- showRange?: boolean;
69
- showSeconds?: boolean;
70
- };
71
- colors?: Record<string, string>;
72
- defaultValue?: unknown;
73
- column?: Partial<ColDef>;
74
- }
75
- export interface FormFieldConfig {
76
- field: string;
77
- label?: string;
78
- required?: boolean;
79
- editable?: boolean;
80
- }
81
- export interface FormConfig {
82
- fields: FormFieldConfig[];
83
- showRoles?: boolean;
84
- showMeetings?: boolean;
85
- showApproval?: boolean;
86
- showVotes?: boolean;
87
- }
88
- export interface WorkItemPageConfig {
89
- container: HTMLElement;
90
- title: string;
91
- workspace: string;
92
- storageKey: string;
93
- currentUser: string;
94
- fields: FieldConfig[];
95
- createForm: FormConfig;
96
- detailForm: FormConfig;
97
- items: WorkItem[];
98
- controls?: FieldControl[];
99
- fieldServices?: FieldServices;
100
- /** Opt in to browser URL hash integration. Disabled for embedded pages. */
101
- syncLocationHash?: boolean;
102
- onDataChange?: (items: WorkItem[]) => void;
103
- /** Embedded business applications own their data; do not restore browser demo state. */
104
- persistence?: "local" | "none";
105
- showSavedViews?: boolean;
106
- allowCustomFields?: boolean;
107
- canCreate?: boolean;
108
- initialView?: import("./model").ViewState;
109
- onOpenDetail?: (item: WorkItem) => void;
110
- onCreate?: () => void;
111
- onSaveView?: (state: import("./model").ViewState & {
112
- columns: import("rowvia").ColumnState[];
113
- }) => void;
114
- }
115
- /** The table, create form, and detail layout are three independent configurations. */
116
- export declare function topicDemoConfig(container: HTMLElement): WorkItemPageConfig;
117
- /** Deterministic 1,000-row fixture for exercising all three date controls. */
118
- export declare function dateDemoConfig(container: HTMLElement): WorkItemPageConfig;
@@ -1,50 +0,0 @@
1
- export { sanitizeRichText } from './rich-control';
2
- import type { FieldServices, FieldOption } from './config';
3
- import type { FieldConfig } from './config';
4
- import type { WorkItem } from './model';
5
- export type ControlSurface = 'cell' | 'detail' | 'create';
6
- export interface ControlContext {
7
- field: FieldConfig;
8
- value: unknown;
9
- item: WorkItem;
10
- surface: ControlSurface;
11
- readonly: boolean;
12
- openDetail: (id: string) => void;
13
- services?: FieldServices;
14
- /** Host retains labels for remote selections; values still contain stable IDs only. */
15
- onSelectedOptions?: (options: FieldOption[]) => void;
16
- /** Transient hosts can dismiss their popup when the editor withdraws. */
17
- onDeactivate?: () => void;
18
- /** Optional host boundary, e.g. a popup containing its Save/Cancel buttons. */
19
- focusBoundary?: HTMLElement;
20
- }
21
- export interface ControlEditor {
22
- element: HTMLElement;
23
- read: () => unknown;
24
- validate?: () => string | undefined;
25
- focus?: () => void;
26
- destroy?: () => void;
27
- /** Close internal menus/fullscreen without discarding the draft. */
28
- deactivate?: () => void;
29
- }
30
- /** Definitions are scoped to a page. Return fresh DOM for each mount. */
31
- export interface FieldControl {
32
- id: string;
33
- label: string;
34
- description: string;
35
- glyph: string;
36
- action?: 'edit' | 'select' | 'view';
37
- group?: '文本' | '选择' | '人员' | '日期' | '投票' | '其他' | '关联工作项' | '系统';
38
- readonly?: boolean;
39
- example?: {
40
- value: unknown;
41
- field?: Partial<FieldConfig>;
42
- };
43
- render: (context: ControlContext) => HTMLElement;
44
- createEditor: (context: ControlContext) => ControlEditor;
45
- }
46
- export declare function createControlRegistry(custom?: FieldControl[]): {
47
- register: (control: FieldControl) => void;
48
- list: () => FieldControl[];
49
- resolve: (field: FieldConfig) => FieldControl;
50
- };
@@ -1,4 +0,0 @@
1
- import type { FieldControl } from './controls';
2
- import type { FieldConfig } from './config';
3
- export declare function safeLink(value: unknown): string | undefined;
4
- export declare function extendedControls(resolve: (f: FieldConfig) => FieldControl): FieldControl[];
@@ -1,72 +0,0 @@
1
- import type { FieldConfig } from "./config";
2
- export interface WorkItem {
3
- [field: string]: any;
4
- id: string;
5
- name: string;
6
- description: string;
7
- vote: string;
8
- showVotes: string;
9
- status: string;
10
- selectedTopic: string;
11
- format: string | string[];
12
- approved: string;
13
- category: string;
14
- owner: string;
15
- space: string;
16
- created: string;
17
- creator: string;
18
- source: string;
19
- followed: boolean;
20
- starred: boolean;
21
- viewed: boolean;
22
- comments: string[];
23
- history: string[];
24
- }
25
- export declare const fields: readonly [readonly ["name", "选题概要"], readonly ["description", "选题描述"], readonly ["vote", "选题投票"], readonly ["showVotes", "是否展示投票结果"], readonly ["status", "状态"], readonly ["selectedTopic", "确定入选"], readonly ["format", "内容形式"], readonly ["approved", "选题是否通过"], readonly ["category", "主题分类"], readonly ["owner", "当前负责人"], readonly ["space", "所属空间"], readonly ["created", "创建时间"], readonly ["creator", "创建者"]];
26
- export type Field = string;
27
- export declare const statuses: string[];
28
- export declare const categories: string[];
29
- export declare const formats: string[];
30
- export declare const options: Partial<Record<Field, string[]>>;
31
- export interface Rule {
32
- field: Field;
33
- operator: "contains" | "equals" | "notEqual" | "blank" | "notBlank";
34
- value: string;
35
- }
36
- export interface ColorRule extends Rule {
37
- color: string;
38
- scope?: string;
39
- }
40
- export interface ViewState {
41
- filters: Rule[];
42
- sorts: {
43
- colId: string;
44
- sort: "asc" | "desc";
45
- }[];
46
- groups: string[];
47
- colors: ColorRule[];
48
- showTerminated: boolean;
49
- }
50
- export declare const emptyView: () => ViewState;
51
- export declare const storageKey = "rowvia:work-items:v2";
52
- export declare const names: string[];
53
- export declare const seed: WorkItem[];
54
- export declare function matches(item: WorkItem, rules: Rule[]): boolean;
55
- export interface SavedView {
56
- name: string;
57
- state: ViewState;
58
- columns?: unknown;
59
- gridState?: unknown;
60
- tab?: string;
61
- search?: string;
62
- filterSearch?: boolean;
63
- collaborators?: string;
64
- visibility?: string;
65
- inNavigation?: boolean;
66
- }
67
- export declare function loadData(key?: string, initialItems?: WorkItem[]): {
68
- items: WorkItem[];
69
- views: SavedView[];
70
- drafts: WorkItem[];
71
- customFields: FieldConfig[];
72
- };