weaver-e10-builder 1.6.0 → 1.6.4

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 (60) hide show
  1. package/dist/commands/check.d.ts.map +1 -1
  2. package/dist/commands/check.js +109 -51
  3. package/dist/commands/check.js.map +1 -1
  4. package/dist/commands/form-attachment-setting.d.ts +3 -0
  5. package/dist/commands/form-attachment-setting.d.ts.map +1 -0
  6. package/dist/commands/form-attachment-setting.js +422 -0
  7. package/dist/commands/form-attachment-setting.js.map +1 -0
  8. package/dist/commands/form-data.d.ts.map +1 -1
  9. package/dist/commands/form-data.js +49 -1
  10. package/dist/commands/form-data.js.map +1 -1
  11. package/dist/commands/form-field-linkage.d.ts +6 -1
  12. package/dist/commands/form-field-linkage.d.ts.map +1 -1
  13. package/dist/commands/form-field-linkage.js +138 -31
  14. package/dist/commands/form-field-linkage.js.map +1 -1
  15. package/dist/commands/form.d.ts.map +1 -1
  16. package/dist/commands/form.js +47 -2
  17. package/dist/commands/form.js.map +1 -1
  18. package/dist/commands/project.d.ts.map +1 -1
  19. package/dist/commands/project.js +39 -6
  20. package/dist/commands/project.js.map +1 -1
  21. package/dist/services/form-attachment-settings.d.ts +110 -0
  22. package/dist/services/form-attachment-settings.d.ts.map +1 -0
  23. package/dist/services/form-attachment-settings.js +332 -0
  24. package/dist/services/form-attachment-settings.js.map +1 -0
  25. package/dist/services/form-attachment-upload.d.ts +30 -0
  26. package/dist/services/form-attachment-upload.d.ts.map +1 -0
  27. package/dist/services/form-attachment-upload.js +76 -0
  28. package/dist/services/form-attachment-upload.js.map +1 -0
  29. package/dist/services/form-data-openapi.d.ts +2 -0
  30. package/dist/services/form-data-openapi.d.ts.map +1 -1
  31. package/dist/services/form-data-openapi.js +1 -0
  32. package/dist/services/form-data-openapi.js.map +1 -1
  33. package/package.json +1 -1
  34. package/skill-docs/SKILL.md +163 -160
  35. package/skill-docs/_catalog.md +6 -4
  36. package/skill-docs/assets/sample/api/formApi.js +689 -510
  37. package/skill-docs/assets/sample/app/config.js +4 -0
  38. package/skill-docs/assets/sample/app/fields.js +25 -0
  39. package/skill-docs/assets/sample/entry.js +24 -22
  40. package/skill-docs/assets/sample/eslint.config.cjs +1 -0
  41. package/skill-docs/assets/sample/pages/Items.js +247 -0
  42. package/skill-docs/assets/sample/styles/prototypeStyles.js +137 -0
  43. package/skill-docs/references/coding/guide-edit-backfill.md +102 -150
  44. package/skill-docs/references/coding/guide-form-crud.md +195 -172
  45. package/skill-docs/references/coding/guide-html-to-react.md +250 -0
  46. package/skill-docs/references/coding/guide-page-code.md +194 -167
  47. package/skill-docs/references/coding/guide-page-export.md +27 -18
  48. package/skill-docs/references/coding/ref-compile-rules.md +7 -7
  49. package/skill-docs/references/common/map.md +2 -1
  50. package/skill-docs/references/common/ref-cli-commands.md +13 -6
  51. package/skill-docs/references/components/display-FilePreview.md +5 -4
  52. package/skill-docs/references/form/guide-field-linkage.md +4 -1
  53. package/skill-docs/references/form/guide-form-attachment-setting.md +95 -0
  54. package/skill-docs/references/form/guide-form-data.md +22 -1
  55. package/skill-docs/assets/sample/config/config.js +0 -0
  56. package/skill-docs/assets/sample/config/configLoad.js +0 -0
  57. package/skill-docs/assets/sample/config/configLoad_default.js +0 -0
  58. package/skill-docs/assets/sample/config/config_default.js +0 -0
  59. package/skill-docs/assets/sample/memo.md +0 -0
  60. package/skill-docs/assets/sample/readme.js +0 -8
