@zeroman.yang/react-auto-components 0.1.1 → 0.1.3

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 (106) hide show
  1. package/README.md +17 -3
  2. package/dist/adapters/xlsx.d.ts +7 -1
  3. package/dist/components/AutoChat/types.d.ts +7 -0
  4. package/dist/components/AutoDialog/index.d.ts +15 -0
  5. package/dist/components/AutoForm/types.d.ts +28 -0
  6. package/dist/components/AutoMenu/index.d.ts +7 -0
  7. package/dist/components/AutoSearch/index.d.ts +40 -0
  8. package/dist/components/AutoTable/registry.d.ts +8 -0
  9. package/dist/components/AutoTable/types.d.ts +69 -3
  10. package/dist/components/AutoTabs/index.d.ts +21 -2
  11. package/dist/components/AutoTabs/useAutoTabsWorkspace.d.ts +65 -0
  12. package/dist/core/AutoConfigProvider.d.ts +27 -0
  13. package/dist/core/config.d.ts +6 -1
  14. package/dist/core/dev.d.ts +27 -0
  15. package/dist/core/errors.d.ts +20 -0
  16. package/dist/core/query.d.ts +9 -0
  17. package/dist/core/registry.d.ts +33 -0
  18. package/dist/core/testid.d.ts +5 -0
  19. package/dist/core/types.d.ts +320 -17
  20. package/dist/errors-BT5WUIOV.js +28 -0
  21. package/dist/index.d.ts +4 -1
  22. package/dist/index.js +1889 -1465
  23. package/dist/style.css +1 -1
  24. package/dist/xlsx.js +13 -6
  25. package/docs/auto-dialog.md +64 -0
  26. package/docs/auto-form.md +64 -0
  27. package/docs/auto-menu.md +47 -0
  28. package/docs/auto-search.md +60 -0
  29. package/docs/auto-table.md +144 -0
  30. package/docs/auto-tabs.md +99 -0
  31. package/docs/errors.md +118 -0
  32. package/docs/i18n/de/README.md +8 -2
  33. package/docs/i18n/de/auto-dialog.md +23 -0
  34. package/docs/i18n/de/auto-form.md +35 -0
  35. package/docs/i18n/de/auto-menu.md +23 -0
  36. package/docs/i18n/de/auto-search.md +32 -0
  37. package/docs/i18n/de/auto-table.md +31 -0
  38. package/docs/i18n/de/auto-tabs.md +25 -0
  39. package/docs/i18n/de/errors.md +110 -0
  40. package/docs/i18n/es/README.md +8 -2
  41. package/docs/i18n/es/auto-dialog.md +23 -0
  42. package/docs/i18n/es/auto-form.md +35 -0
  43. package/docs/i18n/es/auto-menu.md +23 -0
  44. package/docs/i18n/es/auto-search.md +32 -0
  45. package/docs/i18n/es/auto-table.md +31 -0
  46. package/docs/i18n/es/auto-tabs.md +25 -0
  47. package/docs/i18n/es/errors.md +110 -0
  48. package/docs/i18n/fr/README.md +8 -2
  49. package/docs/i18n/fr/auto-dialog.md +23 -0
  50. package/docs/i18n/fr/auto-form.md +35 -0
  51. package/docs/i18n/fr/auto-menu.md +23 -0
  52. package/docs/i18n/fr/auto-search.md +32 -0
  53. package/docs/i18n/fr/auto-table.md +31 -0
  54. package/docs/i18n/fr/auto-tabs.md +25 -0
  55. package/docs/i18n/fr/errors.md +110 -0
  56. package/docs/i18n/ja/README.md +8 -2
  57. package/docs/i18n/ja/auto-dialog.md +23 -0
  58. package/docs/i18n/ja/auto-form.md +36 -0
  59. package/docs/i18n/ja/auto-menu.md +23 -0
  60. package/docs/i18n/ja/auto-search.md +34 -0
  61. package/docs/i18n/ja/auto-table.md +31 -0
  62. package/docs/i18n/ja/auto-tabs.md +25 -0
  63. package/docs/i18n/ja/errors.md +110 -0
  64. package/docs/i18n/ko/README.md +8 -2
  65. package/docs/i18n/ko/auto-dialog.md +23 -0
  66. package/docs/i18n/ko/auto-form.md +35 -0
  67. package/docs/i18n/ko/auto-menu.md +23 -0
  68. package/docs/i18n/ko/auto-search.md +32 -0
  69. package/docs/i18n/ko/auto-table.md +31 -0
  70. package/docs/i18n/ko/auto-tabs.md +25 -0
  71. package/docs/i18n/ko/errors.md +110 -0
  72. package/docs/i18n/pt-BR/README.md +8 -2
  73. package/docs/i18n/pt-BR/auto-dialog.md +23 -0
  74. package/docs/i18n/pt-BR/auto-form.md +35 -0
  75. package/docs/i18n/pt-BR/auto-menu.md +23 -0
  76. package/docs/i18n/pt-BR/auto-search.md +32 -0
  77. package/docs/i18n/pt-BR/auto-table.md +31 -0
  78. package/docs/i18n/pt-BR/auto-tabs.md +25 -0
  79. package/docs/i18n/pt-BR/errors.md +110 -0
  80. package/docs/i18n/ru/README.md +8 -2
  81. package/docs/i18n/ru/auto-dialog.md +23 -0
  82. package/docs/i18n/ru/auto-form.md +35 -0
  83. package/docs/i18n/ru/auto-menu.md +23 -0
  84. package/docs/i18n/ru/auto-search.md +32 -0
  85. package/docs/i18n/ru/auto-table.md +31 -0
  86. package/docs/i18n/ru/auto-tabs.md +25 -0
  87. package/docs/i18n/ru/errors.md +110 -0
  88. package/docs/i18n/zh-CN/README.md +8 -2
  89. package/docs/i18n/zh-CN/auto-dialog.md +64 -0
  90. package/docs/i18n/zh-CN/auto-form.md +62 -0
  91. package/docs/i18n/zh-CN/auto-menu.md +47 -0
  92. package/docs/i18n/zh-CN/auto-search.md +55 -0
  93. package/docs/i18n/zh-CN/auto-table.md +62 -0
  94. package/docs/i18n/zh-CN/auto-tabs.md +99 -0
  95. package/docs/i18n/zh-CN/errors.md +112 -0
  96. package/docs/i18n/zh-TW/README.md +8 -2
  97. package/docs/i18n/zh-TW/auto-dialog.md +64 -0
  98. package/docs/i18n/zh-TW/auto-form.md +62 -0
  99. package/docs/i18n/zh-TW/auto-menu.md +47 -0
  100. package/docs/i18n/zh-TW/auto-search.md +55 -0
  101. package/docs/i18n/zh-TW/auto-table.md +62 -0
  102. package/docs/i18n/zh-TW/auto-tabs.md +44 -0
  103. package/docs/i18n/zh-TW/errors.md +112 -0
  104. package/llms.txt +69 -0
  105. package/package.json +18 -2
  106. package/dist/components/AutoSearchPanel/index.d.ts +0 -21
