ts-glitter 21.7.2 → 21.7.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 (65) hide show
  1. package/lowcode/Entry.js +2 -2
  2. package/lowcode/Entry.ts +2 -2
  3. package/lowcode/api/pageConfig.js +15 -1
  4. package/lowcode/api/pageConfig.ts +15 -13
  5. package/lowcode/cms-plugin/line-auto-reply.js +1 -0
  6. package/lowcode/cms-plugin/line-auto-reply.ts +1 -0
  7. package/lowcode/cms-plugin/menus-setting.js +4 -4
  8. package/lowcode/cms-plugin/menus-setting.ts +4 -4
  9. package/lowcode/cms-plugin/shopping-market-shopee.js +2 -20
  10. package/lowcode/cms-plugin/shopping-market-shopee.ts +3 -19
  11. package/lowcode/cms-plugin/shopping-order-manager.ts +1 -0
  12. package/lowcode/editor-components/global-widget/bridge.js +95 -3
  13. package/lowcode/editor-components/global-widget/bridge.ts +124 -115
  14. package/lowcode/glitter-base/route/shopee.js +0 -2
  15. package/lowcode/glitter-base/route/shopee.ts +0 -2
  16. package/lowcode/glitterBundle/html-component/global-widget.js +37 -11
  17. package/lowcode/glitterBundle/html-component/global-widget.ts +75 -14
  18. package/lowcode/jspage/main.js +152 -68
  19. package/lowcode/jspage/main.ts +155 -80
  20. package/lowcode/modules/image-library.js +70 -86
  21. package/lowcode/modules/image-library.ts +98 -119
  22. package/lowcode/official_view_component/official/component.js +17 -15
  23. package/lowcode/official_view_component/official/component.ts +20 -15
  24. package/lowcode/official_view_component/official/form.js +186 -159
  25. package/lowcode/official_view_component/official/form.ts +1150 -1068
  26. package/lowcode/public-components/blogs/blogs-01.js +20 -4
  27. package/lowcode/public-components/blogs/blogs-01.ts +25 -4
  28. package/lowcode/public-components/footer/footer-01.js +1 -1
  29. package/lowcode/public-components/footer/footer-01.ts +2 -1
  30. package/lowcode/public-components/footer/footer-02.js +1 -1
  31. package/lowcode/public-components/footer/footer-02.ts +1 -1
  32. package/lowcode/public-components/footer/footer-03.js +1 -1
  33. package/lowcode/public-components/footer/footer-03.ts +1 -1
  34. package/package.json +1 -1
  35. package/src/api-public/controllers/shopee.js +10 -0
  36. package/src/api-public/controllers/shopee.js.map +1 -1
  37. package/src/api-public/controllers/shopee.ts +12 -12
  38. package/src/api-public/services/auto-send-email.js +16 -0
  39. package/src/api-public/services/auto-send-email.js.map +1 -1
  40. package/src/api-public/services/auto-send-email.ts +16 -0
  41. package/src/api-public/services/checkout-event.js +13 -17
  42. package/src/api-public/services/checkout-event.js.map +1 -1
  43. package/src/api-public/services/checkout-event.ts +9 -1
  44. package/src/api-public/services/data-analyze.d.ts +1 -1
  45. package/src/api-public/services/line-message.js +1 -0
  46. package/src/api-public/services/line-message.js.map +1 -1
  47. package/src/api-public/services/line-message.ts +2 -0
  48. package/src/api-public/services/shopee.d.ts +4 -3
  49. package/src/api-public/services/shopee.js +28 -24
  50. package/src/api-public/services/shopee.js.map +1 -1
  51. package/src/api-public/services/shopee.ts +30 -24
  52. package/src/api-public/services/shopping.js +2 -7
  53. package/src/api-public/services/shopping.js.map +1 -1
  54. package/src/api-public/services/shopping.ts +5 -14
  55. package/src/index.js +3 -3
  56. package/src/modules/database.d.ts +1 -1
  57. package/src/public-config-initial/auto-fcm.js +4 -0
  58. package/src/public-config-initial/auto-fcm.js.map +1 -1
  59. package/src/public-config-initial/auto-fcm.ts +7 -1
  60. package/src/seo-config.js +0 -1
  61. package/src/seo-config.js.map +1 -1
  62. package/src/seo-config.ts +0 -1
  63. package/src/services/template.js +10 -0
  64. package/src/services/template.js.map +1 -1
  65. package/src/services/template.ts +9 -0
@@ -1,1115 +1,1197 @@
1
- import {HtmlJson, Plugin} from '../../glitterBundle/plugins/plugin-creater.js';
2
- import {Glitter} from '../../glitterBundle/Glitter.js';
3
- import {GVC} from '../../glitterBundle/GVController.js';
4
- import {TriggerEvent} from '../../glitterBundle/plugins/trigger-event.js';
5
- import {EditorElem} from '../../glitterBundle/plugins/editor-elem.js';
6
- import {getInitialData} from '../initial_data.js';
1
+ import { HtmlJson, Plugin } from '../../glitterBundle/plugins/plugin-creater.js';
2
+ import { Glitter } from '../../glitterBundle/Glitter.js';
3
+ import { GVC } from '../../glitterBundle/GVController.js';
4
+ import { TriggerEvent } from '../../glitterBundle/plugins/trigger-event.js';
5
+ import { EditorElem } from '../../glitterBundle/plugins/editor-elem.js';
6
+ import { getInitialData } from '../initial_data.js';
7
7
  //@ts-ignore
8
8
  import autosize from '../../glitterBundle/plugins/autosize.js';
9
- import {ApiPageConfig} from '../../api/pageConfig.js';
10
- import {NormalPageEditor} from '../../editor/normal-page-editor.js';
11
- import {Language} from "../../glitter-base/global/language.js";
9
+ import { ApiPageConfig } from '../../api/pageConfig.js';
10
+ import { NormalPageEditor } from '../../editor/normal-page-editor.js';
11
+ import { ApiUser } from '../../glitter-base/route/user.js';
12
+ import { OptionsItem } from '../../glitterBundle/html-component/global-widget.js';
13
+
14
+ const html = String.raw;
12
15
 