@@ -0,0 +1,250 @@
1
+ # HTML 原型还原成 React
2
+
3
+ > 用户给出 HTML 原型,要求「完整还原页面效果」时使用。目标是把原型的 DOM 和 CSS 原样搬进 Ecode React 页面,不是重新设计一套样式。
4
+ >
5
+ > 本流程不提供本地预览;样式以原型为准,部署后由用户在实际环境验收。
6
+
7
+ ---
8
+
9
+ ## 一、原则
10
+
11
+ 1. **CSS 原样复用**:原型 `<style>` 整段复制进代码,不改规则、不重写、不近似。
12
+ 2. **DOM 结构保留**:class 名、层级、标签尽量不动;React 只接管状态和事件。
13
+ 3. **不建独立 `.css` 文件**:ecode 没有 CSS 模块解析,`import './x.css'` 会静默丢失。
14
+ 4. **不逐条改内联 style**:把 CSS 原文放进字符串,比把每条规则翻译成 `style={{...}}` 更可靠。
15
+ 5. **平台组件只用于必须能力**:人员/部门选择、上传、文件预览;其余用原生 HTML + 原型 CSS。
16
+
17
+ ---
18
+
19
+ ## 二、提取 CSS
20
+
21
+ 原型里的:
22
+
23
+ ```html
24
+ <style>
25
+ .auction-page { ... }
26
+ .auction-card { ... }
27
+ @media (max-width: 900px) { ... }
28
+ </style>
29
+ ```
30
+
31
+ 原样放到 `styles/prototypeStyles.js`:
32
+
33
+ ```js
34
+ export var PROTOTYPE_CSS = `
35
+ .auction-page { ... }
36
+ .auction-card { ... }
37
+ @media (max-width: 900px) { ... }
38
+ `;
39
+ ```
40
+
41
+ 页面壳渲染一次:
42
+
43
+ ```js
44
+ import { PROTOTYPE_CSS } from '../styles/prototypeStyles.js';
45
+
46
+ export default function Page() {
47
+ return (
48
+ <div className="prototype-root">
49
+ <style>{PROTOTYPE_CSS}</style>
50
+ {/* 页面内容 */}
51
+ </div>
52
+ );
53
+ }
54
+ ```
55
+
56
+ 注意:
57
+
58
+ - 不要把 CSS 拆成多个 `.css` 文件。
59
+ - 不要在 JS 里 `import './prototype.css'`。
60
+ - 如果原型有多段 `<style>`,按原顺序拼进同一个字符串。
61
+ - 原型的 `<link rel="stylesheet">` 外部样式:把内容下载后并入字符串;不要保留外链,也不要让平台去 CDN 拉。
62
+
63
+ ---
64
+
65
+ ## 三、收敛全局选择器
66
+
67
+ 原型可能直接写 `body`、`:root`、`*`、全局 `h1`。直接搬进平台会污染平台壳。处理方式:
68
+
69
+ 1. 给页面根加一个唯一类名,例如 `proto-auction`。
70
+ 2. 把 `body` / `:root` / `*` 规则改挂到根类名下,保持视觉等价。
71
+ 3. `:root` 的 CSS 变量移到根类名下。
72
+ 4. `@keyframes` 名称加页面前缀,避免与平台动画重名。
73
+ 5. `!important` 原样保留,不要自行删减。
74
+
75
+ 示例:
76
+
77
+ ```css
78
+ /* 原型 */
79
+ :root { --brand: #c9a227; }
80
+ body { background: #f5f3ef; }
81
+
82
+ /* 页面内 */
83
+ .proto-auction { --brand: #c9a227; background: #f5f3ef; }
84
+ ```
85
+
86
+ 选择器收敛后要逐项核对:背景、字体、颜色、间距不能因为换父级而失效。
87
+
88
+ ---
89
+
90
+ ## 四、浮层 / Portal 与 CSS 作用域
91
+
92
+ 原型 CSS 收敛到 `.xxx-root` 后,**浮层的 DOM 必须仍在根容器内**。React 的 Provider / Portal 很容易把弹窗渲染成根容器的兄弟节点:
93
+
94
+ ```jsx
95
+ // 错误:modal 在 .auction-root 外面,.auction-root .modal 不命中
96
+ <>
97
+ <div className="auction-root"><Shell /></div>
98
+ <OverlayProvider /> {/* Portal 到 body 或兄弟节点 */}
99
+ </>
100
+
101
+ // 正确:把 Provider / Portal 容器放进根节点
102
+ <div className="auction-root">
103
+ <OverlayProvider>
104
+ <Shell />
105
+ </OverlayProvider>
106
+ </div>
107
+ ```
108
+
109
+ 如果平台或第三方 Provider 必须挂到 `body`,就不要把弹窗样式写成 `.root .modal`;改用唯一的全局类(如 `.auction-modal`)并确保它不会和平台样式冲突。**CSS 作用域一旦引入,DOM 层级就是隐式契约。**
110
+
111
+ ---
112
+
113
+ ## 五、HTML → JSX 的机械转换
114
+
115
+ | HTML | JSX |
116
+ |---|---|
117
+ | `class="x"` | `className="x"` |
118
+ | `for="x"` | `htmlFor="x"` |
119
+ | `style="color: red; margin: 8px"` | `style={{ color: 'red', margin: 8 }}` |
120
+ | `onclick="fn()"` | `onClick={fn}` |
121
+ | `<input>` `<img>` `<br>` | 自闭合 `<input />` `<img />` `<br />` |
122
+ | `<!-- 注释 -->` | `{/* 注释 */}` |
123
+ | `data-x="1"` | `data-x="1"`(保留) |
124
+ | `aria-*` | 保留 |
125
+ | `innerHTML` 拼出的列表 | `array.map(...)` + `key` |
126
+
127
+ **保留 class 名和层级**。不要为了“React 化”把 div 换成语义标签、不要重排 DOM、不要改 class 命名,否则原型 CSS 全部失效。
128
+
129
+ ---
130
+
131
+ ## 六、静态 DOM → 组件
132
+
133
+ 原型常见写法:
134
+
135
+ ```js
136
+ function renderCard(item) {
137
+ return `<div class="auction-card">
138
+ <h3>${item.name}</h3>
139
+ <span>${item.price}</span>
140
+ </div>`;
141
+ }
142
+ el.innerHTML = list.map(renderCard).join('');
143
+ ```
144
+
145
+ React 写法:
146
+
147
+ ```js
148
+ function Card(props) {
149
+ return (
150
+ <div className="auction-card">
151
+ <h3>{props.item.name}</h3>
152
+ <span>{props.item.price}</span>
153
+ </div>
154
+ );
155
+ }
156
+
157
+ function List(props) {
158
+ return (
159
+ <div>
160
+ {props.items.map(function (item) {
161
+ return <Card key={item.id} item={item} />;
162
+ })}
163
+ </div>
164
+ );
165
+ }
166
+ ```
167
+
168
+ - 重复块抽成组件,不要保留 `innerHTML` 拼串。
169
+ - 每个列表项必须有稳定 `key`(优先数据 ID,不要用下标)。
170
+ - 不要在组件里 `document.getElementById` / `querySelector` 操作原型 DOM。
171
+ - 弹窗、抽屉、Toast 用 state 控制显示,不要直接改 `style.display`。
172
+
173
+ ---
174
+
175
+ ## 七、状态与交互
176
+
177
+ | 原型行为 | React 做法 |
178
+ |---|---|
179
+ | `onclick` 调全局函数 | 组件内事件处理函数 |
180
+ | 直接改 DOM 文本/class | state + 条件渲染 |
181
+ | 显示/隐藏弹窗 | `var [visible, setVisible] = useState(false)` |
182
+ | 定时器刷新倒计时 | `useEffect` 中 `setInterval`,卸载时 `clearInterval` |
183
+ | 表单输入 | 受控 `value` + `onChange` |
184
+ | 页面切换 | 路由注册,或单页 state;优先路由,方便挂菜单 |
185
+
186
+ `useEffect` 的清理函数必须写,避免页面切换后定时器还在跑。
187
+
188
+ ---
189
+
190
+ ## 八、数据接入
191
+
192
+ 静态原型的数据是写死的,接入时:
193
+
194
+ 1. 用 `formClient` 替换原型里的 seed 数据;字段 ID 来自 `app/fields.js`。
195
+ 2. 列表渲染用 `row.display`,表单回填用 `row.values`,人员/附件用 `row.items`。
196
+ 3. 原型里的 mock 数据可以保留为 `mockData.js`,只用于纯展示页或空态演示;正式页面不要同时保留两套数据源。
197
+ 4. 写操作要有 loading / error / 成功反馈;原型如果只做 toast,保留 toast 的样式和交互。
198
+
199
+ 详细数据规则见 `guide-form-crud.md`。
200
+
201
+ ---
202
+
203
+ ## 九、图片与资源
204
+
205
+ - 原型里的 `<img src="...">`:本地图片放到 `resources/`,代码里写 `${appRes}/文件名`。
206
+ - data URI 可以原样保留,但大图建议转成资源文件。
207
+ - 背景图写在 CSS 字符串里时,路径同样写 `${appRes}/...`。`${appRes}` 是平台导入时替换的模板变量,不是 JS 变量;不要自己用 JS 变量拼接。
208
+ - 不要引用 CDN、外链图片、在线字体。
209
+
210
+ ---
211
+
212
+ ## 十、还原核对清单
213
+
214
+ - [ ] 原型 `<style>` 已整段复制,没有改写/删减
215
+ - [ ] 没有独立 `.css` 文件,没有 `import` CSS
216
+ - [ ] class 名和 DOM 层级与原型一致
217
+ - [ ] 全局选择器已收敛到页面根,平台壳未被污染
218
+ - [ ] 字体、字号、颜色、圆角、边框、阴影、间距一致
219
+ - [ ] hover / active / disabled / 空态 / 加载态一致
220
+ - [ ] 表格列宽、换行、横向滚动行为一致
221
+ - [ ] 弹窗、抽屉、Toast 的层级和遮罩一致
222
+ - [ ] 图片/资源路径使用 `${appRes}`
223
+ - [ ] 列表有稳定 `key`,没有用下标
224
+ - [ ] 定时器/监听在卸载时清理
225
+ - [ ] 没有 `innerHTML` 拼布局,没有直接操作 DOM
226
+
227
+ ---
228
+
229
+ ## 十一、常见走样原因
230
+
231
+ | 原因 | 表现 | 处理 |
232
+ |---|---|---|
233
+ | 把 CSS 规则翻译成内联 style | 伪类、媒体查询、层叠全丢 | 保留 CSS 字符串 |
234
+ | 改了 class 名 | 原型样式全部不命中 | 原名保留 |
235
+ | 给页面根加了额外 flex/grid | 间距、宽度变化 | 根容器只加作用域类,不加布局 |
236
+ | 全局 `body` 规则直接搬入 | 平台头部/侧栏被改 | 收敛到页面根 |
237
+ | 图片用相对路径 | 发布后 404 | `${appRes}` |
238
+ | 用 `display` 回填表单 | 中文名写回 ID 字段 | 用 `values` |
239
+ | 列表用 index 做 key | 删除/排序后状态错位 | 用数据 ID |
240
+
241
+ ---
242
+
243
+ ## 十二、验收方式
244
+
245
+ 本流程不提供本地预览。完成后:
246
+
247
+ 1. `e10-cli check <项目目录>` 扫描已知规则。
248
+ 2. `ecodecmd build <项目目录> --target=e10` 做真实编译。
249
+ 3. 按 `guide-page-export.md` 注册路由、部署。
250
+ 4. 由用户在实际环境逐项对照原型验收;发现偏差时回到本文件第九节定位。