@@ -0,0 +1,62 @@
1
+ # AutoForm
2
+
3
+ [English](../../auto-form.md) | [简体中文](../zh-CN/auto-form.md) | **繁體中文** | [日本語](../ja/auto-form.md) | [한국어](../ko/auto-form.md) | [Español](../es/auto-form.md) | [Français](../fr/auto-form.md) | [Deutsch](../de/auto-form.md) | [Português (Brasil)](../pt-BR/auto-form.md) | [Русский](../ru/auto-form.md)
4
+
5
+ 按 schema 渲染的表單。控制元件、校驗和提交都在這裡。`AutoSearch` 和 `AutoDialog` 內部也渲染 `AutoForm`,所以下面的回撥規則對它們同樣有效。
6
+
7
+ `Field<T>` 按 `type` 做判別聯合。`select` 不給 `options`、`daterange` 配標量、標量欄位上寫 `match: "between"`,都是 TypeScript 錯誤。`AnyField` 和 `unsafeField()` 是逃生艙;開發模式仍會警告。錯誤碼見 [errors.md](errors.md)。
8
+
9
+ ## 用法
10
+
11
+ ```tsx
12
+ import { AutoForm, type Field } from "@zeroman.yang/react-auto-components";
13
+ import "@zeroman.yang/react-auto-components/style.css";
14
+
15
+ type Draft = { name: string; status: string };
16
+ const fields: Field<Draft>[] = [
17
+ { name: "name", label: "姓名", required: true },
18
+ {
19
+ name: "status",
20
+ type: "select",
21
+ label: "狀態",
22
+ options: [{ value: "open", label: "進行中" }],
23
+ },
24
+ ];
25
+
26
+ <AutoForm<Draft> fields={fields} onSubmit={async (value) => save(value)} />
27
+ ```
28
+
29
+ ## 行為與屬性
30
+
31
+ | 屬性 | 行為 |
32
+ | --- | --- |
33
+ | `fields` | `readonly Field<T>[]`。不寫 `type` 就是文本框。`name` 重複會在掛載時拋 `RAC-FIELD-DUPLICATE`。 |
34
+ | `value` | 受控值。與內部狀態不同時,表單會抄過來並清空錯誤。父元件不理 `onChange`,輸入會彈回。 |
35
+ | `defaultValue` | 非受控初值,也是重置目標。欄位自己的 `defaultValue` 補上沒寫的鍵。用 `structuredClone` 複製。 |
36
+ | `onChange` | 每次接受的修改都會呼叫,包括欄位 `onChange` 返回的補丁。 |
37
+ | `onSubmit(value)` | 只在校驗通過後呼叫。resolve 即結束。**reject 或 throw:值保留,操作區下方顯示 `error.message`,不會重置。** |
38
+ | `onReset` | 點重置或呼叫 `handle.reset()` 之後觸發。 |
39
+ | `disabled` | 禁止編輯和提交。預設 `false`。 |
40
+ | `readOnly` | 只顯示值,不渲染輸入框。預設 `false`。 |
41
+ | `columns` | 柵格列數。預設 `2`。`span` 不會超過它。`lineBreak` 獨佔一行。 |
42
+ | `actions` | 內建提交和重置。預設 `true`。父元件自己畫按鈕時設為 `false`(搜尋和彈窗就是這樣)。 |
43
+ | `submitLabel`、`resetLabel` | 替換內建文案。預設文案經 `config.t` 翻譯。 |
44
+ | 標籤 | `labelPosition` 預設 `"top"`。`labelWidth` 預設 `"auto"`(測量後,最多佔欄位寬度的 45%)。`size` 和 `density` 回落到 `AutoConfigProvider`。 |
45
+
46
+ ## 回撥拋錯之後
47
+
48
+ | 回撥 | 結果 |
49
+ | --- | --- |
50
+ | `onSubmit` | 被捕獲。草稿保留。顯示訊息。不重置。 |
51
+ | 欄位 `rules` | 按欄位捕獲。丟擲的訊息變成該欄位的錯誤。後面的規則不再跑。 |
52
+ | 欄位 `onChange` | 不捕獲。表單仍是上一次的值,這次按鍵不會寫入。 |
53
+ | `upload` | 拒絕後,錯誤顯示在檔案框下面,不寫入值。`reset()` 會 abort `AbortSignal`,遲到的結果被丟掉。 |
54
+ | 上傳未完成就提交 | `validate()` 返回 `false`,並顯示「請等待上傳」的內建文案。不會呼叫 `onSubmit`。 |
55
+ | `hidden`、`disabled` 或 `canAccess` 不通過 | 該欄位不參與校驗,即使 `required`。 |
56
+ | `required` 為空 | `undefined`、`null`、`""` 或空陣列會擋住提交。文案是 `"{label} is required"`,再走 `config.t`。 |
57
+
58
+ `handle.validate()` resolve `true` 或 `false`,不拋錯。`handle.reset()` 清錯誤和上傳狀態。
59
+
60
+ ## 前置條件
61
+
62
+ 入口引入一次 `style.css`。開發模式讀不到 `--auto-text` 時警告 `RAC-CSS-MISSING`。`AutoConfigProvider` 可選,用來提供標籤佈局、尺寸、密度、`t`、`canAccess` 和儲存。它不提供彈窗。
@@ -0,0 +1,47 @@
1
+ # AutoMenu
2
+
3
+ [English](../../auto-menu.md) | [简体中文](../zh-CN/auto-menu.md) | **繁體中文** | [日本語](../ja/auto-menu.md) | [한국어](../ko/auto-menu.md) | [Español](../es/auto-menu.md) | [Français](../fr/auto-menu.md) | [Deutsch](../de/auto-menu.md) | [Português (Brasil)](../pt-BR/auto-menu.md) | [Русский](../ru/auto-menu.md)
4
+
5
+ 側欄。條目可以巢狀、收成圖示軌,並帶圖示、說明和徽章。它是導航,不是標籤面板。面板用 [AutoTabs](auto-tabs.md)。
6
+
7
+ ## 用法
8
+
9
+ ```tsx
10
+ import { AutoMenu } from "@zeroman.yang/react-auto-components";
11
+ import "@zeroman.yang/react-auto-components/style.css";
12
+
13
+ <AutoMenu
14
+ label="主導航"
15
+ items={[
16
+ { id: "inbox", label: "收件箱" },
17
+ {
18
+ id: "settings",
19
+ label: "設定",
20
+ children: [{ id: "profile", label: "資料" }],
21
+ },
22
+ ]}
23
+ onChange={(id) => navigate(id)}
24
+ />
25
+ ```
26
+
27
+ ## 行為與屬性
28
+
29
+ | 屬性 | 行為 |
30
+ | --- | --- |
31
+ | `items` | `id` 在整棵樹裡唯一。`hidden` 和 `canAccess` 不通過的條目會被丟掉。`children` 如果指回祖先,整支會被丟掉,避免壞 schema 無限遞迴。 |
32
+ | `value` | 受控的選中葉子 id。省略則選擇留在元件內部。 |
33
+ | `defaultValue` | 非受控的初始葉子。對不上葉子時,選中第一個可用葉子。 |
34
+ | `onChange(id, item, path)` | **不捕獲。** `path` 是從根到葉子的 id 鏈。有 `children` 的父項只切換展開,不選中。 |
35
+ | `collapsible` | 預設 `false`。為 `true` 時,按鈕可以收成圖示軌。 |
36
+ | `collapsed` | 受控的圖示軌。省略則用 `defaultCollapsed`(預設 `false`)。 |
37
+ | `onCollapsedChange` | **不捕獲。** 引數是下一個布林值。如果 `collapsed` 受控,你不更新它,圖示軌就不會動。 |
38
+ | `disabled` | 停用該項及其子孫。選擇時會跳過停用項。 |
39
+ | `label` | 分組標題,也是導航的無障礙名稱。 |
40
+ | `header`、`footer` | 列表上下的插槽。 |
41
+ | `size`、`density` | 覆蓋 provider。選單先讀 `config.menu`,再讀全域性尺寸和密度。 |
42
+
43
+ 鍵盤移動留在選單內。選中葉子本身不會跳轉;只有 `onChange` 是訊號。
44
+
45
+ ## 前置條件
46
+
47
+ 入口引入一次 `style.css`(開發模式 `RAC-CSS-MISSING`)。`AutoConfigProvider` 可選。許可權走 `config.canAccess`。
@@ -0,0 +1,55 @@
1
+ # AutoSearch
2
+
3
+ [English](../../auto-search.md) | [简体中文](../zh-CN/auto-search.md) | **繁體中文** | [日本語](../ja/auto-search.md) | [한국어](../ko/auto-search.md) | [Español](../es/auto-search.md) | [Français](../fr/auto-search.md) | [Deutsch](../de/auto-search.md) | [Português (Brasil)](../pt-BR/auto-search.md) | [Русский](../ru/auto-search.md)
4
+
5
+ 搜尋表單。內部渲染 `AutoForm`,同時給出 `QueryNode` 和原始值。欄位規則,包括拋錯後的行為,與 [AutoForm](auto-form.md) 相同。
6
+
7
+ `AutoSearchPanel` 與 `AutoSearchPanelProps` 是 `AutoSearch` 和 `AutoSearchProps` 的已棄用別名。
8
+
9
+ ## 用法
10
+
11
+ ```tsx
12
+ import { AutoSearch } from "@zeroman.yang/react-auto-components";
13
+ import "@zeroman.yang/react-auto-components/style.css";
14
+
15
+ <AutoSearch
16
+ fields={[
17
+ { name: "name", label: "名稱", match: "contains" },
18
+ { name: "period", type: "daterange", label: "週期", match: "between" },
19
+ ]}
20
+ onSearch={(query, values) => load(query, values)}
21
+ />
22
+ ```
23
+
24
+ `type` 為 `daterange` 或 `match` 為 `"between"` 時,模型欄位必須是兩項元組。
25
+
26
+ ## 行為與屬性
27
+
28
+ | 屬性 | 行為 |
29
+ | --- | --- |
30
+ | `fields` | 與 AutoForm 相同的 `Field<T>`。`more: true` 的欄位在展開「更多」之前隱藏。隱藏欄位不進入查詢。 |
31
+ | `onSearch(query, values)` | 必填。**throw 或 reject:內部表單捕獲它,值保留,顯示 `error.message`。不會因此重置。** |
32
+ | `onChange` | 編輯和重置都會觸發。即時搜尋時,它發生在 `onSearch` 之前。 |
33
+ | `mode` | 預設 `"manual"`:點搜尋才查。`"instant"` 每次修改也查。 |
34
+ | `value`、`defaultValue` | 受控和重置規則與 AutoForm 相同。 |
35
+ | `columns` | 預設 `3`。 |
36
+ | `sortTags` | 你自己的按鈕。`onRemove` 不捕獲。 |
37
+ | 標籤屬性 | 與 AutoForm 相同。傳入的佈局優先於 provider。 |
38
+
39
+ ## 查詢值
40
+
41
+ | `match` | 值 |
42
+ | --- | --- |
43
+ | 省略 | `"eq"`;值是陣列時為 `"in"`。 |
44
+ | `"contains"` | 子串。`ignoreCase: true` 忽略大小寫。 |
45
+ | `"between"` | `[from, to]`。標量會警告 `RAC-FIELD-BETWEEN`,並且匹配不到行。 |
46
+ | `"isNull"` | 匹配 null 或 undefined。輸入的值被忽略。 |
47
+ | 空值 | `undefined`、`null`、`""` 和空陣列會被省略,`"isNull"` 除外。 |
48
+
49
+ `includeNull: true` 會再 OR 一個 `isNull`。`searchFields` 把同一次比較 OR 到這些行欄位上,而不是只用 `name`。
50
+
51
+ 重置會恢復 `defaultValue`,然後立刻搜尋。欄位名不符合 `/^[\w.]+$/` 時,`serializeRsql` 拋 `RAC-QUERY-FIELD`。
52
+
53
+ ## 前置條件
54
+
55
+ 入口引入一次 `style.css`(開發模式 `RAC-CSS-MISSING`)。`AutoConfigProvider` 可選,只提供佈局、翻譯和許可權。
@@ -0,0 +1,62 @@
1
+ # AutoTable
2
+
3
+ [English](../../auto-table.md) | [简体中文](../zh-CN/auto-table.md) | **繁體中文** | [日本語](../ja/auto-table.md) | [한국어](../ko/auto-table.md) | [Español](../es/auto-table.md) | [Français](../fr/auto-table.md) | [Deutsch](../de/auto-table.md) | [Português (Brasil)](../pt-BR/auto-table.md) | [Русский](../ru/auto-table.md)
4
+
5
+ 本地或遠端資料的表格,帶排序、篩選、選擇、可選虛擬滾動,以及增刪改彈窗。搜尋欄位遵循 [AutoSearch](auto-search.md)。新增和編輯彈窗遵循 [AutoDialog](auto-dialog.md) 與 [AutoForm](auto-form.md)。
6
+
7
+ `data`、`dataSource`、`source` 只能提供一個;同時傳入是型別錯誤。
8
+
9
+ ## 用法
10
+
11
+ ```tsx
12
+ import { AutoTable } from "@zeroman.yang/react-auto-components";
13
+ import { exportXlsx } from "@zeroman.yang/react-auto-components/xlsx";
14
+ import "@zeroman.yang/react-auto-components/style.css";
15
+
16
+ <AutoTable
17
+ id="orders"
18
+ rowKey="id"
19
+ data={rows}
20
+ columns={[{ key: "id", label: "編號" }]}
21
+ exportXlsx={exportXlsx}
22
+ />
23
+ ```
24
+
25
+ `exportXlsx` 來自 `@zeroman.yang/react-auto-components/xlsx`,不是主入口。`exceljs` 是可選依賴,缺失時為 `RAC-XLSX-DEP`。
26
+
27
+ ## 行為與屬性
28
+
29
+ | 屬性 | 行為 |
30
+ | --- | --- |
31
+ | `id` | 必填。設定鍵是 `${namespace}:table:${id}`。空 id 警告 `RAC-TABLE-ID`。 |
32
+ | `rowKey` | 欄位名或 `(row) => string`。已載入的行裡必須唯一。缺失或重複警告 `RAC-TABLE-ROWID`。選擇、展開和 `scrollToRow` 都用它。 |
33
+ | `data` | 本地行。篩選和分頁在瀏覽器裡完成。 |
34
+ | `dataSource(query, { signal })` | 遠端分頁。**reject:顯示訊息和重試按鈕。abort 被忽略。** 返回 `{ rows, total }`,`total` 是篩選後的總條數,不是本頁長度。 |
35
+ | `columns` | 省略時用第一行的鍵,跳過 `_auto_*`。列的 `type` 只影響格式化,不是表單控制元件。 |
36
+ | `pageSize` | 預設 `10`。`pagination` 預設 `true`。 |
37
+ | `height` | 預設 `440` 畫素。`"auto"` 填滿已經有高度的父元素。 |
38
+ | `virtual` | 可選。用 TanStack Virtual 測量行高。 |
39
+ | `query`、`onQueryChange` | 受控查詢。省略則頁碼、排序和篩選留在表格內(排序和篩選也跟隨已儲存的方案)。 |
40
+ | `searchFields` | 渲染 `AutoSearch`。它的 `onSearch` 更新表格篩選。 |
41
+ | `formFields` | 新增/編輯彈窗的 schema。省略時,列會變成文本或整數控制元件。 |
42
+ | `onAdd`、`onEdit`、`onDelete` | 校驗通過後由彈窗呼叫。**reject 或 throw:彈窗保持開啟並顯示 `error.message`。除非你的處理函式已經改了資料,否則行不會變。** |
43
+ | `rowActions` | `onClick` 拒絕會被捕捉,並在狀態列顯示約 2.5 秒;資料列不會被移除。 列選單動作缺少 `onClick`,且 `action` 不是已註冊的 `config.rowActions` 鍵時,選取該動作會在狀態列顯示 `RAC-ROW-ACTION`。提供 `onClick` 或註冊對應的 `action`;兩者都有時 `onClick` 優先。 |
44
+ | `component` | 欄的 `component` 未在 `AutoConfigProvider` 的 `config.columns` 中註冊時,開發模式警告 `RAC-COLUMN-COMPONENT`,儲存格使用預設格式。註冊該鍵,或在欄上提供 `render`、`format`、`sort`;欄上的函式優先。 |
45
+ | `source` | `source` 是 `AutoConfigProvider` 的 `config.sources` 中的資料來源鍵。未知鍵會顯示 `RAC-TABLE-SOURCE` 與重試按鈕。註冊該鍵,或改用 `data` / `dataSource`;三者只能提供一個。 |
46
+ | `exportXlsx` | 只有 xlsx 需要。缺少介面卡拋 `RAC-TABLE-XLSX`,狀態行顯示翻譯後的介面卡文案。CSV 和 JSON 是內建的。 |
47
+ | `versions` | 提高 layout、sort、filter 或 export 的版本號,丟掉對應的已存方案。 |
48
+ | `summaryValues` | 篩選結果的服務端合計,按列鍵索引。 |
49
+
50
+ ## 匯出與設定
51
+
52
+ `handle.export(format, scope)` 即使狀態行顯示錯誤也會 resolve,錯誤不會再丟擲。遠端表的 `scope: "filtered"` 會逐頁拉取。最後一頁之前出現空頁會拋 `RAC-TABLE-EXPORT-PAGE`,不會下載半份檔案。
53
+
54
+ 佈局、排序、篩選和匯出預設進 `config.storage`(即 `localStorage`),也可再走 `config.settings`。`settings.save` / `load` 失敗會顯示 "Could not save settings" 和重試按鈕。記憶體中的表格繼續可用。
55
+
56
+ 設定裡的篩選 JSON 不合法時,顯示翻譯後的 "Invalid filter",警告 `RAC-TABLE-FILTER`,並保留上一次篩選。`between` 必須是兩項陣列。`in` 必須是陣列。
57
+
58
+ `handle.reset()` 清排序、篩選、選擇,並把佈局收回列的預設值。`handle.refresh()` 重新請求 `dataSource`。`handle.scrollToRow(id)` 在該 id 未載入時什麼也不做。
59
+
60
+ ## 前置條件
61
+
62
+ 入口引入一次 `style.css`。同一個源上有多個應用要持久化表格時,設定 `AutoConfigProvider` 的 `namespace`;預設是 `"auto"`。內建的新增/編輯彈窗用的是宣告式對話方塊,不需要 `AutoDialogProvider`。只有 `useAutoDialog()` 需要它。
@@ -0,0 +1,44 @@
1
+ # AutoTabs
2
+
3
+ [English](../../auto-tabs.md) | [简体中文](../zh-CN/auto-tabs.md) | **繁體中文** | [日本語](../ja/auto-tabs.md) | [한국어](../ko/auto-tabs.md) | [Español](../es/auto-tabs.md) | [Français](../fr/auto-tabs.md) | [Deutsch](../de/auto-tabs.md) | [Português (Brasil)](../pt-BR/auto-tabs.md) | [Русский](../ru/auto-tabs.md)
4
+
5
+ 標籤頁。巢狀標籤是另一組由 `children` 餵給的 `AutoTabs`,不是選單。側欄用 [AutoMenu](auto-menu.md)。
6
+
7
+ ## 用法
8
+
9
+ ```tsx
10
+ import { AutoTabs } from "@zeroman.yang/react-auto-components";
11
+ import "@zeroman.yang/react-auto-components/style.css";
12
+
13
+ <AutoTabs
14
+ items={[
15
+ { id: "one", label: "其一", content: <p>第一頁</p> },
16
+ { id: "two", label: "其二", content: <p>第二頁</p>, disabled: true },
17
+ ]}
18
+ />
19
+ ```
20
+
21
+ ## 行為與屬性
22
+
23
+ | 屬性 | 行為 |
24
+ | --- | --- |
25
+ | `items` | 每個標籤要有穩定的 `id`。`hidden`(布林或函式)以及 `canAccess` 不通過的標籤會被去掉。 |
26
+ | `value` | 受控路徑,從根開始的 id 列表。巢狀選擇是 `["parent", "child"]`。 |
27
+ | `defaultValue` | 非受控的初始路徑。 |
28
+ | `onChange(path, item)` | **不捕獲。** 拋錯時由 React 報告。受控模式下,你還沒提交的路徑保持上次的值。 |
29
+ | `mode` | 預設 `"horizontal"`。`"vertical"` 把標籤豎排。 |
30
+ | `keepMounted` | 預設 `true`:未選中的面板仍掛載,區域性狀態還在。`false` 會解除安裝它們。 |
31
+ | `onRefresh` | 設定後,該標籤顯示重新整理按鈕。**不捕獲。** |
32
+ | `loading` | 在標籤文字後加省略號。不阻止選擇。 |
33
+ | `size`、`density` | 覆蓋 provider。標籤先讀 `config.tabs`,再讀全域性的 size 和 density。 |
34
+ | `disabled` | 標籤仍可見,但不能選。預設選中會跳過停用標籤。 |
35
+
36
+ 某一項如果有 `children`,就用巢狀標籤代替 `content`。`defaultActive` 是巢狀層的非受控 id。
37
+
38
+ ## 前置條件
39
+
40
+ 入口引入一次 `style.css`(開發模式 `RAC-CSS-MISSING`)。`AutoConfigProvider` 可選。
41
+
42
+ ## 動態標籤
43
+
44
+ `useAutoTabsWorkspace` 在沒有路由器時維護一組頁面。把 `tabsProps` 傳給 `AutoTabs`。同一個 id 再次 `open` 只會切到該標籤並保留草稿。固定標籤不能關閉。等到 `ready` 再呼叫 `open`。選中項、`params` 和 `state` 會在掛載後從 `sessionStorage` 恢復。`beforeClose` 回傳 `false` 或拋錯都會取消關閉。示範見 [AutoTabs 頁](../../../test-project/src/examples/DynamicTabsDemo.tsx)。
@@ -0,0 +1,112 @@
1
+ # 錯誤碼
2
+
3
+ [English](../../errors.md) | [简体中文](../zh-CN/errors.md) | **繁體中文** | [日本語](../ja/errors.md) | [한국어](../ko/errors.md) | [Español](../es/errors.md) | [Français](../fr/errors.md) | [Deutsch](../de/errors.md) | [Português (Brasil)](../pt-BR/errors.md) | [Русский](../ru/errors.md)
4
+
5
+ 開發者錯誤丟擲 `RacError`,或在開發模式 `console.warn`。正文始終是英文:
6
+
7
+ ```text
8
+ [Component] 哪裡錯了。
9
+ Fix: 怎麼改。
10
+ Code: RAC-…
11
+ Docs: https://github.com/Zeroman/react-auto-components/blob/main/docs/errors.md#rac-…
12
+ ```
13
+
14
+ 介面文案仍走 `config.t`。`RacError.userKey` 是英文源句,宿主照舊翻譯。控制台和異常本身保持英文,方便模型按報錯修改。
15
+
16
+ ## RAC-FIELD-OPTIONS
17
+
18
+ `type` 為 `select`、`select-v2`、`radio`、`checkbox` 或 `cascader`,但沒有 `options`,或 `options` 是空陣列。
19
+
20
+ 修復:傳入 `options` 陣列,或 `(values) => Option[]`。`autocomplete` 可以不傳,它是帶可選建議的文本框。
21
+
22
+ ## RAC-FIELD-RANGE
23
+
24
+ `type` 為 `daterange` 或 `datetimerange`,但模型欄位或當前值不是兩項陣列。
25
+
26
+ 修復:把欄位型別寫成 `[start, end]`。`dateValue` 預設 `"string"`(`YYYY-MM-DD`)。`"timestamp"` 存本地時區的毫秒時間戳。`null` 表示該端不限制。
27
+
28
+ 標量字串或數字在 TypeScript 裡直接報錯,錯誤文本含 `RAC-FIELD-RANGE`。模型若是陣列型別則能通過編譯;執行值長度不是 2 時,開發模式會警告。
29
+
30
+ ## RAC-FIELD-BETWEEN
31
+
32
+ `match: "between"` 的模型欄位或當前值不是 `[from, to]`。
33
+
34
+ 修復:存成兩項元組。標量不會命中任何行。`Field<T>` 上這同樣是型別錯誤。
35
+
36
+ ## RAC-FIELD-CUSTOM
37
+
38
+ `type: "custom"` 既沒有 `render` 也沒有 `component`。
39
+
40
+ 修復:傳入 `render(context)`,或把 `component` 設為 `AutoConfigProvider` 的 `config.fields` 裡的鍵。
41
+
42
+ ## RAC-FIELD-DUPLICATE
43
+
44
+ 兩個欄位 `name` 相同。表單掛載時 `defaults` 丟擲。
45
+
46
+ 修復:名字唯一。`title`、`tip`、`append`、`button` 沒有名字,不參與檢查。
47
+
48
+ ## RAC-CSS-MISSING
49
+
50
+ 開發模式在 `:root` 上讀不到 `--auto-text`。樣式表會設定這個變數。沒引入樣式時頁面是亂的,DOM 裡看不出原因。
51
+
52
+ 修復:在應用入口寫一次 `import "@zeroman.yang/react-auto-components/style.css"`。
53
+
54
+ ## RAC-TABLE-XLSX
55
+
56
+ 呼叫了 `export("xlsx")`,但沒有傳 `exportXlsx`。
57
+
58
+ 修復:`import { exportXlsx } from "@zeroman.yang/react-auto-components/xlsx"`,並傳入 `exportXlsx={exportXlsx}`。介面仍顯示翻譯後的 "Configure the XLSX export adapter"。
59
+
60
+ ## RAC-XLSX-DEP
61
+
62
+ xlsx 介面卡載入不到 `exceljs`。它是 `optionalDependency`,普通安裝可能把它跳過。
63
+
64
+ 修復:`pnpm add exceljs`。CSV 和 JSON 不需要它。
65
+
66
+ ## RAC-TABLE-EXPORT-PAGE
67
+
68
+ 遠端匯出時,最後一頁之前出現了空頁,因此沒有儲存檔案。
69
+
70
+ 修復:`total` 要穩定,並且每一頁都返回該 `pageIndex` 的行。介面顯示翻譯後的 "Export data is incomplete. Try again."。
71
+
72
+ ## RAC-TABLE-ROWID
73
+
74
+ 已載入的行裡 `rowKey` 缺失或重複。僅開發警告。
75
+
76
+ 修復:每行要有穩定且唯一的字串。選擇、展開和 `scrollToRow` 都用它。
77
+
78
+ ## RAC-TABLE-ID
79
+
80
+ `AutoTable` 的 `id` 是空的,設定會寫到 `${namespace}:table:`。僅開發警告。
81
+
82
+ 修復:每張表傳一個穩定的 id。
83
+
84
+ ## RAC-COLUMN-COMPONENT
85
+
86
+ 欄的 `component` 未在 `AutoConfigProvider` 的 `config.columns` 中註冊時,開發模式警告 `RAC-COLUMN-COMPONENT`,儲存格使用預設格式。註冊該鍵,或在欄上提供 `render`、`format`、`sort`;欄上的函式優先。
87
+
88
+ ## RAC-ROW-ACTION
89
+
90
+ 列選單動作缺少 `onClick`,且 `action` 不是已註冊的 `config.rowActions` 鍵時,選取該動作會在狀態列顯示 `RAC-ROW-ACTION`。提供 `onClick` 或註冊對應的 `action`;兩者都有時 `onClick` 優先。
91
+
92
+ ## RAC-TABLE-SOURCE
93
+
94
+ `source` 是 `AutoConfigProvider` 的 `config.sources` 中的資料來源鍵。未知鍵會顯示 `RAC-TABLE-SOURCE` 與重試按鈕。註冊該鍵,或改用 `data` / `dataSource`;三者只能提供一個。
95
+
96
+ ## RAC-TABLE-FILTER
97
+
98
+ 設定裡的篩選 JSON 不是合法查詢。介面仍顯示翻譯後的 "Invalid filter",並保留上一次的篩選。
99
+
100
+ 修復:分組是 `{ kind: "group", operator: "and" | "or", children }`。條件是 `{ kind: "condition", field, operator, value }`,`field` 必須是列鍵。`between` 的值是 `[from, to]`。`in` 的值是陣列。
101
+
102
+ ## RAC-QUERY-FIELD
103
+
104
+ `serializeRsql` 拒絕了不符合 `/^[\w.]+$/` 的欄位名。
105
+
106
+ 修復:只用字母、數字、下劃線和點。先重新命名或對映列,再序列化。
107
+
108
+ ## RAC-DIALOG-PROVIDER
109
+
110
+ 在 `AutoDialogProvider` 之外呼叫了 `useAutoDialog()`。
111
+
112
+ 修復:在該樹外包一層 `<AutoDialogProvider>`。`AutoConfigProvider` 不提供彈窗,而且是可選的。宣告式 `<AutoDialog open>` 不用這個 hook。
package/llms.txt ADDED
@@ -0,0 +1,69 @@
1
+ # @zeroman.yang/react-auto-components
2
+
3
+ Schema-driven React 19 components. Read this file first. Behavior, thrown callbacks, and error codes live in the docs below. The README is for people running the demo.
4
+
5
+ ## Docs
6
+
7
+ - Forms and fields: docs/auto-form.md
8
+ - Search (`AutoSearch`) and the query AST: docs/auto-search.md
9
+ - Tables: docs/auto-table.md
10
+ - Dialogs: docs/auto-dialog.md
11
+ - Tabs, including dynamic tabs: docs/auto-tabs.md
12
+ - Menu: docs/auto-menu.md
13
+ - Chat: docs/auto-chat.md
14
+ - Error codes: docs/errors.md
15
+
16
+ Each component doc has a "Behavior and props" table. That table is the callback contract, including what happens when a callback throws. English docs are the source. `docs/i18n/*` mirrors them.
17
+
18
+ ## Contracts
19
+
20
+ - `Field<T>` is a discriminated union. `select` without `options`, a scalar on `daterange` / `datetimerange`, and `match: "between"` on a scalar are TypeScript errors. `AnyField` and `unsafeField()` skip the checks. Development mode still warns.
21
+ - `QueryNode` is a JSON AST: `{ kind: "group", operator, children }` or `{ kind: "condition", field, operator, value }`.
22
+ - Built-in UI strings are English. The same string is the `config.t` key and the fallback.
23
+ - Developer failures throw `RacError`: component, problem, Fix, `Code RAC-…`, and a docs/errors.md anchor. The console message is English. UI copy stays on `userKey`.
24
+
25
+ ## JSON registries
26
+
27
+ Register functions once on `AutoConfigProvider`. A description can then name them with a string.
28
+
29
+ Canonical zero-function-props example (provider registration + pure JSON + source request/response contract): [JSON-driven table](docs/auto-table.md#json-driven-table-zero-function-props).
30
+
31
+ - `Field.component` looks up `config.fields[key]`. `render` wins when both are set. Unknown custom fields warn `RAC-FIELD-CUSTOM`.
32
+ - `AutoColumn.component` looks up `config.columns[key]` for `render`, `format`, `sort`, and `exportFormat`. A function on the column wins. An unknown key warns `RAC-COLUMN-COMPONENT` and the cell uses the default format.
33
+ - `RowAction.action` looks up `config.rowActions[key]` when `onClick` is omitted. `onClick` wins. Neither one warns `RAC-ROW-ACTION` when the item is chosen, and the status shows the message.
34
+ - `AutoTable source` looks up `config.sources[key]`. Pass exactly one of `data`, `dataSource`, or `source`. An unknown key warns `RAC-TABLE-SOURCE` and the table shows that message with retry.
35
+
36
+ `config.fields`, `config.columns`, `config.rowActions`, and `config.sources` merge from nested providers. Later keys win.
37
+
38
+ ## Playwright
39
+
40
+ `data-testid` does not follow `config.t` or the visible label. Scope button ids to `rac-table-{id}` or `rac-dialog` when more than one is on the page.
41
+
42
+ - `rac-field-{name}` is the field wrapper. The control is inside it. The same node has `data-field="{name}"`.
43
+ - `rac-table-{id}` is the table root.
44
+ - Inside a table: `rac-add`, `rac-delete-selected`, `rac-refresh`, `rac-settings`, `rac-export`, `rac-retry`, `rac-edit-{rowId}`, `rac-delete-{rowId}`, `rac-expand-{rowId}`.
45
+ - `rac-search-panel`, `rac-search`, `rac-search-reset`, `rac-more-filters`.
46
+ - `rac-submit` and `rac-reset` are the form actions. Dialog forms hide those and use `rac-ok` and `rac-cancel`.
47
+ - `rac-dialog`, `rac-dialog-close`, `rac-dialog-reset`.
48
+
49
+ ## Deterministic testing
50
+
51
+ For AI self-verification, snapshots, or independent renders, disable persisted table layouts and dialog drafts with a no-op adapter:
52
+
53
+ ```tsx
54
+ const storage = { get: () => undefined, set: () => {}, remove: () => {} };
55
+ const config = { storage, settings: undefined };
56
+ <AutoConfigProvider config={config}><App /></AutoConfigProvider>
57
+ ```
58
+
59
+ Place this provider around the components under test; an inner app provider must not override it. `settings: undefined` also disables an inherited remote table-settings adapter. This isolates persistence only: use fixed data and mock network responses separately when needed.
60
+
61
+ To test draft restoration or saved layouts within one test, inject memory storage instead. Create a fresh map per test and keep the same adapter across that test's rerenders:
62
+
63
+ ```tsx
64
+ const values = new Map<string, unknown>();
65
+ const storage = { get: (key: string) => values.get(key), set: (key: string, value: unknown) => { values.set(key, structuredClone(value)); }, remove: (key: string) => { values.delete(key); } };
66
+ <AutoConfigProvider config={{ storage, settings: undefined }}><App /></AutoConfigProvider>
67
+ ```
68
+
69
+ A browser reload discards this map. Tests that intentionally verify persistence across reloads should keep the default storage and use a fresh browser context per test. `useAutoTabsWorkspace` has separate storage; set its `storage: false` for isolated workspace tests.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@zeroman.yang/react-auto-components",
3
- "version": "0.1.1",
3
+ "version": "0.1.3",
4
4
  "type": "module",
5
5
  "files": [
6
6
  "dist",
@@ -10,7 +10,22 @@
10
10
  "docs/i18n/*/README.md",
11
11
  "docs/i18n/*/migration.md",
12
12
  "docs/auto-chat.md",
13
- "docs/i18n/*/auto-chat.md"
13
+ "docs/auto-form.md",
14
+ "docs/auto-search.md",
15
+ "docs/auto-table.md",
16
+ "docs/auto-dialog.md",
17
+ "docs/auto-tabs.md",
18
+ "docs/auto-menu.md",
19
+ "docs/errors.md",
20
+ "llms.txt",
21
+ "docs/i18n/*/auto-chat.md",
22
+ "docs/i18n/*/auto-form.md",
23
+ "docs/i18n/*/auto-search.md",
24
+ "docs/i18n/*/auto-table.md",
25
+ "docs/i18n/*/auto-dialog.md",
26
+ "docs/i18n/*/auto-tabs.md",
27
+ "docs/i18n/*/auto-menu.md",
28
+ "docs/i18n/*/errors.md"
14
29
  ],
15
30
  "exports": {
16
31
  ".": {
@@ -36,6 +51,7 @@
36
51
  "test": "vitest run",
37
52
  "typecheck": "tsc --noEmit",
38
53
  "check:public": "node scripts/check-public-source.mjs",
54
+ "check:docs": "node scripts/check-docs-i18n.mjs",
39
55
  "test:e2e": "pnpm --dir test-project test",
40
56
  "prepare:test-project": "node scripts/prepare-test-project.mjs",
41
57
  "format": "prettier --write src tests test-project/src test-project/tests *.ts",
@@ -1,21 +0,0 @@
1
- import { type QueryNode } from "../../core/query";
2
- import type { Field, AutoFormLayout } from "../../core/types";
3
- export interface AutoSearchPanelProps<T extends object> extends AutoFormLayout {
4
- fields: readonly Field<T>[];
5
- value?: T;
6
- defaultValue?: Partial<T>;
7
- onChange?: (values: T) => void;
8
- onSearch: (query: QueryNode, values: T) => void;
9
- mode?: "manual" | "instant";
10
- columns?: number;
11
- disabled?: boolean;
12
- searchLabel?: string;
13
- resetLabel?: string;
14
- extraActions?: React.ReactNode;
15
- sortTags?: readonly {
16
- id: string;
17
- label: string;
18
- onRemove: () => void;
19
- }[];
20
- }
21
- export declare function AutoSearchPanel<T extends object>({ fields, value, defaultValue, onChange, onSearch, mode, columns, labelPosition, labelAlign, labelWidth, density: ownDensity, size: ownSize, disabled, searchLabel, resetLabel, extraActions, sortTags, }: AutoSearchPanelProps<T>): import("react").JSX.Element;