13
16
  export class FormWidget {
14
- public static settingView(obj: {
15
- gvc: GVC;
16
- array: any;
17
- refresh: () => void;
18
- widget?: any;
19
- subData?: any;
20
- title?: string;
21
- styleSetting?: boolean;
22
- concat?: (dd: any) => void;
23
- user_mode?: boolean;
24
- }) {
25
- const gvc = obj.gvc;
26
- const array = obj.array;
27
- const glitter = obj.gvc.glitter;
17
+ public static settingView(obj: {
18
+ gvc: GVC;
19
+ array: any;
20
+ refresh: () => void;
21
+ widget?: any;
22
+ subData?: any;
23
+ title?: string;
24
+ styleSetting?: boolean;
25
+ concat?: (dd: any) => void;
26
+ user_mode?: boolean;
27
+ }) {
28
+ const gvc = obj.gvc;
29
+ const array = obj.array;
30
+ const glitter = obj.gvc.glitter;
28
31
 
29
- function refresh() {
30
- obj.refresh && obj.refresh();
31
- }
32
+ function refresh() {
33
+ obj.refresh && obj.refresh();
34
+ }
32
35
 
33
- if (obj.user_mode) {
34
- array.map((dd: any) => {
35
- dd.toggle = false;
36
- });
37
- return gvc.bindView(() => {
38
- return {
39
- bind: gvc.glitter.getUUID(),
40
- view: () => {
41
- const html = String.raw;
42
- return new Promise((resolve) => {
43
- (window as any).glitter.getModule(glitter.root_path + `cms-plugin/module/form-module.js`, (module: any) => {
44
- resolve(
45
- module.editor(gvc, array, html`
46
- <div class="tx_normal fw-bolder d-flex flex-column"
47
- style="margin-bottom: 12px;">${obj.title ?? '表單項目'}
48
- </div> `, () => {
49
- refresh();
50
- }) + html`
51
- <div class="w-100 border-top my-3"></div>`
52
- );
53
- });
54
- });
55
- },
56
- divCreate: {
57
- class: `mx-2 mt-n3`,
58
- },
59
- };
36
+ if (obj.user_mode) {
37
+ array.map((dd: any) => {
38
+ dd.toggle = false;
39
+ });
40
+ return gvc.bindView(() => {
41
+ return {
42
+ bind: gvc.glitter.getUUID(),
43
+ view: () => {
44
+ const html = String.raw;
45
+ return new Promise(resolve => {
46
+ (window as any).glitter.getModule(
47
+ glitter.root_path + `cms-plugin/module/form-module.js`,
48
+ (module: any) => {
49
+ resolve(
50
+ module.editor(
51
+ gvc,
52
+ array,
53
+ html`
54
+ <div class="tx_normal fw-bolder d-flex flex-column" style="margin-bottom: 12px;">
55
+ ${obj.title ?? '表單項目'}
56
+ </div>
57
+ `,
58
+ () => {
59
+ refresh();
60
+ }
61
+ ) + html` <div class="w-100 border-top my-3"></div>`
62
+ );
63
+ }
64
+ );
60
65
  });
61
- }
62
- return EditorElem.arrayItem({
63
- title: obj.title ?? '表單項目',
64
- gvc: gvc,
65
- array: () => {
66
- return array.map((dd: any, index: number) => {
66
+ },
67
+ divCreate: {
68
+ class: `mx-2 mt-n3`,
69
+ },
70
+ };
71
+ });
72
+ }
73
+ return EditorElem.arrayItem({
74
+ title: obj.title ?? '表單項目',
75
+ gvc: gvc,
76
+ array: () => {
77
+ return array.map((dd: any, index: number) => {
78
+ return {
79
+ title: dd.title ?? `選項.${index + 1}`,
80
+ innerHtml: () => {
81
+ const editor_refer = (window.parent as any).glitter.share.NormalPageEditor || NormalPageEditor;
82
+ const gvc = (window.parent as any).glitter.pageConfig[
83
+ (window.parent as any).glitter.pageConfig.length - 1
84
+ ].gvc;
85
+ editor_refer.closeEvent = () => {
86
+ obj.widget && obj.widget.refreshComponent();
87
+ refresh();
88
+ };
89
+ editor_refer.toggle({
90
+ visible: true,
91
+ title: obj.title || '表單項目',
92
+ view: (() => {
93
+ dd.type = dd.type || 'form_plugin_v2';
94
+ dd.require = dd.require || 'false';
95
+ return gvc.bindView(() => {
96
+ const id = gvc.glitter.getUUID();
67
97
  return {
68
- title: dd.title ?? `選項.${index + 1}`,
69
- innerHtml: () => {
70
- const editor_refer = (window.parent as any).glitter.share.NormalPageEditor || NormalPageEditor;
71
- const gvc = (window.parent as any).glitter.pageConfig[(window.parent as any).glitter.pageConfig.length - 1].gvc;
72
- editor_refer.closeEvent = () => {
73
- obj.widget && obj.widget.refreshComponent();
98
+ bind: id,
99
+ view: () => {
100
+ const html = String.raw;
101
+ return html`${[
102
+ html` <div
103
+ class="position-relative bgf6 d-flex align-items-center justify-content-between mx-n2 mt-n2 p-2 border-bottom shadow"
104
+ >
105
+ <span class="fs-6 fw-bold " style="color:black;">表單插件設定</span>
106
+ </div>`,
107
+ EditorElem.editeInput({
108
+ gvc: gvc,
109
+ title: 'Label名稱',
110
+ placeHolder: `請輸入Label名稱`,
111
+ default: dd.title,
112
+ callback: text => {
113
+ dd.title = text;
114
+ if (obj.user_mode) {
115
+ dd.key = text;
116
+ }
74
117
  refresh();
75
- };
76
- editor_refer.toggle({
77
- visible: true,
78
- title: obj.title || '表單項目',
79
- view: (() => {
80
- dd.type = dd.type || 'form_plugin_v2';
81
- dd.require = dd.require || 'false';
82
- return gvc.bindView(() => {
83
- const id = gvc.glitter.getUUID();
118
+ },
119
+ }),
120
+ EditorElem.select({
121
+ title: '是否必填',
122
+ gvc: gvc,
123
+ def: dd.require,
124
+ array: [
125
+ {
126
+ title: '是',
127
+ value: 'true',
128
+ },
129
+ {
130
+ title: '否',
131
+ value: 'false',
132
+ },
133
+ ],
134
+ callback: text => {
135
+ dd.require = text;
136
+ gvc.notifyDataChange(id);
137
+ },
138
+ }),
139
+ ...(() => {
140
+ dd.formFormat = dd.formFormat ?? '{}';
141
+ dd.col = dd.col ?? '12';
142
+ dd.col_sm = dd.col_sm ?? '12';
143
+ const html = String.raw;
144
+ let config_array = [
145
+ EditorElem.buttonPrimary(
146
+ dd.moduleName || '選擇表單插件',
147
+ gvc.event(() => {
148
+ editor_refer.toggle({
149
+ visible: true,
150
+ view: gvc.bindView(() => {
84
151
  return {
85
- bind: id,
86
- view: () => {
87
- const html = String.raw;
88
- return html`${[
89
- html`
90
- <div class="position-relative bgf6 d-flex align-items-center justify-content-between mx-n2 mt-n2 p-2 border-bottom shadow">
91
- <span class="fs-6 fw-bold "
92
- style="color:black;">表單插件設定</span>
93
- </div>`,
94
- EditorElem.editeInput({
95
- gvc: gvc,
96
- title: 'Label名稱',
97
- placeHolder: `請輸入Label名稱`,
98
- default: dd.title,
99
- callback: (text) => {
100
- dd.title = text;
101
- if (obj.user_mode) {
102
- dd.key = text;
103
- }
104
- refresh();
105
- },
106
- }),
107
- EditorElem.select({
108
- title: '是否必填',
109
- gvc: gvc,
110
- def: dd.require,
111
- array: [
112
- {
113
- title: '是',
114
- value: 'true',
115
- },
116
- {
117
- title: '否',
118
- value: 'false',
119
- },
120
- ],
121
- callback: (text) => {
122
- dd.require = text;
123
- gvc.notifyDataChange(id);
124
- },
125
- }),
126
- ...(() => {
127
- dd.formFormat = dd.formFormat ?? '{}';
128
- dd.col = dd.col ?? '12';
129
- dd.col_sm = dd.col_sm ?? '12';
130
- const html = String.raw;
131
- let config_array = [
132
- EditorElem.buttonPrimary(
133
- dd.moduleName || '選擇表單插件',
134
- gvc.event(() => {
135
- editor_refer.toggle({
136
- visible: true,
137
- view: gvc.bindView(() => {
138
- return {
139
- bind: gvc.glitter.getUUID(),
140
- view: () => {
141
- return new Promise((resolve, reject) => {
142
- (window.parent as any).glitter.getModule(
143
- new URL((window.parent as any).glitter.root_path + 'editor/add-component.js').href,
144
- (AddComponent: any) => {
145
- resolve(
146
- AddComponent.addModuleView(
147
- gvc,
148
- 'form_plugin',
149
- (tData: any) => {
150
- dd.appName = tData.copyApp;
151
- dd.page = tData.copy;
152
- dd.moduleName = tData.title;
153
- editor_refer.back();
154
- gvc.notifyDataChange(id);
155
- },
156
- false,
157
- true,
158
- obj.user_mode
159
- )
160
- );
161
- }
162
- );
163
- });
164
- },
165
- };
166
- }),
167
- title: '選擇插件',
168
- });
169
- })
170
- ),
171
- html`
172
- <div class="position-relative bgf6 d-flex align-items-center justify-content-between mx-n2 border-top p-2 border-bottom shadow">
173
- <span class="fs-6 fw-bold " style="color:black;">表單設計</span>
174
- </div>`,
175
- html`
176
- <div class="alert alert-info fs-6 fw-500"
177
- style="white-space: normal;">
178
- 一列有12格,可自定義手機版與電腦版每列的顯示格數
179
- </div>
180
- <div class="d-flex align-items-center"
181
- style="gap:10px;">
182
- <div class="fs-6 fw-500">電腦版</div>
183
- <input
184
- class="form-control flex-fill"
185
- type="number"
186
- placeholder=""
187
- value="${dd.col}"
188
- onchange="${obj.gvc.event((e, event) => {
189
- dd.col = e.value;
190
- })}"
191
- />
192
- <div class="fs-6 fw-500">手機版</div>
193
- <input
194
- class="form-control flex-fill"
195
- type="number"
196
- value="${dd.col_sm}"
197
- onchange="${obj.gvc.event((e, event) => {
198
- dd.col_sm = e.value;
199
- })}"
200
- placeholder=""
201
- />
202
- </div>
203
- `,
204
- ];
205
- if (!obj.user_mode) {
206
- config_array = config_array.concat([
207
- html`
208
- <div class="position-relative bgf6 d-flex align-items-center justify-content-between mx-n2 border-top p-2 border-bottom shadow">
209
- <span class="fs-6 fw-bold "
210
- style="color:black;">進階設定</span>
211
- </div>`,
212
- EditorElem.editeInput({
213
- gvc: gvc,
214
- title: 'Key標籤',
215
- placeHolder: `請輸入Key標籤`,
216
- default: dd.key,
217
- callback: (text) => {
218
- dd.key = text;
219
- refresh();
220
- },
221
- }),
222
- EditorElem.editeInput({
223
- gvc: gvc,
224
- title: '分類標籤',
225
- placeHolder: `請輸入分類標籤`,
226
- default: dd.category,
227
- callback: (text) => {
228
- dd.category = text;
229
- refresh();
230
- },
231
- }),
232
- EditorElem.buttonPrimary(
233
- '隱藏條件',
234
- gvc.event(() => {
235
- editor_refer.toggle({
236
- visible: true,
237
- view: `<div class="p-2">${gvc.bindView(() => {
238
- return {
239
- bind: gvc.glitter.getUUID(),
240
- view: () => {
241
- return new Promise((resolve, reject) => {
242
- resolve(
243
- EditorElem.codeEditor({
244
- gvc: gvc,
245
- height: 500,
246
- initial: dd.hidden_code || '',
247
- title: '代碼區塊',
248
- callback: (text) => {
249
- dd.hidden_code = text;
250
- },
251
- structStart: `((form_data,form_key)=>{`,
252
- })
253
- );
254
- });
255
- },
256
- };
257
- })}</div>`,
258
- title: '選擇插件',
259
- });
260
- })
261
- ),
262
- ]);
263
- } else {
264
- dd.key = dd.title;
265
- }
266
- config_array.push(
267
- gvc.bindView(() => {
268
- return {
269
- bind: gvc.glitter.getUUID(),
270
- view: () => {
271
- return new Promise(async (resolve, reject) => {
272
- if (!dd.page) {
273
- resolve('');
274
- }
275
- let formFormat = (
276
- await ApiPageConfig.getPage({
277
- appName: dd.appName,
278
- tag: dd.page,
279
- })
280
- ).response.result[0].page_config.formFormat;
281
-
282
- if (formFormat && formFormat.length > 0) {
283
- dd.form_config = dd.form_config || {};
284
- resolve(
285
- html`
286
- <div
287
- class="position-relative bgf6 d-flex align-items-center justify-content-between mx-n2 border-top p-2 border-bottom shadow"
288
- >
289
- <span class="fs-6 fw-bold "
290
- style="color:black;">插件內容編輯</span>
291
- </div>
292
- <div class="mx-n2">
293
- ${FormWidget.editorView({
294
- gvc: gvc,
295
- array: formFormat,
296
- refresh: (key: string) => {
297
- },
298
- formData: dd.form_config,
299
- })}
300
- </div>`
301
- );
302
- } else {
303
- if (obj.user_mode) {
304
- resolve('');
305
- } else {
306
- resolve(
307
- EditorElem.customCodeEditor({
308
- gvc: gvc,
309
- height: 400,
310
- initial: dd.formFormat,
311
- title: 'Config配置檔',
312
- callback: (data) => {
313
- dd.form_config = undefined;
314
- dd.formFormat = data;
315
- },
316
- language: 'json',
317
- })
318
- );
319
- }
320
- }
321
- });
322
- },
323
- };
324
- })
325
- );
326
- return config_array;
327
- })(),
328
- ].join('<div class="my-2"></div>')}
329
- <div style="height:50px;"></div>
330
- `;
331
- },
332
- divCreate: {
333
- class: `p-2`,
334
- },
152
+ bind: gvc.glitter.getUUID(),
153
+ view: () => {
154
+ return new Promise((resolve, reject) => {
155
+ (window.parent as any).glitter.getModule(
156
+ new URL(
157
+ (window.parent as any).glitter.root_path + 'editor/add-component.js'
158
+ ).href,
159
+ (AddComponent: any) => {
160
+ resolve(
161
+ AddComponent.addModuleView(
162
+ gvc,
163
+ 'form_plugin',
164
+ (tData: any) => {
165
+ dd.appName = tData.copyApp;
166
+ dd.page = tData.copy;
167
+ dd.moduleName = tData.title;
168
+ editor_refer.back();
169
+ gvc.notifyDataChange(id);
170
+ },
171
+ false,
172
+ true,
173
+ obj.user_mode
174
+ )
175
+ );
176
+ }
177
+ );
178
+ });
179
+ },
335
180
  };
181
+ }),
182
+ title: '選擇插件',
336
183
  });
337
- })(),
338
- width: 400,
339
- });
340
- },
341
- expand: dd,
342
- minus: gvc.event(() => {
343
- array.splice(index, 1);
344
- refresh();
345
- }),
346
- };
347
- });
348
- },
349
- copyable: true,
350
- originalArray: array,
351
- expand: {},
352
- plus: {
353
- title: '新增選項',
354
- event: gvc.event((e, event) => {
355
- array.push({
356
- key: 'r_' + new Date().getTime(),
357
- page: 'input',
358
- type: 'form_plugin_v2',
359
- group: '',
360
- title: '標題',
361
- appName: 'cms_system',
362
- require: 'true',
363
- readonly: 'write',
364
- formFormat: '{}',
365
- moduleName: '輸入框',
366
- style_data: {
367
- input: {
368
- list: [],
369
- class: '',
370
- style: '',
371
- version: 'v2',
372
- },
373
- label: {
374
- list: [],
375
- class: 'form-label fs-base ',
376
- style: '',
377
- version: 'v2',
378
- },
379
- container: {
380
- list: [],
381
- class: '',
382
- style: '',
383
- version: 'v2',
384
- },
385
- },
386
- form_config: {
387
- type: 'name',
388
- title: '',
389
- place_holder: '',
390
- },
391
- });
392
- refresh();
393
- }),
394
- },
395
- refreshComponent: () => {
396
- refresh();
397
- },
398
- customEditor: true,
399
- });
400
- }
401
-
402
- public static editorView(obj: {
403
- gvc: GVC;
404
- array: any;
405
- refresh: (key: string) => void;
406
- widget?: any;
407
- subData?: any;
408
- formData: any;
409
- readonly?: 'read' | 'write' | 'block'
410
- }) {
411
- const html = String.raw;
412
- const glitter = obj.gvc.glitter;
413
- const gvc = obj.gvc;
414
- const formData = obj.formData;
415
- function getRaw(array: []) {
416
- return array
417
- .map(
418
- (dd: {
419
- placeHolder?: string;
420
- def?: any;
421
- form_config?: string;
422
- group?: string;
423
- plusBtn?: string;
424
- formList: any;
425
- referTitile?: string;
426
- title: string;
427
- key: string;
428
- readonly: 'read' | 'write' | 'block';
429
- type: 'file' | 'text' | 'number' | 'textArea' | 'address' | 'array' | 'select' | 'page_select' | 'fontawesome' | 'form_plugin' | 'form_plugin_v2';
430
- require: 'true' | 'false';
431
- style_data: {
432
- label: {
433
- class: string;
434
- style: string;
435
- };
436
- input: {
437
- class: string;
438
- style: string;
439
- };
440
- container: {
441
- class: string;
442
- style: string;
443
- };
444
- };
445
- hidden_code: string;
446
- col?: any;
447
- col_sm?: any;
448
- }) => {
449
- const form_data = formData;
450
- const form_key = dd.key;
451
- const labelCSS = glitter.htmlGenerate.editor_component(dd.style_data.label, gvc, obj.widget, obj.subData);
452
- const inputCSS = glitter.htmlGenerate.editor_component(dd.style_data.input, gvc, obj.widget as any, obj.subData);
453
- const containerCss = glitter.htmlGenerate.editor_component(dd.style_data.container, gvc, obj.widget, obj.subData);
454
- const label = html`<label class="${labelCSS.class()}" style="${labelCSS.style()}"
455
- ><span class="text-danger ${dd.require === 'true' ? `` : 'd-none'}"> * </span>${dd.title}</label
456
- >`;
457
- const containerClass = `${dd.col ? `col-sm-${dd.col}` : 'col-sm-12'} ${dd.col_sm ? `col-${dd.col_sm}` : 'col-12'} ${containerCss.class() ?? ``}`;
458
- const containerStyle = containerCss.style() ?? ``;
459
- const inputClass = inputCSS.class() || 'form-control';
460
- const inputStyle = inputCSS.style() || '';
461
- if (!formData[dd.key]) {
462
- formData[dd.key] = dd.def;
463
- }
464
- //當參數不可見時
465
- if (dd.readonly === 'block') {
466
- return ``;
467
- }
468
- const readonly = dd.readonly === 'read' || obj.readonly === 'read';
469
- switch (dd.type) {
470
- case 'textArea':
471
- const textID = gvc.glitter.getUUID();
472
- return html`
473
- <div class="${containerClass}" style="${containerStyle}">
474
- ${label}
475
- ${obj.gvc.bindView({
476
- bind: textID,
477
- view: () => {
478
- return formData[dd.key] ?? '';
479
- },
480
- divCreate: {
481
- elem: `textArea`,
482
- style: inputStyle,
483
- class: inputClass,
484
- option: [
485
- {
486
- key: 'onchange',
487
- value: obj.gvc.event((e) => {
488
- formData[dd.key] = e.value;
489
- obj.refresh(dd.key);
490
- }),
491
- },
492
- ...(() => {
493
- if (readonly) {
494
- return [{key: 'readonly', value: ''}];
495
- } else {
496
- return [];
497
- }
498
- })(),
499
- ],
500
- },
501
- onCreate: () => {
502
- autosize(obj.gvc.getBindViewElem(textID));
503
- },
504
- })}
505
- </div>`;
506
- case 'array':
507
- formData[dd.key] = Array.isArray(formData[dd.key]) ? formData[dd.key] : [];
508
- return gvc.bindView(() => {
509
- const arrayViewID = gvc.glitter.getUUID();
510
- return {
511
- bind: arrayViewID,
512
- view: () => {
513
- return html`
514
- <div class="${containerClass} mt-2" style="${containerStyle}">
515
- ${label}
516
- ${EditorElem.arrayItem({
517
- gvc: gvc,
518
- title: '',
519
- array: () => {
520
- return formData[dd.key].map((d2: any, index: number) => {
521
- return {
522
- title: d2[dd.referTitile!] || `選項:${index + 1}`,
523
- innerHtml: (gvc: GVC) => {
524
- return html`
525
- <div class="my-2">
526
- ${FormWidget.editorView({
527
- gvc: gvc,
528
- array: dd.formList,
529
- refresh: (key: string) => {
530
- obj.refresh(dd.key);
531
- },
532
- widget: obj.widget,
533
- subData: obj.subData,
534
- formData: d2,
535
- readonly: obj.readonly,
536
- })}
537
- </div>`;
538
- },
539
- };
540
- });
541
- },
542
- originalArray: formData[dd.key],
543
- expand: {},
544
- refreshComponent: () => {
545
- obj.refresh(dd.key);
546
- gvc.notifyDataChange(arrayViewID);
547
- },
548
- plus: {
549
- title: dd.plusBtn!,
550
- event: gvc.event(() => {
551
- formData[dd.key].push({});
552
- gvc.notifyDataChange(arrayViewID);
553
- obj.refresh(dd.key);
554
- }),
555
- },
556
- })}
557
- </div>`;
558
- },
559
- };
560
- });
561
- case 'file':
562
- return EditorElem.uploadFile({
563
- title: label,
184
+ })
185
+ ),
186
+ html` <div
187
+ class="position-relative bgf6 d-flex align-items-center justify-content-between mx-n2 border-top p-2 border-bottom shadow"
188
+ >
189
+ <span class="fs-6 fw-bold " style="color:black;">表單設計</span>
190
+ </div>`,
191
+ html`
192
+ <div class="alert alert-info fs-6 fw-500" style="white-space: normal;">
193
+ 一列有12格,可自定義手機版與電腦版每列的顯示格數
194
+ </div>
195
+ <div class="d-flex align-items-center" style="gap:10px;">
196
+ <div class="fs-6 fw-500">電腦版</div>
197
+ <input
198
+ class="form-control flex-fill"
199
+ type="number"
200
+ placeholder=""
201
+ value="${dd.col}"
202
+ onchange="${obj.gvc.event((e, event) => {
203
+ dd.col = e.value;
204
+ })}"
205
+ />
206
+ <div class="fs-6 fw-500">手機版</div>
207
+ <input
208
+ class="form-control flex-fill"
209
+ type="number"
210
+ value="${dd.col_sm}"
211
+ onchange="${obj.gvc.event((e, event) => {
212
+ dd.col_sm = e.value;
213
+ })}"
214
+ placeholder=""
215
+ />
216
+ </div>
217
+ `,
218
+ ];
219
+ if (!obj.user_mode) {
220
+ config_array = config_array.concat([
221
+ html` <div
222
+ class="position-relative bgf6 d-flex align-items-center justify-content-between mx-n2 border-top p-2 border-bottom shadow"
223
+ >
224
+ <span class="fs-6 fw-bold " style="color:black;">進階設定</span>
225
+ </div>`,
226
+ EditorElem.editeInput({
564
227
  gvc: gvc,
565
- def: formData[dd.key],
566
- callback: (text) => {
567
- formData[dd.key] = text;
568
- obj.refresh(dd.key);
228
+ title: 'Key標籤',
229
+ placeHolder: `請輸入Key標籤`,
230
+ default: dd.key,
231
+ callback: text => {
232
+ dd.key = text;
233
+ refresh();
569
234
  },
570
- readonly: readonly ?? false,
571
- });
572
- case 'select':
573
- formData[dd.key] = formData[dd.key] ?? (dd.formList[0] ?? {}).key;
574
- return EditorElem.select({
575
- title: label,
235
+ }),
236
+ EditorElem.editeInput({
576
237
  gvc: gvc,
577
- class: inputClass ?? '',
578
- style: inputStyle ?? '',
579
- def: formData[dd.key],
580
- array: dd.formList.map((dd: any) => {
581
- return {
582
- title: dd.title,
583
- value: dd.key,
584
- };
585
- }),
586
- readonly: readonly ?? false,
587
- callback: (text) => {
588
- if (!readonly) {
589
- formData[dd.key] = text;
590
- obj.refresh(dd.key);
591
- }
592
- },
593
- });
594
- case 'page_select':
595
- return EditorElem.pageSelect(
596
- gvc,
597
- '選擇頁面',
598
- formData[dd.key],
599
- (data) => {
600
- formData[dd.key] = data;
238
+ title: '分類標籤',
239
+ placeHolder: `請輸入分類標籤`,
240
+ default: dd.category,
241
+ callback: text => {
242
+ dd.category = text;
243
+ refresh();
601
244
  },
602
- (dd) => {
603
- return dd.group !== 'glitter-article';
604
- }
605
- );
606
- case 'fontawesome':
607
- return html`
608
- <div class="${containerClass}" style="${containerStyle}">
609
- ${label}
610
- <div class="alert alert-info p-2 mb-2"
611
- style="word-break: break-word;white-space: normal;">
612
- 前往<a
613
- onclick="${gvc.event(() => {
614
- glitter.openNewTab('https://fontawesome.com');
615
- })}"
616
- style="cursor: pointer;"
617
- class="mx-2 fw-bold mb-1"
618
- >Fontawesome</a
619
- >官網,查找ICON標籤。
620
- </div>
621
- <input
622
- type="text"
623
- value="${formData[dd.key] ?? ''}"
624
- class="${inputClass}"
625
- style="${inputStyle}"
626
- onchange="${gvc.event((e, event) => {
627
- formData[dd.key] = e.value;
628
- obj.refresh(dd.key);
629
- })}"
630
- ${readonly ? `readonly` : ``}
631
- />
632
- </div>`;
633
- case 'form_plugin':
634
- return gvc.bindView(() => {
635
- return {
636
- bind: gvc.glitter.getUUID(),
637
- view: () => {
638
- return new Promise((resolve, reject) => {
639
- const url = new URL((dd as any).route, import.meta.url);
640
- (window as any).glitter.getModule(url.href, (module: any) => {
641
- resolve(
642
- module({
643
- gvc: gvc,
644
- formData: formData,
645
- key: dd.key,
646
- })
647
- );
648
- });
649
- });
650
- },
651
- divCreate: {
652
- class: containerClass,
653
- style: containerStyle,
654
- },
655
- };
656
- });
657
- case 'form_plugin_v2':
658
- if (dd.hidden_code && dd.hidden_code.trim() && eval(`(() => {
659
- ${dd.hidden_code}
660
- })()`)) {
661
- return ``;
662
- }
663
- return gvc.bindView(() => {
245
+ }),
246
+ EditorElem.buttonPrimary(
247
+ '隱藏條件',
248
+ gvc.event(() => {
249
+ editor_refer.toggle({
250
+ visible: true,
251
+ view: `<div class="p-2">${gvc.bindView(() => {
252
+ return {
253
+ bind: gvc.glitter.getUUID(),
254
+ view: () => {
255
+ return new Promise((resolve, reject) => {
256
+ resolve(
257
+ EditorElem.codeEditor({
258
+ gvc: gvc,
259
+ height: 500,
260
+ initial: dd.hidden_code || '',
261
+ title: '代碼區塊',
262
+ callback: text => {
263
+ dd.hidden_code = text;
264
+ },
265
+ structStart: `((form_data,form_key)=>{`,
266
+ })
267
+ );
268
+ });
269
+ },
270
+ };
271
+ })}</div>`,
272
+ title: '選擇插件',
273
+ });
274
+ })
275
+ ),
276
+ ]);
277
+ } else {
278
+ dd.key = dd.title;
279
+ }
280
+ config_array.push(
281
+ gvc.bindView(() => {
282
+ return {
283
+ bind: gvc.glitter.getUUID(),
284
+ view: () => {
285
+ return new Promise(async (resolve, reject) => {
286
+ if (!dd.page) {
287
+ resolve('');
288
+ }
289
+ let formFormat = (
290
+ await ApiPageConfig.getPage({
291
+ appName: dd.appName,
292
+ tag: dd.page,
293
+ })
294
+ ).response.result[0].page_config.formFormat;
664
295
 
665
- const tempView = gvc.glitter.getUUID();
666
- return {
667
- bind: tempView,
668
- view: () => {
669
- return ``;
670
- },
671
- divCreate: {
672
- class: containerClass,
673
- style: containerStyle,
674
- },
675
- onCreate: () => {
676
- },
677
- onInitial: () => {
678
- const target = gvc.glitter.document.querySelector(`[gvc-id="${gvc.id(tempView)}"]`);
679
- (window as any).glitterInitialHelper.getPageData(
680
- {
681
- tag: (dd as any).page,
682
- appName: (dd as any).appName || (window as any).appName,
296
+ if (formFormat && formFormat.length > 0) {
297
+ dd.form_config = dd.form_config || {};
298
+ resolve(
299
+ html` <div
300
+ class="position-relative bgf6 d-flex align-items-center justify-content-between mx-n2 border-top p-2 border-bottom shadow"
301
+ >
302
+ <span class="fs-6 fw-bold " style="color:black;">插件內容編輯</span>
303
+ </div>
304
+ <div class="mx-n2">
305
+ ${FormWidget.editorView({
306
+ gvc: gvc,
307
+ array: formFormat,
308
+ refresh: (key: string) => {},
309
+ formData: dd.form_config,
310
+ })}
311
+ </div>`
312
+ );
313
+ } else {
314
+ if (obj.user_mode) {
315
+ resolve('');
316
+ } else {
317
+ resolve(
318
+ EditorElem.customCodeEditor({
319
+ gvc: gvc,
320
+ height: 400,
321
+ initial: dd.formFormat,
322
+ title: 'Config配置檔',
323
+ callback: data => {
324
+ dd.form_config = undefined;
325
+ dd.formFormat = data;
683
326
  },
684
- (d2: any) => {
685
- let data = d2.response.result[0];
686
- data.config = data.config ?? [];
687
- data.config.map((dd: any) => {
688
- glitter.htmlGenerate.renameWidgetID(dd);
689
- });
690
- let createOption: any = {
691
- class: containerClass,
692
- style: containerStyle,
693
- };
694
- createOption.option = createOption.option ?? [];
695
- createOption.childContainer = true;
696
- data.config.formData = data.page_config.formData;
697
- let viewConfig = data.config;
698
- const id = gvc.glitter.getUUID();
327
+ language: 'json',
328
+ })
329
+ );
330
+ }
331
+ }
332
+ });
333
+ },
334
+ };
335
+ })
336
+ );
337
+ return config_array;
338
+ })(),
339
+ ].join('<div class="my-2"></div>')}
340
+ <div style="height:50px;"></div> `;
341
+ },
342
+ divCreate: {
343
+ class: `p-2`,
344
+ },
345
+ };
346
+ });
347
+ })(),
348
+ width: 400,
349
+ });
350
+ },
351
+ expand: dd,
352
+ minus: gvc.event(() => {
353
+ array.splice(index, 1);
354
+ refresh();
355
+ }),
356
+ };
357
+ });
358
+ },
359
+ copyable: true,
360
+ originalArray: array,
361
+ expand: {},
362
+ plus: {
363
+ title: '新增選項',
364
+ event: gvc.event((e, event) => {
365
+ array.push({
366
+ key: 'r_' + new Date().getTime(),
367
+ page: 'input',
368
+ type: 'form_plugin_v2',
369
+ group: '',
370
+ title: '標題',
371
+ appName: 'cms_system',
372
+ require: 'true',
373
+ readonly: 'write',
374
+ formFormat: '{}',
375
+ moduleName: '輸入框',
376
+ style_data: {
377
+ input: {
378
+ list: [],
379
+ class: '',
380
+ style: '',
381
+ version: 'v2',
382
+ },
383
+ label: {
384
+ list: [],
385
+ class: 'form-label fs-base ',
386
+ style: '',
387
+ version: 'v2',
388
+ },
389
+ container: {
390
+ list: [],
391
+ class: '',
392
+ style: '',
393
+ version: 'v2',
394
+ },
395
+ },
396
+ form_config: {
397
+ type: 'name',
398
+ title: '',
399
+ place_holder: '',
400
+ },
401
+ });
402
+ refresh();
403
+ }),
404
+ },
405
+ refreshComponent: () => {
406
+ refresh();
407
+ },
408
+ customEditor: true,
409
+ });
410
+ }
699
411
 
700
- function getView() {
701
- function loop(array: any) {
702
- array.map((dd: any) => {
703
- if (dd.type === 'container') {
704
- loop(dd.data.setting ?? []);
705
- }
706
- dd.formData = undefined;
707
- });
708
- }
709
- loop(viewConfig);
710
- return new glitter.htmlGenerate(viewConfig, [], {
711
- root_form_data: obj.widget && obj.widget.formData,
712
- root_widget: obj.widget,
713
- form_data: formData,
714
- form_key: dd.key,
715
- form_config: dd.form_config || JSON.parse((dd as any).formFormat || '{}'),
716
- form_title: dd.title,
717
- refresh: () => {
718
- obj.refresh(dd.key);
719
- },
720
- }).render(
721
- gvc,
722
- {
723
- class: containerClass,
724
- style: containerStyle,
725
- containerID: id,
726
- jsFinish: () => {
727
- },
728
- onCreate: () => {
729
- },
730
- },
731
- createOption ?? {}
732
- );
733
- }
412
+ static select(obj: {
413
+ gvc: GVC;
414
+ callback: (value: any) => void;
415
+ default: string;
416
+ options: OptionsItem[];
417
+ style?: string;
418
+ title?: string;
419
+ readonly?: boolean;
420
+ place_holder?: string;
421
+ }) {
422
+ return html` ${obj.title ? html` <div class="tx_normal fw-normal mb-2">${obj.title}</div>` : ``}
423
+ <select
424
+ class="c_select c_select_w_100"
425
+ style="${obj.style ?? ''}; ${obj.readonly ? 'background: #f7f7f7;' : ''}"
426
+ onchange="${obj.gvc.event(e => {
427
+ obj.callback(e.value);
428
+ })}"
429
+ ${obj.readonly ? 'disabled' : ''}
430
+ >
431
+ ${obj.gvc.map(
432
+ obj.options.map(
433
+ opt =>
434
+ html` <option class="c_select_option" value="${opt.key}" ${obj.default === opt.key ? 'selected' : ''}>
435
+ ${opt.value}
436
+ </option>`
437
+ )
438
+ )}
439
+ ${(obj.options as any).find((opt: any) => {
440
+ return obj.default === opt.key;
441
+ })
442
+ ? ``
443
+ : `<option class="d-none" selected>${obj.place_holder || `請選擇項目`}</option>`}
444
+ </select>`;
445
+ }
734
446
 
735
- try {
736
- target && (target!.outerHTML = getView());
737
- } catch (e) {
738
- }
739
- }
740
- );
741
- },
742
- };
743
- });
744
- default:
745
- }
746
- return html`
747
- <div class=" ${containerClass}" style="${containerStyle}">
748
- ${label}
749
- <input
750
- type="${dd.type}"
751
- value="${formData[dd.key] ?? ''}"
752
- class="${inputClass}"
753
- style="${inputStyle}"
754
- onchange="${gvc.event((e, event) => {
755
- formData[dd.key] = e.value;
756
- obj.refresh(dd.key);
757
- })}"
758
- placeholder="${dd.placeHolder ?? ''}"
759
- ${readonly ? `readonly` : ``}
760
- />
761
- </div>
762
- `;
447
+ static grayButton(text: string, event: string, obj?: { icon?: string; textStyle?: string; class?: string }) {
448
+ return html` <button class="btn btn-gray ${obj?.class || ''}" type="button" onclick="${event}">
449
+ <i class="${obj && obj.icon && obj.icon.length > 0 ? obj.icon : 'd-none'}" style="color: #393939"></i>
450
+ ${text.length > 0 ? html`<span class="tx_700" style="${obj?.textStyle ?? ''}">${text}</span>` : ''}
451
+ </button>`;
452
+ }
453
+
454
+ public static editorView(obj: {
455
+ gvc: GVC;
456
+ array: any;
457
+ refresh: (key: string) => void;
458
+ widget?: any;
459
+ subData?: any;
460
+ formData: any;
461
+ oWidget?: any;
462
+ readonly?: 'read' | 'write' | 'block';
463
+ }) {
464
+ const html = String.raw;
465
+ const glitter = obj.gvc.glitter;
466
+ const gvc = obj.gvc;
467
+ const formData = obj.formData;
468
+
469
+ function getRaw(array: []) {
470
+ return array
471
+ .map(
472
+ (dd: {
473
+ placeHolder?: string;
474
+ def?: any;
475
+ form_config?: string;
476
+ group?: string;
477
+ plusBtn?: string;
478
+ formList: any;
479
+ referTitile?: string;
480
+ title: string;
481
+ key: string;
482
+ readonly: 'read' | 'write' | 'block';
483
+ type:
484
+ | 'file'
485
+ | 'text'
486
+ | 'number'
487
+ | 'textArea'
488
+ | 'address'
489
+ | 'array'
490
+ | 'select'
491
+ | 'page_select'
492
+ | 'fontawesome'
493
+ | 'form_plugin'
494
+ | 'form_plugin_v2';
495
+ require: 'true' | 'false';
496
+ style_data: {
497
+ label: {
498
+ class: string;
499
+ style: string;
500
+ };
501
+ input: {
502
+ class: string;
503
+ style: string;
504
+ };
505
+ container: {
506
+ class: string;
507
+ style: string;
508
+ };
509
+ };
510
+ hidden_code: string;
511
+ col?: any;
512
+ col_sm?: any;
513
+ }) => {
514
+ const form_data = formData;
515
+ const form_key = dd.key;
516
+ const labelCSS = glitter.htmlGenerate.editor_component(dd.style_data.label, gvc, obj.widget, obj.subData);
517
+ const inputCSS = glitter.htmlGenerate.editor_component(
518
+ dd.style_data.input,
519
+ gvc,
520
+ obj.widget as any,
521
+ obj.subData
522
+ );
523
+ const containerCss = glitter.htmlGenerate.editor_component(
524
+ dd.style_data.container,
525
+ gvc,
526
+ obj.widget,
527
+ obj.subData
528
+ );
529
+ const label = html`<label class="${labelCSS.class()}" style="${labelCSS.style()}"
530
+ ><span class="text-danger ${dd.require === 'true' ? `` : 'd-none'}"> * </span>${dd.title}</label
531
+ >`;
532
+ const containerClass = `${dd.col ? `col-sm-${dd.col}` : 'col-sm-12'} ${dd.col_sm ? `col-${dd.col_sm}` : 'col-12'} ${containerCss.class() ?? ``}`;
533
+ const containerStyle = containerCss.style() ?? ``;
534
+ const inputClass = inputCSS.class() || 'form-control';
535
+ const inputStyle = inputCSS.style() || '';
536
+ if (!formData[dd.key]) {
537
+ formData[dd.key] = dd.def;
538
+ }
539
+ //當參數不可見時
540
+ if (dd.readonly === 'block') {
541
+ return ``;
542
+ }
543
+ const readonly = dd.readonly === 'read' || obj.readonly === 'read';
544
+ switch (dd.type) {
545
+ case 'textArea':
546
+ const textID = gvc.glitter.getUUID();
547
+ return html` <div class="${containerClass}" style="${containerStyle}">
548
+ ${label}
549
+ ${obj.gvc.bindView({
550
+ bind: textID,
551
+ view: () => {
552
+ return formData[dd.key] ?? '';
553
+ },
554
+ divCreate: {
555
+ elem: `textArea`,
556
+ style: inputStyle,
557
+ class: inputClass,
558
+ option: [
559
+ {
560
+ key: 'onchange',
561
+ value: obj.gvc.event(e => {
562
+ formData[dd.key] = e.value;
563
+ obj.refresh(dd.key);
564
+ }),
565
+ },
566
+ ...(() => {
567
+ if (readonly) {
568
+ return [{ key: 'readonly', value: '' }];
569
+ } else {
570
+ return [];
571
+ }
572
+ })(),
573
+ ],
574
+ },
575
+ onCreate: () => {
576
+ autosize(obj.gvc.getBindViewElem(textID));
577
+ },
578
+ })}
579
+ </div>`;
580
+ case 'array':
581
+ formData[dd.key] = Array.isArray(formData[dd.key]) ? formData[dd.key] : [];
582
+ return gvc.bindView(() => {
583
+ const arrayViewID = gvc.glitter.getUUID();
584
+ return {
585
+ bind: arrayViewID,
586
+ view: () => {
587
+ return html` <div class="${containerClass} mt-2" style="${containerStyle}">
588
+ ${label}
589
+ ${EditorElem.arrayItem({
590
+ gvc: gvc,
591
+ title: '',
592
+ array: () => {
593
+ return formData[dd.key].map((d2: any, index: number) => {
594
+ return {
595
+ title: d2[dd.referTitile!] || `選項:${index + 1}`,
596
+ innerHtml: (gvc: GVC) => {
597
+ return html` <div class="my-2">
598
+ ${FormWidget.editorView({
599
+ gvc: gvc,
600
+ array: dd.formList,
601
+ refresh: (key: string) => {
602
+ obj.refresh(dd.key);
603
+ },
604
+ widget: obj.widget,
605
+ subData: obj.subData,
606
+ formData: d2,
607
+ readonly: obj.readonly,
608
+ })}
609
+ </div>`;
610
+ },
611
+ };
612
+ });
613
+ },
614
+ originalArray: formData[dd.key],
615
+ expand: {},
616
+ refreshComponent: () => {
617
+ obj.refresh(dd.key);
618
+ gvc.notifyDataChange(arrayViewID);
619
+ },
620
+ plus: {
621
+ title: dd.plusBtn!,
622
+ event: gvc.event(() => {
623
+ formData[dd.key].push({});
624
+ gvc.notifyDataChange(arrayViewID);
625
+ obj.refresh(dd.key);
626
+ }),
627
+ },
628
+ })}
629
+ </div>`;
630
+ },
631
+ };
632
+ });
633
+ case 'file':
634
+ return EditorElem.uploadFile({
635
+ title: label,
636
+ gvc: gvc,
637
+ def: formData[dd.key],
638
+ callback: text => {
639
+ formData[dd.key] = text;
640
+ obj.refresh(dd.key);
641
+ },
642
+ readonly: readonly ?? false,
643
+ });
644
+ case 'select':
645
+ formData[dd.key] = formData[dd.key] ?? (dd.formList[0] ?? {}).key;
646
+ return EditorElem.select({
647
+ title: label,
648
+ gvc: gvc,
649
+ class: inputClass ?? '',
650
+ style: inputStyle ?? '',
651
+ def: formData[dd.key],
652
+ array: dd.formList.map((dd: any) => {
653
+ return {
654
+ title: dd.title,
655
+ value: dd.key,
656
+ };
657
+ }),
658
+ readonly: readonly ?? false,
659
+ callback: text => {
660
+ if (!readonly) {
661
+ formData[dd.key] = text;
662
+ obj.refresh(dd.key);
763
663
  }
764
- )
765
- .join('');
766
- }
767
- let groupList: any = {};
768
- if (Array.isArray(obj.array)) {
769
- obj.array.map((dd: any) => {
770
- dd.group = dd.group ?? '';
771
- groupList[dd.group] = groupList[dd.group] ?? [];
772
- groupList[dd.group].push(dd);
773
- });
774
- }
664
+ },
665
+ });
666
+ case 'page_select':
667
+ return EditorElem.pageSelect(
668
+ gvc,
669
+ '選擇頁面',
670
+ formData[dd.key],
671
+ data => {
672
+ formData[dd.key] = data;
673
+ },
674
+ dd => {
675
+ return dd.group !== 'glitter-article';
676
+ }
677
+ );
678
+ case 'fontawesome':
679
+ return html` <div class="${containerClass}" style="${containerStyle}">
680
+ ${label}
681
+ <div class="alert alert-info p-2 mb-2" style="word-break: break-word;white-space: normal;">
682
+ 前往<a
683
+ onclick="${gvc.event(() => {
684
+ glitter.openNewTab('https://fontawesome.com');
685
+ })}"
686
+ style="cursor: pointer;"
687
+ class="mx-2 fw-bold mb-1"
688
+ >Fontawesome</a
689
+ >官網,查找ICON標籤。
690
+ </div>
691
+ <input
692
+ type="text"
693
+ value="${formData[dd.key] ?? ''}"
694
+ class="${inputClass}"
695
+ style="${inputStyle}"
696
+ onchange="${gvc.event((e, event) => {
697
+ formData[dd.key] = e.value;
698
+ obj.refresh(dd.key);
699
+ })}"
700
+ ${readonly ? `readonly` : ``}
701
+ />
702
+ </div>`;
703
+ case 'form_plugin':
704
+ return gvc.bindView(() => {
705
+ return {
706
+ bind: gvc.glitter.getUUID(),
707
+ view: () => {
708
+ return new Promise((resolve, reject) => {
709
+ const url = new URL((dd as any).route, import.meta.url);
710
+ (window as any).glitter.getModule(url.href, (module: any) => {
711
+ resolve(
712
+ module({
713
+ gvc: gvc,
714
+ formData: formData,
715
+ key: dd.key,
716
+ })
717
+ );
718
+ });
719
+ });
720
+ },
721
+ divCreate: {
722
+ class: containerClass,
723
+ style: containerStyle,
724
+ },
725
+ };
726
+ });
727
+ case 'form_plugin_v2':
728
+ if (
729
+ dd.hidden_code &&
730
+ dd.hidden_code.trim() &&
731
+ eval(`(() => {
732
+ ${dd.hidden_code}
733
+ })()`)
734
+ ) {
735
+ return ``;
736
+ }
737
+ return gvc.bindView(() => {
738
+ const tempView = gvc.glitter.getUUID();
739
+ return {
740
+ bind: tempView,
741
+ view: () => {
742
+ return ``;
743
+ },
744
+ divCreate: {
745
+ class: containerClass,
746
+ style: containerStyle,
747
+ },
748
+ onCreate: () => {},
749
+ onInitial: () => {
750
+ const target = gvc.glitter.document.querySelector(`[gvc-id="${gvc.id(tempView)}"]`);
751
+ (window as any).glitterInitialHelper.getPageData(
752
+ {
753
+ tag: (dd as any).page,
754
+ appName: (dd as any).appName || (window as any).appName,
755
+ },
756
+ (d2: any) => {
757
+ let data = d2.response.result[0];
758
+ data.config = data.config ?? [];
759
+ data.config.map((dd: any) => {
760
+ glitter.htmlGenerate.renameWidgetID(dd);
761
+ });
762
+ let createOption: any = {
763
+ class: containerClass,
764
+ style: containerStyle,
765
+ };
766
+ createOption.option = createOption.option ?? [];
767
+ createOption.childContainer = true;
768
+ data.config.formData = data.page_config.formData;
769
+ let viewConfig = data.config;
770
+ const id = gvc.glitter.getUUID();
775
771
 
776
- return html`<div class="row m-0 p-0">
777
- ${Object.keys(groupList)
778
- .map((key) => {
779
- if (key) {
780
- let toggle = {};
781
- return html`
782
- <div class="mt-2">
783
- ${EditorElem.toggleExpand({
784
- gvc: gvc,
785
- title: key,
786
- data: toggle,
787
- innerText: getRaw(groupList[key]),
788
- })}
789
- </div>`;
790
- } else {
791
- return getRaw(groupList[key]);
772
+ function getView() {
773
+ function loop(array: any) {
774
+ array.map((dd: any) => {
775
+ if (dd.type === 'container') {
776
+ loop(dd.data.setting ?? []);
777
+ }
778
+ dd.formData = undefined;
779
+ });
792
780
  }
793
- })
794
- .join('')}
795
- </div>`;
796
- }
797
781
 
798
- public static checkLeakData(form_config_list:any,formData:any){
799
- formData=formData || {}
800
- form_config_list=form_config_list || []
801
- const find = form_config_list.find((dd: any) => {
802
- return `${dd.require}` === 'true' && !formData[dd.key];
803
- });
782
+ loop(viewConfig);
783
+ return new glitter.htmlGenerate(viewConfig, [], {
784
+ root_form_data: obj.widget && obj.widget.formData,
785
+ root_widget: obj.widget,
786
+ form_data: formData,
787
+ form_key: dd.key,
788
+ form_config: dd.form_config || JSON.parse((dd as any).formFormat || '{}'),
789
+ form_title: dd.title,
790
+ refresh: () => {
791
+ obj.refresh(dd.key);
792
+ },
793
+ }).render(
794
+ gvc,
795
+ {
796
+ class: containerClass,
797
+ style: containerStyle,
798
+ containerID: id,
799
+ jsFinish: () => {},
800
+ onCreate: () => {},
801
+ },
802
+ createOption ?? {}
803
+ );
804
+ }
804
805
 
805
- return find && find.title;
806
+ try {
807
+ target && (target!.outerHTML = getView());
808
+ } catch (e) {}
809
+ }
810
+ );
811
+ },
812
+ };
813
+ });
814
+ default:
815
+ }
816
+ return html`
817
+ <div class=" ${containerClass}" style="${containerStyle}">
818
+ ${label}
819
+ <input
820
+ type="${dd.type}"
821
+ value="${formData[dd.key] ?? ''}"
822
+ class="${inputClass}"
823
+ style="${inputStyle}"
824
+ onchange="${gvc.event((e, event) => {
825
+ formData[dd.key] = e.value;
826
+ obj.refresh(dd.key);
827
+ })}"
828
+ placeholder="${dd.placeHolder ?? ''}"
829
+ ${readonly ? `readonly` : ``}
830
+ />
831
+ </div>
832
+ `;
833
+ }
834
+ )
835
+ .join('');
806
836
  }
