@fui-org/fui-cli 1.3.1 → 2.0.0
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.
- package/README.md +19 -3
- package/dist/fui-bmg5pnmq.js +379 -0
- package/dist/fui.js +1 -1
- package/package.json +7 -6
- package/skills/fui/SKILL.md +9 -41
- package/skills/fui-skill/SKILL.md +95 -225
- package/skills/fui-skill/assets/projectdefaultstyle-3.0.css +555 -0
- package/skills/fui-skill/assets/projectdefaultstyle.css +207 -235
- package/skills/fui-skill/references/INDEX.md +105 -137
- package/skills/fui-skill/references/advanced-techniques.md +76 -68
- package/skills/fui-skill/references/coding-standards.md +56 -56
- package/skills/fui-skill/references/component-design.md +166 -173
- package/skills/fui-skill/references/component-quickref.md +61 -60
- package/skills/fui-skill/references/component-table.md +128 -117
- package/skills/fui-skill/references/components-dialog.md +55 -56
- package/skills/fui-skill/references/components-display.md +24 -30
- package/skills/fui-skill/references/components-echart.md +186 -261
- package/skills/fui-skill/references/components-input.md +72 -96
- package/skills/fui-skill/references/controls-patterns.md +196 -342
- package/skills/fui-skill/references/controls-styling-vocabulary.md +130 -97
- package/skills/fui-skill/references/db-table-design.md +24 -28
- package/skills/fui-skill/references/db-workflow.md +191 -390
- package/skills/fui-skill/references/default-function.md +169 -128
- package/skills/fui-skill/references/design-modes.md +35 -63
- package/skills/fui-skill/references/echart-templates.md +204 -196
- package/skills/fui-skill/references/fastproject.md +62 -60
- package/skills/fui-skill/references/fsheet.md +109 -124
- package/skills/fui-skill/references/fullstack-workflow.md +90 -128
- package/skills/fui-skill/references/module-data-patterns.md +31 -40
- package/skills/fui-skill/references/module-json-anatomy.md +47 -52
- package/skills/fui-skill/references/module-structure.md +80 -196
- package/skills/fui-skill/references/new-session.md +49 -51
- package/skills/fui-skill/references/pdfmake.md +17 -17
- package/skills/fui-skill/references/permission-system.md +89 -108
- package/skills/fui-skill/references/platform-architecture.md +128 -153
- package/skills/fui-skill/references/project-config.md +102 -134
- package/skills/fui-skill/references/project-provisioning.md +139 -244
- package/skills/fui-skill/references/script-map.md +208 -242
- package/skills/fui-skill/references/sql-clr-functions.md +98 -97
- package/skills/fui-skill/references/system-design.md +63 -88
- package/skills/fui-skill/references/tapi-file-api.md +46 -52
- package/skills/fui-skill/references/tapi-permission-patterns.md +51 -53
- package/skills/fui-skill/references/tapi-reference.md +132 -207
- package/skills/fui-skill/references/tools-registry.md +84 -460
- package/skills/fui-skill/references/ui-crosswindow-patterns.md +79 -75
- package/skills/fui-skill/references/ui-dialog-patterns.md +98 -72
- package/skills/fui-skill/references/ui-layout-patterns.md +26 -26
- package/skills/fui-skill/references/ui-patterns.md +71 -83
- package/skills/fui-skill/references/ui-screenshot-review.md +63 -62
- package/skills/fui-skill/references/ui-table-cell-patterns.md +61 -59
- package/skills/fui-skill/references/ui-templates.md +16 -23
- package/skills/fui-skill/references/verification.md +236 -246
- package/skills/fui-skill/references/watcher-patterns.md +30 -63
- package/skills/fui-skill/references/websocket-realtime.md +83 -66
- package/skills/fui-skill/scripts/component-3.0.js +298 -131
- package/skills/fui-skill/scripts/component.js +277 -271
- package/skills/fui-skill/scripts/componentTable-3.0.js +182 -53
- package/skills/fui-skill/scripts/componentTable.js +171 -49
- package/skills/fui-skill/scripts/defaultfunction-3.0.js +88 -3
- package/skills/fui-skill/scripts/defaultfunction.js +88 -3
- package/skills/fui-skill/scripts/fsheet.js +38 -0
- package/dist/fui-x7kph78r.js +0 -420
- package/skills/fui-skill/README.md +0 -112
- package/skills/fui-skill/metadata.json +0 -75
- package/skills/fui-skill-cli/SKILL.md +0 -139
- package/skills/fui-skill-cli/references/INDEX.md +0 -110
- package/skills/fui-skill-cli/references/advanced-techniques.md +0 -168
- package/skills/fui-skill-cli/references/coding-standards.md +0 -112
- package/skills/fui-skill-cli/references/component-design.md +0 -448
- package/skills/fui-skill-cli/references/component-quickref.md +0 -78
- package/skills/fui-skill-cli/references/component-table.md +0 -248
- package/skills/fui-skill-cli/references/components-dialog.md +0 -191
- package/skills/fui-skill-cli/references/components-display.md +0 -141
- package/skills/fui-skill-cli/references/components-echart.md +0 -316
- package/skills/fui-skill-cli/references/components-input.md +0 -335
- package/skills/fui-skill-cli/references/controls-patterns.md +0 -701
- package/skills/fui-skill-cli/references/controls-styling-vocabulary.md +0 -137
- package/skills/fui-skill-cli/references/db-table-design.md +0 -73
- package/skills/fui-skill-cli/references/db-workflow.md +0 -288
- package/skills/fui-skill-cli/references/default-function.md +0 -425
- package/skills/fui-skill-cli/references/design-modes.md +0 -57
- package/skills/fui-skill-cli/references/echart-templates.md +0 -489
- package/skills/fui-skill-cli/references/fastproject.md +0 -99
- package/skills/fui-skill-cli/references/fsheet.md +0 -203
- package/skills/fui-skill-cli/references/fullstack-workflow.md +0 -313
- package/skills/fui-skill-cli/references/module-data-patterns.md +0 -117
- package/skills/fui-skill-cli/references/module-json-anatomy.md +0 -132
- package/skills/fui-skill-cli/references/module-structure.md +0 -141
- package/skills/fui-skill-cli/references/new-session.md +0 -85
- package/skills/fui-skill-cli/references/pdfmake.md +0 -60
- package/skills/fui-skill-cli/references/permission-system.md +0 -150
- package/skills/fui-skill-cli/references/platform-architecture.md +0 -269
- package/skills/fui-skill-cli/references/project-config.md +0 -303
- package/skills/fui-skill-cli/references/project-provisioning.md +0 -278
- package/skills/fui-skill-cli/references/script-map.md +0 -262
- package/skills/fui-skill-cli/references/sql-clr-functions.md +0 -225
- package/skills/fui-skill-cli/references/system-design.md +0 -89
- package/skills/fui-skill-cli/references/tapi-file-api.md +0 -185
- package/skills/fui-skill-cli/references/tapi-permission-patterns.md +0 -156
- package/skills/fui-skill-cli/references/tapi-reference.md +0 -474
- package/skills/fui-skill-cli/references/tools-registry.md +0 -84
- package/skills/fui-skill-cli/references/ui-crosswindow-patterns.md +0 -321
- package/skills/fui-skill-cli/references/ui-dialog-patterns.md +0 -255
- package/skills/fui-skill-cli/references/ui-layout-patterns.md +0 -176
- package/skills/fui-skill-cli/references/ui-patterns.md +0 -303
- package/skills/fui-skill-cli/references/ui-screenshot-review.md +0 -95
- package/skills/fui-skill-cli/references/ui-table-cell-patterns.md +0 -318
- package/skills/fui-skill-cli/references/ui-templates.md +0 -22
- package/skills/fui-skill-cli/references/verification.md +0 -236
- package/skills/fui-skill-cli/references/watcher-patterns.md +0 -163
- package/skills/fui-skill-cli/references/websocket-realtime.md +0 -271
|
@@ -1,26 +1,24 @@
|
|
|
1
1
|
# FUI Cross-window Patterns — openWindow & data exchange
|
|
2
2
|
|
|
3
|
-
>
|
|
3
|
+
> Owns: **`openWindow`, cross-window data exchange (`#PARENT`/`#Win`), `set.menu` for child modules, `onclose`**.
|
|
4
4
|
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
> Xem thêm: [ui-patterns.md](ui-patterns.md), [default-function.md](default-function.md) (`openWindow`, `windowSendMessage`).
|
|
5
|
+
Open a module as a sub-window and exchange data between windows/iframes (`#PARENT`, `#WinID`). From project **security-manager** and `ex-v3-*` examples. See also [ui-patterns.md](ui-patterns.md), [default-function.md](default-function.md) (`openWindow`, `windowSendMessage`).
|
|
8
6
|
|
|
9
7
|
---
|
|
10
8
|
|
|
11
|
-
## 1.
|
|
9
|
+
## 1. openWindow
|
|
12
10
|
|
|
13
|
-
|
|
11
|
+
Opens another module as a separate popup window. `id` is the handle for later references.
|
|
14
12
|
|
|
15
13
|
```json
|
|
16
14
|
{
|
|
17
15
|
"FUN": "openWindow",
|
|
18
16
|
"IN": {
|
|
19
|
-
"id":
|
|
20
|
-
"title":
|
|
21
|
-
"url":
|
|
22
|
-
"data":
|
|
23
|
-
"width":
|
|
17
|
+
"id": "`Win1",
|
|
18
|
+
"title": "`User Permission",
|
|
19
|
+
"url": "`/UserPermission",
|
|
20
|
+
"data": "danhSachChoTable",
|
|
21
|
+
"width": "`800px",
|
|
24
22
|
"height": "`600px",
|
|
25
23
|
"onclose": {
|
|
26
24
|
"CALL": "reloadData"
|
|
@@ -29,18 +27,18 @@ Mở module khác như popup window riêng biệt. `id` là định danh để t
|
|
|
29
27
|
}
|
|
30
28
|
```
|
|
31
29
|
|
|
32
|
-
| Param
|
|
33
|
-
|
|
34
|
-
| `id`
|
|
35
|
-
| `url`
|
|
36
|
-
| `title`
|
|
37
|
-
| `data`
|
|
38
|
-
| `width` / `height` | ❌
|
|
39
|
-
| `onclose`
|
|
30
|
+
| Param | Required | Description |
|
|
31
|
+
| ------------------ | -------- | --------------------------------------------------------------------------- |
|
|
32
|
+
| `id` | ✅ | Window id (backtick = literal) — referenced as `#Win1` |
|
|
33
|
+
| `url` | ✅ | Module URL — no `?menu=0`; child declares `"set": { "menu": false }` itself |
|
|
34
|
+
| `title` | ❌ | Dialog title |
|
|
35
|
+
| `data` | ❌ | Data passed to the child — child reads `#PARENT.data` |
|
|
36
|
+
| `width` / `height` | ❌ | Window size (`"800px"`, `"50%"`) |
|
|
37
|
+
| `onclose` | ❌ | Action run after the sub-window closes |
|
|
40
38
|
|
|
41
|
-
> **
|
|
39
|
+
> **Child module:** never pass `?menu=0` in the URL. The child declares `"set": { "menu": false }` in its module.json to hide the menu permanently, regardless of how it's opened. URL carries only the IDs needed to query the DB.
|
|
42
40
|
|
|
43
|
-
**`onclose` targeting window
|
|
41
|
+
**`onclose` targeting another window:**
|
|
44
42
|
|
|
45
43
|
```json
|
|
46
44
|
"onclose": {
|
|
@@ -48,15 +46,15 @@ Mở module khác như popup window riêng biệt. `id` là định danh để t
|
|
|
48
46
|
}
|
|
49
47
|
```
|
|
50
48
|
|
|
51
|
-
>
|
|
49
|
+
> When Win2 closes → runs `cmdThongBao` in Win1 (not the current window).
|
|
52
50
|
|
|
53
51
|
---
|
|
54
52
|
|
|
55
|
-
## 2. Cross-window
|
|
53
|
+
## 2. Cross-window data exchange
|
|
56
54
|
|
|
57
|
-
|
|
55
|
+
`#PARENT` and `#WinID` exchange data between windows (iframes). Works same-domain and cross-domain (via `postMessage`).
|
|
58
56
|
|
|
59
|
-
###
|
|
57
|
+
### Read (value position)
|
|
60
58
|
|
|
61
59
|
```json
|
|
62
60
|
"data": [
|
|
@@ -68,12 +66,12 @@ FUI dùng `#PARENT` và `#WinID` để trao đổi dữ liệu giữa các windo
|
|
|
68
66
|
]
|
|
69
67
|
```
|
|
70
68
|
|
|
71
|
-
|
|
|
72
|
-
|
|
73
|
-
| `"#PARENT.field"` |
|
|
74
|
-
| `"#Win1.field"`
|
|
69
|
+
| Syntax | Meaning |
|
|
70
|
+
| ----------------- | ------------------------------------------ |
|
|
71
|
+
| `"#PARENT.field"` | Read `vueData.field` from parent |
|
|
72
|
+
| `"#Win1.field"` | Read `vueData.field` from iframe id `Win1` |
|
|
75
73
|
|
|
76
|
-
###
|
|
74
|
+
### Write (key position)
|
|
77
75
|
|
|
78
76
|
```json
|
|
79
77
|
"data": [
|
|
@@ -90,12 +88,12 @@ FUI dùng `#PARENT` và `#WinID` để trao đổi dữ liệu giữa các windo
|
|
|
90
88
|
}
|
|
91
89
|
```
|
|
92
90
|
|
|
93
|
-
|
|
|
94
|
-
|
|
95
|
-
| `"#PARENT.field": value` |
|
|
96
|
-
| `"#Win1.field": value`
|
|
91
|
+
| Syntax | Meaning |
|
|
92
|
+
| ------------------------ | --------------------------------- |
|
|
93
|
+
| `"#PARENT.field": value` | Write to parent's `vueData.field` |
|
|
94
|
+
| `"#Win1.field": value` | Write to Win1's `vueData.field` |
|
|
97
95
|
|
|
98
|
-
###
|
|
96
|
+
### Call an action in another window
|
|
99
97
|
|
|
100
98
|
```json
|
|
101
99
|
":action": {
|
|
@@ -107,12 +105,12 @@ FUI dùng `#PARENT` và `#WinID` để trao đổi dữ liệu giữa các windo
|
|
|
107
105
|
"#Win1": { "CALL": "cmdThongBao" }
|
|
108
106
|
```
|
|
109
107
|
|
|
110
|
-
- `"#PARENT"` (
|
|
111
|
-
- `"#Win1"`
|
|
108
|
+
- `"#PARENT"` (no field) with an action value → `runAction(value)` in parent
|
|
109
|
+
- `"#Win1"` with an action value → `runAction(value)` in Win1
|
|
112
110
|
|
|
113
|
-
###
|
|
111
|
+
### Receive data passed by openWindow
|
|
114
112
|
|
|
115
|
-
|
|
113
|
+
Parent opens child with `"data": "sourceData"`:
|
|
116
114
|
|
|
117
115
|
```json
|
|
118
116
|
"data": [
|
|
@@ -122,11 +120,12 @@ Khi window cha mở con với `"data": "sourceData"`:
|
|
|
122
120
|
]
|
|
123
121
|
```
|
|
124
122
|
|
|
125
|
-
> `#PARENT.Win1`
|
|
123
|
+
> `#PARENT.Win1` reads parent variable `Win1`. When the parent calls `openWindow` with `id: "Win1"`, FUI sets `vueData.Win1 = passed_data` in the parent before opening.
|
|
124
|
+
|
|
125
|
+
### Full pattern — child receives parent data
|
|
126
126
|
|
|
127
|
-
|
|
127
|
+
**Parent (ex-v3-1SetData):**
|
|
128
128
|
|
|
129
|
-
**Module cha (ex-v3-1SetData):**
|
|
130
129
|
```json
|
|
131
130
|
":action": {
|
|
132
131
|
"FUN": "openWindow",
|
|
@@ -138,7 +137,8 @@ Khi window cha mở con với `"data": "sourceData"`:
|
|
|
138
137
|
}
|
|
139
138
|
```
|
|
140
139
|
|
|
141
|
-
**
|
|
140
|
+
**Child (ex-v3-2CauTruc):**
|
|
141
|
+
|
|
142
142
|
```json
|
|
143
143
|
"data": [
|
|
144
144
|
{
|
|
@@ -153,17 +153,17 @@ Khi window cha mở con với `"data": "sourceData"`:
|
|
|
153
153
|
]
|
|
154
154
|
```
|
|
155
155
|
|
|
156
|
-
>
|
|
156
|
+
> Put `#PARENT.*` BEFORE startup CALLs so data is ready before the first API runs.
|
|
157
157
|
|
|
158
158
|
---
|
|
159
159
|
|
|
160
|
-
## 3. Sub-window
|
|
160
|
+
## 3. Sub-window checklist
|
|
161
161
|
|
|
162
|
-
|
|
162
|
+
A module opened via `openWindow` needs:
|
|
163
163
|
|
|
164
|
-
- `"set": { "menu": false }` —
|
|
165
|
-
- URL params
|
|
166
|
-
- URL
|
|
164
|
+
- `"set": { "menu": false }` — hides the navigation header (in module.json, not `?menu=0` in the URL)
|
|
165
|
+
- URL params are injected into `vueData` before `data[]` runs — a trailing `{ "CALL": "apiLoad" }` is enough
|
|
166
|
+
- URL passes only the parent record **ID** the child actually uses — no names or fields re-queryable from the DB
|
|
167
167
|
|
|
168
168
|
```json
|
|
169
169
|
// module.json của module con
|
|
@@ -184,13 +184,13 @@ Module được mở qua `openWindow` cần:
|
|
|
184
184
|
|
|
185
185
|
---
|
|
186
186
|
|
|
187
|
-
## 4.
|
|
187
|
+
## 4. Complete parent ↔ child example (`ex-v3-1SetData` → `ex-v3-2CauTruc`)
|
|
188
188
|
|
|
189
|
-
|
|
189
|
+
Standard: **parent opens child via `openWindow` passing table data; child reads/writes/calls back up to parent.**
|
|
190
190
|
|
|
191
|
-
### 4.1
|
|
191
|
+
### 4.1 Parent — f-table + open button, pass `data`
|
|
192
192
|
|
|
193
|
-
`
|
|
193
|
+
`openWindow.IN.data` passes an object/array (here table list `danhSachChoTable`) to the child; child reads `#PARENT.<id>`.
|
|
194
194
|
|
|
195
195
|
```json
|
|
196
196
|
{
|
|
@@ -224,7 +224,7 @@ Module được mở qua `openWindow` cần:
|
|
|
224
224
|
}
|
|
225
225
|
```
|
|
226
226
|
|
|
227
|
-
|
|
227
|
+
Parent can also declare **named actions** for the child to call, and write into the child from `data[]`:
|
|
228
228
|
|
|
229
229
|
```json
|
|
230
230
|
"data": [
|
|
@@ -238,7 +238,7 @@ Cha cũng có thể khai báo **action đặt tên** để con gọi ngược l
|
|
|
238
238
|
]
|
|
239
239
|
```
|
|
240
240
|
|
|
241
|
-
### 4.2
|
|
241
|
+
### 4.2 Child — read parent, write back, call parent, open another child
|
|
242
242
|
|
|
243
243
|
```json
|
|
244
244
|
// data[] của con: đọc dữ liệu cha NGAY đầu tiên
|
|
@@ -271,35 +271,39 @@ Cha cũng có thể khai báo **action đặt tên** để con gọi ngược l
|
|
|
271
271
|
} } } }
|
|
272
272
|
```
|
|
273
273
|
|
|
274
|
-
**
|
|
274
|
+
**Syntax summary (value = read, key = write):**
|
|
275
275
|
|
|
276
|
-
|
|
|
277
|
-
|
|
278
|
-
| `"x": "#PARENT.field"`
|
|
279
|
-
| `"x": "#Win1.field"`
|
|
280
|
-
| `"#PARENT.field": "src"`
|
|
281
|
-
| `"#Win1.field": "src"`
|
|
282
|
-
| `"#PARENT": { "CALL": "cmd" }` |
|
|
283
|
-
| `"#Win1": { "CALL": "cmd" }`
|
|
284
|
-
| `openWindow.IN.data`
|
|
285
|
-
| `openWindow.IN.onclose`
|
|
276
|
+
| Syntax | Meaning |
|
|
277
|
+
| ------------------------------ | ------------------------------------------------------ |
|
|
278
|
+
| `"x": "#PARENT.field"` | Read parent `field` into `x` |
|
|
279
|
+
| `"x": "#Win1.field"` | Read `field` of window `Win1` |
|
|
280
|
+
| `"#PARENT.field": "src"` | Write `src` to parent `field` |
|
|
281
|
+
| `"#Win1.field": "src"` | Write to window `Win1` |
|
|
282
|
+
| `"#PARENT": { "CALL": "cmd" }` | Call action `cmd` in parent |
|
|
283
|
+
| `"#Win1": { "CALL": "cmd" }` | Call action in `Win1` |
|
|
284
|
+
| `openWindow.IN.data` | Pass object/array to child; child reads `#PARENT.<id>` |
|
|
285
|
+
| `openWindow.IN.onclose` | Action after child closes (may target `#WinX`) |
|
|
286
286
|
|
|
287
|
-
>
|
|
287
|
+
> Works **same-domain and cross-domain** (runtime uses `postMessage` across domains).
|
|
288
288
|
|
|
289
289
|
---
|
|
290
290
|
|
|
291
|
-
## 5. f-table / f-sheet +
|
|
291
|
+
## 5. f-table / f-sheet + detail window
|
|
292
292
|
|
|
293
|
-
|
|
293
|
+
Common: list table → click a row → open child window to view/edit that row.
|
|
294
294
|
|
|
295
|
-
-
|
|
296
|
-
-
|
|
295
|
+
- In `f-table` `headers`, use `t-button` or `t-menu` with `:action` calling `openWindow`; `item` is the current row.
|
|
296
|
+
- Pass **only the row ID** via URL (child queries DB), or the whole row object via `openWindow.IN.data`.
|
|
297
297
|
|
|
298
298
|
```json
|
|
299
299
|
{
|
|
300
|
-
"el": "t-button",
|
|
300
|
+
"el": "t-button",
|
|
301
|
+
"text": "Chi tiết",
|
|
302
|
+
"value": "ID",
|
|
303
|
+
"align": "center",
|
|
301
304
|
"attr": {
|
|
302
|
-
"icon-text": "mdi-eye",
|
|
305
|
+
"icon-text": "mdi-eye",
|
|
306
|
+
"color": "primary",
|
|
303
307
|
":action": {
|
|
304
308
|
"FUN": "openWindow",
|
|
305
309
|
"IN": {
|
|
@@ -313,5 +317,5 @@ Pattern rất phổ biến: bảng danh sách → click một dòng → mở c
|
|
|
313
317
|
}
|
|
314
318
|
```
|
|
315
319
|
|
|
316
|
-
- **`f-sheet`** (
|
|
317
|
-
- Reload
|
|
320
|
+
- **`f-sheet`** (grid-entry spreadsheet) works the same: a button/menu in the sheet calls `openWindow`, or save the sheet's `vueData` then open a child for extra input; the child writes back via `#PARENT.<field>` on close.
|
|
321
|
+
- Reload after child closes: `onclose: { "CALL": "reloadList" }` (runs in the opener window) — see §1.
|
|
@@ -1,68 +1,76 @@
|
|
|
1
|
-
# FUI Dialog Patterns — v-dialog
|
|
1
|
+
# FUI Dialog Patterns — manual v-dialog (STANDARD), hidden-container, checkbox-list
|
|
2
2
|
|
|
3
|
-
>
|
|
3
|
+
> Owns: **manual dialogs: `hidden-container`, `v-card`/`v-toolbar` anatomy, opening a dialog with a row, checkbox-list**. `f-dialog`: [components-dialog.md](components-dialog.md).
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
From **security-manager** and demo **ex-v3-dialog**.
|
|
6
6
|
|
|
7
|
-
> **
|
|
7
|
+
> **Dialog STANDARD: build `v-dialog` manually per the §1 anatomy** (easy to read/edit piecewise), **styled like `f-dialog`**: uncolored `dense flat` toolbar + close icon, floating-label form, last row is `v-card-actions`. Actions right-aligned, buttons keep natural width; only the primary action gets a filled color, secondary actions are text buttons. Full anatomy + rule table: `fui design read fui` §4–5. `f-dialog` (§0) is the secondary option for very small forms.
|
|
8
8
|
|
|
9
|
-
>
|
|
9
|
+
> See also: [ui-patterns.md](ui-patterns.md), [ui-table-cell-patterns.md](ui-table-cell-patterns.md) (menuChucNang opening a dialog), [components-dialog.md](components-dialog.md).
|
|
10
10
|
|
|
11
11
|
---
|
|
12
12
|
|
|
13
|
-
## 0. `f-dialog` —
|
|
13
|
+
## 0. `f-dialog` — compact dialog component (secondary)
|
|
14
14
|
|
|
15
|
-
`f-dialog`
|
|
15
|
+
`f-dialog` bundles card + toolbar + buttons — shorter than manual `v-dialog` but hard to customise layout. Use only for very small/simple forms; default is manual `v-dialog` (§1). Inner fields' `v-model` **points directly at keys of the `data` object** (no `vueData.dialogData.X`).
|
|
16
16
|
|
|
17
17
|
```json
|
|
18
18
|
{
|
|
19
19
|
"el": "f-dialog",
|
|
20
20
|
"attr": {
|
|
21
|
-
"v-model": "dialogOpen",
|
|
22
|
-
"v-model:data": "dialogData",
|
|
21
|
+
"v-model": "dialogOpen", // boolean mở/đóng
|
|
22
|
+
"v-model:data": "dialogData", // object dữ liệu của form
|
|
23
23
|
"title": "Nhập dữ liệu",
|
|
24
24
|
":open-action": { "MESSBOX": "Bạn vừa mở dialog" },
|
|
25
25
|
":controls": [
|
|
26
|
-
{ "el": "v-text-field", "attr": { "v-model": "Domain",
|
|
26
|
+
{ "el": "v-text-field", "attr": { "v-model": "Domain", "label": "Domain" }, "w": 4 },
|
|
27
27
|
{ "el": "v-text-field", "attr": { "v-model": "ModuleID", "label": "ModuleID" }, "w": 3 },
|
|
28
|
-
{ "el": "v-checkbox",
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
28
|
+
{ "el": "v-checkbox", "attr": { "v-model": "checkBoxValue", ":label": "`Tôi đồng ý: ${checkBoxValue}`" } },
|
|
29
|
+
{
|
|
30
|
+
"el": "v-select",
|
|
31
|
+
"attr": {
|
|
32
|
+
"label": "Chọn",
|
|
33
|
+
"v-model": "bienselect",
|
|
34
|
+
":items": "vueData.Mang",
|
|
35
|
+
"item-title": "AppName",
|
|
36
|
+
"item-value": "AppListID"
|
|
37
|
+
}
|
|
38
|
+
}
|
|
32
39
|
],
|
|
33
40
|
":watch": {
|
|
34
41
|
"bienselect": { "MESSBOX": "Watch {{bienselect}}" }
|
|
35
42
|
},
|
|
36
43
|
":button": [
|
|
37
|
-
{
|
|
38
|
-
"
|
|
39
|
-
|
|
40
|
-
"
|
|
41
|
-
|
|
44
|
+
{
|
|
45
|
+
"label": "Lưu",
|
|
46
|
+
"type": "submit",
|
|
47
|
+
":disabled": "!checkBoxValue",
|
|
48
|
+
"action": [{ "MESSBOX": "Đã lưu" }, { "dialogOpen": false }]
|
|
49
|
+
},
|
|
50
|
+
{ "label": "Chạy API", "checkvalid": true, "v-if": "ModuleID==1", "action": [{ "API": "/chaymotapi" }] },
|
|
51
|
+
{ "label": "Đóng", "action": [{ "dialogOpen": false }] }
|
|
42
52
|
]
|
|
43
53
|
}
|
|
44
54
|
}
|
|
45
55
|
```
|
|
46
56
|
|
|
47
|
-
| Prop
|
|
48
|
-
|
|
49
|
-
| `v-model`
|
|
50
|
-
| `v-model:data` |
|
|
51
|
-
| `title`
|
|
52
|
-
| `:open-action` | Action
|
|
53
|
-
| `:controls`
|
|
54
|
-
| `:watch`
|
|
55
|
-
| `:button`
|
|
57
|
+
| Prop | Role |
|
|
58
|
+
| -------------- | ------------------------------------------------------------------------------ |
|
|
59
|
+
| `v-model` | Boolean open/close |
|
|
60
|
+
| `v-model:data` | Form data object; `:controls` fields bind directly to its keys |
|
|
61
|
+
| `title` | Dialog title |
|
|
62
|
+
| `:open-action` | Action run on open |
|
|
63
|
+
| `:controls` | Control Object array = form fields |
|
|
64
|
+
| `:watch` | Dialog-scoped watchers (by field name) |
|
|
65
|
+
| `:button` | Buttons: `label`, `type:"submit"`, `checkvalid`, `:disabled`, `v-if`, `action` |
|
|
56
66
|
|
|
57
|
-
**
|
|
67
|
+
**Which to use:** every dialog by default → **manual `v-dialog` per §1** (project standard). `f-dialog` only for very small forms (1–3 fields, no special layout) with no customisation requested.
|
|
58
68
|
|
|
59
69
|
---
|
|
60
70
|
|
|
61
|
-
## 1.
|
|
62
|
-
|
|
63
|
-
Dialogs luôn đặt trong container riêng với `prop: "hidden-container"` — không nằm trong rows chính.
|
|
71
|
+
## 1. Manual v-dialog in hidden-container (STANDARD)
|
|
64
72
|
|
|
65
|
-
|
|
73
|
+
Dialogs always live in their own container with `prop: "hidden-container"` — never inside the main rows.
|
|
66
74
|
|
|
67
75
|
```json
|
|
68
76
|
{
|
|
@@ -99,31 +107,46 @@ Dialogs luôn đặt trong container riêng với `prop: "hidden-container"` —
|
|
|
99
107
|
"el": "v-container",
|
|
100
108
|
"attr": { "class": "grid-list-md px-4" },
|
|
101
109
|
"innerHTML": [
|
|
102
|
-
{
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
110
|
+
{
|
|
111
|
+
"el": "v-layout",
|
|
112
|
+
"w": 12,
|
|
113
|
+
"attr": { "row": "", "wrap": "" },
|
|
114
|
+
"innerHTML": [
|
|
115
|
+
{
|
|
116
|
+
"el": "v-text-field",
|
|
117
|
+
"col": {},
|
|
118
|
+
"attr": { "v-model": "vueData.sUserName", "label": "Tên đăng nhập" },
|
|
119
|
+
"w": 6
|
|
120
|
+
},
|
|
121
|
+
{
|
|
122
|
+
"el": "v-text-field",
|
|
123
|
+
"col": {},
|
|
124
|
+
"attr": { "v-model": "vueData.sLastName", "label": "Họ tên" },
|
|
125
|
+
"w": 6
|
|
126
|
+
}
|
|
127
|
+
]
|
|
128
|
+
}
|
|
106
129
|
]
|
|
107
130
|
},
|
|
108
131
|
{
|
|
109
132
|
"el": "v-card-actions",
|
|
110
|
-
"attr": { "class": "mr-1 mb-1" },
|
|
111
|
-
"innerHTML": [
|
|
112
|
-
{ "el": "v-spacer", "attr": {} },
|
|
113
|
-
{
|
|
114
|
-
"el": "f-button",
|
|
115
|
-
"attr": {
|
|
116
|
-
"text": "",
|
|
117
|
-
"label": "Đặt lại",
|
|
118
|
-
":action": { "CALL": "resetForm" }
|
|
119
|
-
}
|
|
120
|
-
},
|
|
121
|
-
{
|
|
122
|
-
"el": "f-button",
|
|
123
|
-
"attr": {
|
|
124
|
-
"color": "primary",
|
|
125
|
-
":checkvalid": true,
|
|
126
|
-
"label": "Lưu",
|
|
133
|
+
"attr": { "class": "mr-1 mb-1" },
|
|
134
|
+
"innerHTML": [
|
|
135
|
+
{ "el": "v-spacer", "attr": {} },
|
|
136
|
+
{
|
|
137
|
+
"el": "f-button",
|
|
138
|
+
"attr": {
|
|
139
|
+
"text": "",
|
|
140
|
+
"label": "Đặt lại",
|
|
141
|
+
":action": { "CALL": "resetForm" }
|
|
142
|
+
}
|
|
143
|
+
},
|
|
144
|
+
{
|
|
145
|
+
"el": "f-button",
|
|
146
|
+
"attr": {
|
|
147
|
+
"color": "primary",
|
|
148
|
+
":checkvalid": true,
|
|
149
|
+
"label": "Lưu",
|
|
127
150
|
"icon-text": "mdi-content-save",
|
|
128
151
|
":action": {
|
|
129
152
|
"API": "SM_Users_Update",
|
|
@@ -148,24 +171,26 @@ Dialogs luôn đặt trong container riêng với `prop: "hidden-container"` —
|
|
|
148
171
|
}
|
|
149
172
|
```
|
|
150
173
|
|
|
151
|
-
**
|
|
152
|
-
|
|
153
|
-
- `v-
|
|
154
|
-
-
|
|
155
|
-
-
|
|
156
|
-
-
|
|
157
|
-
- `v-
|
|
158
|
-
-
|
|
159
|
-
-
|
|
160
|
-
-
|
|
174
|
+
**Rules (f-dialog look):**
|
|
175
|
+
|
|
176
|
+
- `v-card[class="pa-0"]` — removes padding so the toolbar touches the edges (Vuetify class, not inline style); no elevation/outlined.
|
|
177
|
+
- `v-toolbar[dense flat]` — thin title bar, **no** color/dark.
|
|
178
|
+
- Close: `v-btn[icon]` mdi-close + `v-on:click: "vueData.dlXxx = false"` — no extra "Đóng" button in actions.
|
|
179
|
+
- Form body: `v-container.grid-list-md.px-4` > `v-layout[row wrap]` > **floating-label** fields (`label` in attr; w:12 long / 6+6 short) — NO separate label divs.
|
|
180
|
+
- Last button row MUST be `v-card-actions[class="mr-1 mb-1"]` — not a `v-layout`, `v-container` or normal form row.
|
|
181
|
+
- `v-spacer` before the buttons → all actions right-aligned.
|
|
182
|
+
- Buttons keep natural content width: no `w`, `width`, `block`, `flex-grow`, and don't wrap each in a growing column.
|
|
183
|
+
- At most one primary action (e.g. **Lưu**) gets filled `color="primary"`; secondary actions use `f-button` + `"text": ""`, unfilled. Few buttons, short labels, restrained.
|
|
184
|
+
- Save CALLBACK: MESS → close dialog → reload data.
|
|
161
185
|
|
|
162
186
|
---
|
|
163
187
|
|
|
164
|
-
## 2.
|
|
188
|
+
## 2. Open dialog with row data
|
|
189
|
+
|
|
190
|
+
Two steps: copy data into state → set `dlXxx = true`.
|
|
165
191
|
|
|
166
|
-
|
|
192
|
+
**From menuChucNang:**
|
|
167
193
|
|
|
168
|
-
**Từ menuChucNang:**
|
|
169
194
|
```json
|
|
170
195
|
"action": [
|
|
171
196
|
{
|
|
@@ -179,7 +204,8 @@ Pattern 2 bước: copy dữ liệu vào state → set `dlXxx = true`.
|
|
|
179
204
|
]
|
|
180
205
|
```
|
|
181
206
|
|
|
182
|
-
**
|
|
207
|
+
**From f-button:**
|
|
208
|
+
|
|
183
209
|
```json
|
|
184
210
|
":action": [
|
|
185
211
|
{ "addNew": 1, "sUserID": "", "sUserName": "" },
|
|
@@ -187,13 +213,13 @@ Pattern 2 bước: copy dữ liệu vào state → set `dlXxx = true`.
|
|
|
187
213
|
]
|
|
188
214
|
```
|
|
189
215
|
|
|
190
|
-
> `addNew: 0` = edit
|
|
216
|
+
> `addNew: 0` = edit, `addNew: 1` = new. In the dialog use `:disabled="addNew==0"` to lock the ID field on edit.
|
|
191
217
|
|
|
192
218
|
---
|
|
193
219
|
|
|
194
|
-
## 3. Checkbox
|
|
220
|
+
## 3. Checkbox-list dialog
|
|
195
221
|
|
|
196
|
-
Dialog
|
|
222
|
+
Dialog with a checkbox list for multi-select, saving on each click.
|
|
197
223
|
|
|
198
224
|
```json
|
|
199
225
|
{
|
|
@@ -226,4 +252,4 @@ Dialog chứa danh sách checkbox để chọn nhiều items, lưu ngay khi clic
|
|
|
226
252
|
}
|
|
227
253
|
```
|
|
228
254
|
|
|
229
|
-
> `v-on:click`
|
|
255
|
+
> `v-on:click` on the checkbox → saves immediately, no Save button. `v-model` holds an array; `:value` uses a backtick literal.
|