807
- public static checkLeakDataObj(form_config_list:any,formData:any){
808
- formData=formData || {}
809
- form_config_list=form_config_list || []
810
- const find = form_config_list.find((dd: any) => {
811
- return (`${dd.require}` === 'true') && !formData[dd.key];
812
- });
813
837
 
814
- return find;
838
+ let groupList: any = {};
839
+ if (Array.isArray(obj.array)) {
840
+ obj.array.map((dd: any) => {
841
+ dd.group = dd.group ?? '';
842
+ groupList[dd.group] = groupList[dd.group] ?? [];
843
+ groupList[dd.group].push(dd);
844
+ });
815
845
  }
846
+
847
+ console.log(`oWidget=>`, obj.oWidget);
848
+ return gvc.bindView(() => {
849
+ const v_id = gvc.glitter.getUUID();
850
+ return {
851
+ bind: v_id,
852
+ view: () => {
853
+ return html`
854
+ ${Object.keys(groupList)
855
+ .map(key => {
856
+ if (key) {
857
+ let toggle = {};
858
+ return html` <div class="mt-2">
859
+ ${EditorElem.toggleExpand({
860
+ gvc: gvc,
861
+ title: key,
862
+ data: toggle,
863
+ innerText: getRaw(groupList[key]),
864
+ })}
865
+ </div>`;
866
+ } else {
867
+ return getRaw(groupList[key]);
868
+ }
869
+ })
870
+ .join('')}`;
871
+ },
872
+ divCreate: {
873
+ class: `row m-0 p-0`,
874
+ style: ``,
875
+ },
876
+ };
877
+ });
878
+ }
879
+
880
+ public static checkLeakData(form_config_list: any, formData: any) {
881
+ formData = formData || {};
882
+ form_config_list = form_config_list || [];
883
+ const find = form_config_list.find((dd: any) => {
884
+ return `${dd.require}` === 'true' && !formData[dd.key];
885
+ });
886
+
887
+ return find && find.title;
888
+ }
889
+
890
+ public static checkLeakDataObj(form_config_list: any, formData: any) {
891
+ formData = formData || {};
892
+ form_config_list = form_config_list || [];
893
+ const find = form_config_list.find((dd: any) => {
894
+ return `${dd.require}` === 'true' && !formData[dd.key];
895
+ });
896
+
897
+ return find;
898
+ }
816
899
  }
817
900
 
818
901
  Plugin.createComponent(import.meta.url, (glitter: Glitter, editMode: boolean) => {
819
- return {
820
- defaultData: {},
821
- render: (gvc: GVC, widget: HtmlJson, setting: HtmlJson[], hoverID: string[], subData, element) => {
822
- const html = String.raw;
823
- const config: {
824
- array: {
825
- title: string;
826
- key: string;
827
- readonly: 'read' | 'write' | 'block';
828
- type: 'text' | 'number' | 'textArea' | 'address';
829
- require: 'true' | 'false';
830
- style_data: {
831
- label: {
832
- class: string;
833
- style: string;
834
- };
835
- input: {
836
- class: string;
837
- style: string;
838
- };
839
- container: {
840
- class: string;
841
- style: string;
842
- };
843
- };
844
- }[];
845
- formID: string;
846
- getFormData: any;
847
- getFormID: any;
848
- form_id_from: 'static' | 'code';
849
- containerStyle: any;
850
- form_config_from: string;
851
- form_config: any;
852
- refreshEvent: any;
853
- } = getInitialData({
854
- obj: widget.data,
855
- key: 'layout',
856
- def: {
857
- array: [],
858
- style: {},
859
- formID: 'formID',
860
- getFormData: {},
861
- form_config: {},
862
- form_id_from: {},
863
- getFormID: {},
864
- refreshEvent: {},
865
- containerStyle: {},
866
- form_config_from: 'static',
867
- },
868
- });
869
- const containerStyle = glitter.htmlGenerate.editor_component(config.containerStyle, gvc, widget as any, subData);
870
- let formData: any = {};
902
+ return {
903
+ defaultData: {},
904
+ render: (gvc: GVC, widget: HtmlJson, setting: HtmlJson[], hoverID: string[], subData, element) => {
905
+ const html = String.raw;
906
+ const config: {
907
+ array: {
908
+ title: string;
909
+ key: string;
910
+ readonly: 'read' | 'write' | 'block';
911
+ type: 'text' | 'number' | 'textArea' | 'address';
912
+ require: 'true' | 'false';
913
+ style_data: {
914
+ label: {
915
+ class: string;
916
+ style: string;
917
+ };
918
+ input: {
919
+ class: string;
920
+ style: string;
921
+ };
922
+ container: {
923
+ class: string;
924
+ style: string;
925
+ };
926
+ };
927
+ }[];
928
+ formID: string;
929
+ getFormData: any;
930
+ getFormID: any;
931
+ form_id_from: 'static' | 'code';
932
+ containerStyle: any;
933
+ form_config_from: string;
934
+ form_config: any;
935
+ refreshEvent: any;
936
+ } = getInitialData({
937
+ obj: widget.data,
938
+ key: 'layout',
939
+ def: {
940
+ array: [],
941
+ style: {},
942
+ formID: 'formID',
943
+ getFormData: {},
944
+ form_config: {},
945
+ form_id_from: {},
946
+ getFormID: {},
947
+ refreshEvent: {},
948
+ containerStyle: {},
949
+ form_config_from: 'static',
950
+ },
951
+ });
952
+ const containerStyle = glitter.htmlGenerate.editor_component(config.containerStyle, gvc, widget as any, subData);
953
+ let formData: any = {};
871
954
 
872
- function getEditor() {
873
- return gvc.bindView(() => {
874
- const id = gvc.glitter.getUUID();
875
- return {
876
- bind: id,
877
- view: () => {
878
- return [
879
- containerStyle.editor(gvc, () => {
880
- widget.refreshComponent();
881
- }),
882
- EditorElem.select({
883
- title: '表單ID來源',
884
- gvc: gvc,
885
- array: [
886
- {title: '靜態', value: 'static'},
887
- {title: '動態', value: 'code'},
888
- ],
889
- def: config.form_id_from,
890
- callback: (text: any) => {
891
- config.form_id_from = text;
892
- gvc.notifyDataChange(id);
893
- },
894
- }),
895
- (() => {
896
- if (config.form_id_from === 'code') {
897
- return TriggerEvent.editer(gvc, widget, config.getFormID, {
898
- hover: false,
899
- option: [],
900
- title: '設定表單ID來源',
901
- });
902
- } else {
903
- return EditorElem.editeInput({
904
- gvc: gvc,
905
- title: '表單ID',
906
- placeHolder: `請輸入表單ID`,
907
- default: config.formID,
908
- callback: (text) => {
909
- config.formID = text;
910
- widget.refreshComponent();
911
- },
912
- });
913
- }
914
- })(),
915
- TriggerEvent.editer(gvc, widget, config.getFormData, {
916
- hover: false,
917
- option: [],
918
- title: '設定表單資料來源',
919
- }),
920
- TriggerEvent.editer(gvc, widget, config.refreshEvent, {
921
- hover: false,
922
- option: [],
923
- title: '表單更新事件',
924
- }),
925
- EditorElem.select({
926
- title: '表單格式來源',
927
- gvc: gvc,
928
- array: [
929
- {title: '靜態', value: 'static'},
930
- {title: '動態', value: 'code'},
931
- ],
932
- def: config.form_config_from,
933
- callback: (text) => {
934
- config.form_config_from = text;
935
- gvc.notifyDataChange(id);
936
- },
937
- }),
938
- (() => {
939
- if (config.form_config_from === 'code') {
940
- return TriggerEvent.editer(gvc, widget, config.form_config, {
941
- hover: false,
942
- option: [],
943
- title: '取得表單格式',
944
- });
945
- } else {
946
- return html`
947
- <div class="mx-n2">
948
- ${FormWidget.settingView({
949
- gvc: gvc,
950
- array: config.array,
951
- refresh: () => {
952
- widget.refreshComponent();
953
- },
954
- widget: widget,
955
- subData: subData,
956
- })}
957
- </div>`;
958
- }
959
- })(),
960
- ].join('<div class="my-2"></div>');
955
+ function getEditor() {
956
+ return gvc.bindView(() => {
957
+ const id = gvc.glitter.getUUID();
958
+ return {
959
+ bind: id,
960
+ view: () => {
961
+ return [
962
+ containerStyle.editor(gvc, () => {
963
+ widget.refreshComponent();
964
+ }),
965
+ EditorElem.select({
966
+ title: '表單ID來源',
967
+ gvc: gvc,
968
+ array: [
969
+ { title: '靜態', value: 'static' },
970
+ { title: '動態', value: 'code' },
971
+ ],
972
+ def: config.form_id_from,
973
+ callback: (text: any) => {
974
+ config.form_id_from = text;
975
+ gvc.notifyDataChange(id);
976
+ },
977
+ }),
978
+ (() => {
979
+ if (config.form_id_from === 'code') {
980
+ return TriggerEvent.editer(gvc, widget, config.getFormID, {
981
+ hover: false,
982
+ option: [],
983
+ title: '設定表單ID來源',
984
+ });
985
+ } else {
986
+ return EditorElem.editeInput({
987
+ gvc: gvc,
988
+ title: '表單ID',
989
+ placeHolder: `請輸入表單ID`,
990
+ default: config.formID,
991
+ callback: text => {
992
+ config.formID = text;
993
+ widget.refreshComponent();
994
+ },
995
+ });
996
+ }
997
+ })(),
998
+ TriggerEvent.editer(gvc, widget, config.getFormData, {
999
+ hover: false,
1000
+ option: [],
1001
+ title: '設定表單資料來源',
1002
+ }),
1003
+ TriggerEvent.editer(gvc, widget, config.refreshEvent, {
1004
+ hover: false,
1005
+ option: [],
1006
+ title: '表單更新事件',
1007
+ }),
1008
+ EditorElem.select({
1009
+ title: '表單格式來源',
1010
+ gvc: gvc,
1011
+ array: [
1012
+ { title: '靜態', value: 'static' },
1013
+ { title: '動態', value: 'code' },
1014
+ ],
1015
+ def: config.form_config_from,
1016
+ callback: text => {
1017
+ config.form_config_from = text;
1018
+ gvc.notifyDataChange(id);
1019
+ },
1020
+ }),
1021
+ (() => {
1022
+ if (config.form_config_from === 'code') {
1023
+ return TriggerEvent.editer(gvc, widget, config.form_config, {
1024
+ hover: false,
1025
+ option: [],
1026
+ title: '取得表單格式',
1027
+ });
1028
+ } else {
1029
+ return html` <div class="mx-n2">
1030
+ ${FormWidget.settingView({
1031
+ gvc: gvc,
1032
+ array: config.array,
1033
+ refresh: () => {
1034
+ widget.refreshComponent();
961
1035
  },
962
- };
963
- });
964
- }
1036
+ widget: widget,
1037
+ subData: subData,
1038
+ })}
1039
+ </div>`;
1040
+ }
1041
+ })(),
1042
+ ].join('<div class="my-2"></div>');
1043
+ },
1044
+ };
1045
+ });
1046
+ }
965
1047
 
966
- return {
967
- view: () => {
968
- return gvc.bindView(() => {
969
- let form_config_list: any = config.array;
1048
+ return {
1049
+ view: () => {
1050
+ return gvc.bindView(() => {
1051
+ let form_config_list: any = config.array;
970
1052
 
971
- function checkEditFinish() {
972
- return !form_config_list.find((dd: any) => {
973
- return dd.require === 'true' && !formData[dd.key];
974
- });
975
- }
1053
+ function checkEditFinish() {
1054
+ return !form_config_list.find((dd: any) => {
1055
+ return dd.require === 'true' && !formData[dd.key];
1056
+ });
1057
+ }
976
1058
 
977
- const id = glitter.getUUID();
978
- let formID: any = config.formID;
1059
+ const id = glitter.getUUID();
1060
+ let formID: any = config.formID;
979
1061
 
980
- async function getFormData() {
981
- const data = await TriggerEvent.trigger({
982
- gvc: gvc,
983
- widget: widget,
984
- clickEvent: config.getFormData,
985
- subData: subData,
986
- element: element,
987
- });
988
- gvc.share[`formComponentData-${config.formID}`] = data || formData;
989
- formData = gvc.share[`formComponentData-${config.formID}`];
990
- if (config.form_id_from === 'code') {
991
- formID = await TriggerEvent.trigger({
992
- gvc: gvc,
993
- widget: widget,
994
- clickEvent: config.getFormID,
995
- subData: subData,
996
- element: element,
997
- });
998
- }
999
- gvc.notifyDataChange(id);
1000
- return formData;
1001
- }
1062
+ async function getFormData() {
1063
+ const data = await TriggerEvent.trigger({
1064
+ gvc: gvc,
1065
+ widget: widget,
1066
+ clickEvent: config.getFormData,
1067
+ subData: subData,
1068
+ element: element,
1069
+ });
1070
+ gvc.share[`formComponentData-${config.formID}`] = data || formData;
1071
+ formData = gvc.share[`formComponentData-${config.formID}`];
1072
+ if (config.form_id_from === 'code') {
1073
+ formID = await TriggerEvent.trigger({
1074
+ gvc: gvc,
1075
+ widget: widget,
1076
+ clickEvent: config.getFormID,
1077
+ subData: subData,
1078
+ element: element,
1079
+ });
1080
+ }
1081
+ gvc.notifyDataChange(id);
1082
+ return formData;
1083
+ }
1002
1084
 
1003
- let dyView = '';
1004
- let defineHeight = 0;
1085
+ let dyView = '';
1086
+ let defineHeight = 0;
1005
1087
 
1006
- function getCodeView() {
1007
- new Promise(async (resolve) => {
1008
- const formConfig = await TriggerEvent.trigger({
1009
- gvc: gvc,
1010
- widget: widget,
1011
- clickEvent: config.form_config,
1012
- subData: subData,
1013
- element: element,
1014
- });
1015
- form_config_list = formConfig;
1016
- resolve(
1017
- FormWidget.editorView({
1018
- gvc: gvc,
1019
- array: formConfig,
1020
- refresh: (key) => {
1021
- TriggerEvent.trigger({
1022
- gvc: gvc,
1023
- widget: widget,
1024
- clickEvent: config.refreshEvent,
1025
- subData: subData,
1026
- element: element,
1027
- });
1028
- // getCodeView();
1029
- },
1030
- widget: widget,
1031
- subData: subData,
1032
- formData: await getFormData(),
1033
- })
1034
- );
1035
- }).then((dd: any) => {
1036
- dyView = dd;
1037
- gvc.notifyDataChange(id);
1038
- });
1039
- }
1088
+ function getCodeView() {
1089
+ new Promise(async resolve => {
1090
+ const formConfig = await TriggerEvent.trigger({
1091
+ gvc: gvc,
1092
+ widget: widget,
1093
+ clickEvent: config.form_config,
1094
+ subData: subData,
1095
+ element: element,
1096
+ });
1097
+ form_config_list = formConfig;
1098
+ resolve(
1099
+ FormWidget.editorView({
1100
+ gvc: gvc,
1101
+ array: formConfig,
1102
+ refresh: key => {
1103
+ TriggerEvent.trigger({
1104
+ gvc: gvc,
1105
+ widget: widget,
1106
+ clickEvent: config.refreshEvent,
1107
+ subData: subData,
1108
+ element: element,
1109
+ });
1110
+ // getCodeView();
1111
+ },
1112
+ widget: widget,
1113
+ subData: subData,
1114
+ formData: await getFormData(),
1115
+ })
1116
+ );
1117
+ }).then((dd: any) => {
1118
+ dyView = dd;
1119
+ gvc.notifyDataChange(id);
1120
+ });
1121
+ }
1040
1122
 
1041
- if (config.form_config_from === 'code') {
1042
- getCodeView();
1043
- } else {
1044
- getFormData();
1045
- }
1123
+ if (config.form_config_from === 'code') {
1124
+ getCodeView();
1125
+ } else {
1126
+ getFormData();
1127
+ }
1046
1128
 
1047
- return {
1048
- bind: id,
1049
- view: () => {
1050
- if (config.form_config_from === 'code') {
1051
- return dyView;
1052
- } else {
1053
- return FormWidget.editorView({
1054
- gvc: gvc,
1055
- array: config.array,
1056
- refresh: () => {
1057
- TriggerEvent.trigger({
1058
- gvc: gvc,
1059
- widget: widget,
1060
- clickEvent: config.refreshEvent,
1061
- subData: subData,
1062
- element: element,
1063
- });
1064
- // gvc.notifyDataChange(id);
1065
- },
1066
- widget: widget,
1067
- subData: subData,
1068
- formData: formData,
1069
- });
1070
- }
1071
- },
1072
- divCreate: () => {
1073
- return {
1074
- class: `formID-${formID} ${containerStyle.class()}`,
1075
- style: `${containerStyle.style()} ${(() => {
1076
- if (defineHeight) {
1077
- return `height:${defineHeight}px;`;
1078
- } else {
1079
- return ``;
1080
- }
1081
- })()}`,
1082
- };
1083
- },
1084
- onCreate: () => {
1085
- (document.querySelector(`.formID-${formID}`) as any).formValue = () => {
1086
- return formData;
1087
- };
1088
- (document.querySelector(`.formID-${formID}`) as any).checkEditFinish = checkEditFinish;
1089
- (document.querySelector(`.formID-${formID}`) as any).checkLeakData = () => {
1090
- const find = form_config_list.find((dd: any) => {
1091
- return dd.require === 'true' && !formData[dd.key];
1092
- });
1093
- return find && find.title;
1094
- };
1095
- },
1096
- };
1097
- });
1098
- },
1099
- editor: () => {
1100
- return getEditor();
1101
- },
1102
- user_editor: () => {
1103
- return getEditor();
1104
- },
1129
+ return {
1130
+ bind: id,
1131
+ view: () => {
1132
+ if (config.form_config_from === 'code') {
1133
+ return dyView;
1134
+ } else {
1135
+ return FormWidget.editorView({
1136
+ gvc: gvc,
1137
+ array: config.array,
1138
+ refresh: () => {
1139
+ TriggerEvent.trigger({
1140
+ gvc: gvc,
1141
+ widget: widget,
1142
+ clickEvent: config.refreshEvent,
1143
+ subData: subData,
1144
+ element: element,
1145
+ });
1146
+ // gvc.notifyDataChange(id);
1147
+ },
1148
+ widget: widget,
1149
+ subData: subData,
1150
+ formData: formData,
1151
+ });
1152
+ }
1153
+ },
1154
+ divCreate: () => {
1155
+ return {
1156
+ class: `formID-${formID} ${containerStyle.class()}`,
1157
+ style: `${containerStyle.style()} ${(() => {
1158
+ if (defineHeight) {
1159
+ return `height:${defineHeight}px;`;
1160
+ } else {
1161
+ return ``;
1162
+ }
1163
+ })()}`,
1164
+ };
1165
+ },
1166
+ onCreate: () => {
1167
+ (document.querySelector(`.formID-${formID}`) as any).formValue = () => {
1168
+ return formData;
1169
+ };
1170
+ (document.querySelector(`.formID-${formID}`) as any).checkEditFinish = checkEditFinish;
1171
+ (document.querySelector(`.formID-${formID}`) as any).checkLeakData = () => {
1172
+ const find = form_config_list.find((dd: any) => {
1173
+ return dd.require === 'true' && !formData[dd.key];
1174
+ });
1175
+ return find && find.title;
1176
+ };
1177
+ },
1105
1178
  };
1179
+ });
1106
1180
  },
1107
- };
1181
+ editor: () => {
1182
+ return getEditor();
1183
+ },
1184
+ user_editor: () => {
1185
+ return getEditor();
1186
+ },
1187
+ };
1188
+ },
1189
+ };
1108
1190
  });
1109
1191
 
1110
1192
  const interVal = setInterval(() => {
1111
- if ((window as any).glitter) {
1112
- (window as any).glitter.setModule(import.meta.url, FormWidget);
1113
- clearInterval(interVal);
1114
- }
1193
+ if ((window as any).glitter) {
1194
+ (window as any).glitter.setModule(import.meta.url, FormWidget);
1195
+ clearInterval(interVal);
1196
+ }
1115
1197
  });