ts-glitter 21.9.4 → 21.9.7

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 (78) hide show
  1. package/lowcode/Entry.js +1 -1
  2. package/lowcode/Entry.ts +1 -1
  3. package/lowcode/backend-manager/bg-blog.js +2 -0
  4. package/lowcode/backend-manager/bg-blog.ts +4 -0
  5. package/lowcode/backend-manager/bg-product.js +3 -3
  6. package/lowcode/backend-manager/bg-product.ts +3 -3
  7. package/lowcode/backend-manager/bg-widget.js +15 -11
  8. package/lowcode/backend-manager/bg-widget.ts +30 -21
  9. package/lowcode/cms-plugin/menus-setting.js +389 -141
  10. package/lowcode/cms-plugin/menus-setting.ts +519 -228
  11. package/lowcode/cms-plugin/shopping-collections.js +5 -38
  12. package/lowcode/cms-plugin/shopping-collections.ts +5 -47
  13. package/lowcode/jspage/function-page/setting_editor.js +0 -27
  14. package/lowcode/jspage/function-page/setting_editor.ts +27 -27
  15. package/lowcode/public-components/footer/footer-01.js +183 -158
  16. package/lowcode/public-components/footer/footer-01.ts +275 -256
  17. package/lowcode/public-components/footer/footer-02.js +83 -63
  18. package/lowcode/public-components/footer/footer-02.ts +160 -145
  19. package/lowcode/public-components/footer/footer-03.js +78 -60
  20. package/lowcode/public-components/footer/footer-03.ts +149 -137
  21. package/lowcode/public-components/headers/sy-02.js +17 -2
  22. package/lowcode/public-components/headers/sy-02.ts +18 -6
  23. package/lowcode/public-components/headers/sy-03.js +18 -4
  24. package/lowcode/public-components/headers/sy-03.ts +26 -15
  25. package/lowcode/public-components/headers/sy-04.js +18 -4
  26. package/lowcode/public-components/headers/sy-04.ts +26 -15
  27. package/lowcode/public-components/headers/sy-05.js +93 -68
  28. package/lowcode/public-components/headers/sy-05.ts +174 -151
  29. package/lowcode/public-components/product/pd-class.js +27 -8
  30. package/lowcode/public-components/product/pd-class.ts +60 -35
  31. package/package.json +1 -1
  32. package/src/api-public/controllers/index.js.map +1 -1
  33. package/src/api-public/controllers/user.js +2 -2
  34. package/src/api-public/controllers/user.js.map +1 -1
  35. package/src/api-public/controllers/user.ts +2 -3
  36. package/src/api-public/services/ai-robot.d.ts +0 -1
  37. package/src/api-public/services/fb-api.d.ts +0 -1
  38. package/src/api-public/services/fb-message.d.ts +0 -1
  39. package/src/api-public/services/fb-service.js +4 -4
  40. package/src/api-public/services/fb-service.js.map +1 -1
  41. package/src/api-public/services/financial-service.d.ts +0 -1
  42. package/src/api-public/services/financial-serviceV2.d.ts +0 -1
  43. package/src/api-public/services/line-message.d.ts +0 -1
  44. package/src/api-public/services/monitor.d.ts +0 -1
  45. package/src/api-public/services/share-permission.d.ts +1 -1
  46. package/src/api-public/services/shopee.d.ts +3 -4
  47. package/src/api-public/services/shopee.js +17 -7
  48. package/src/api-public/services/user.d.ts +0 -1
  49. package/src/api-public/services/user.js +19 -9
  50. package/src/api-public/services/user.js.map +1 -1
  51. package/src/api-public/services/user.ts +2 -2
  52. package/src/api-public/utils/ut-permission.d.ts +0 -1
  53. package/src/config.d.ts +1 -1
  54. package/src/index.js +20 -10
  55. package/src/modules/AWSLib.js +2 -3
  56. package/src/modules/AWSLib.js.map +1 -1
  57. package/src/modules/database.d.ts +1 -1
  58. package/src/modules/redis.d.ts +1 -1
  59. package/src/modules/tool.d.ts +4 -4
  60. package/src/modules/tool.js +1 -2
  61. package/src/modules/tool.js.map +1 -1
  62. package/src/run.js +1 -2
  63. package/src/run.js.map +1 -1
  64. package/src/seo-config.d.ts +0 -1
  65. package/src/seo-config.js +3 -3
  66. package/src/seo-config.js.map +1 -1
  67. package/src/services/app.d.ts +0 -1
  68. package/src/services/app.js +17 -7
  69. package/src/services/app.js.map +1 -1
  70. package/src/services/backend-service.js +17 -7
  71. package/src/services/backend-service.js.map +1 -1
  72. package/src/services/create-instance.js +3 -4
  73. package/src/services/create-instance.js.map +1 -1
  74. package/src/services/saas-table-check.js +2 -2
  75. package/src/services/seo.d.ts +0 -1
  76. package/src/services/template.d.ts +0 -1
  77. package/src/services/tool.js +2 -3
  78. package/src/services/tool.js.map +1 -1
@@ -1,45 +1,44 @@
1
1
  import { GVC } from '../glitterBundle/GVController.js';
2
2
  import { BgWidget } from '../backend-manager/bg-widget.js';
3
3
  import { ApiUser } from '../glitter-base/route/user.js';
4
- import { EditorElem } from '../glitterBundle/plugins/editor-elem.js';
5
4
  import { LanguageLocation } from '../glitter-base/global/language.js';
6
5
  import { LanguageBackend } from './language-backend.js';
7
6
  import { ShareDialog } from '../glitterBundle/dialog/ShareDialog.js';
8
- import { AiChat } from '../glitter-base/route/ai-chat.js';
9
7
 
10
8
  const html = String.raw;
11
9
 
12
10
  interface MenuItem {
13
11
  link: string;
14
12
  title: string;
13
+ visible_type: 'all' | 'loggedIn' | 'user' | 'level';
14
+ visible_data_array?: string[];
15
15
  items: MenuItem[];
16
16
  }
17
17
 
18
18
  export class MenusSetting {
19
- public static main(gvc: GVC, widget: any,def:'menu'|'footer') {
19
+ public static main(gvc: GVC, widget: any, def: 'menu' | 'footer') {
20
20
  const html = String.raw;
21
21
  const glitter = gvc.glitter;
22
+ const dialog = new ShareDialog(glitter);
22
23
 
23
24
  const vm: {
24
25
  type: 'list' | 'add' | 'replace' | 'select';
25
26
  index: number;
26
27
  dataList: any;
27
28
  query?: string;
28
- select:{title:string,tag:string}
29
- tab:'menu'|'footer'
29
+ select: { title: string; tag: string };
30
+ tab: 'menu' | 'footer';
30
31
  } = {
31
32
  type: 'list',
32
33
  index: 0,
33
34
  dataList: undefined,
34
35
  query: '',
35
- tab:def || 'menu',
36
- select:{title:'',tag:''}
36
+ tab: def || 'menu',
37
+ select: { title: '', tag: '' },
37
38
  };
38
- const filterID = gvc.glitter.getUUID();
39
- let vmi: any = undefined;
40
39
 
41
40
  function getDatalist() {
42
- return vm.dataList.map((dd: any, index: number) => {
41
+ return vm.dataList.map((dd: any) => {
43
42
  return [
44
43
  {
45
44
  key: '選單名稱',
@@ -51,44 +50,39 @@ export class MenusSetting {
51
50
 
52
51
  return gvc.bindView(() => {
53
52
  const id = glitter.getUUID();
54
- function refresh() {
55
- gvc.notifyDataChange(id);
56
- }
57
53
 
58
54
  return {
59
55
  bind: id,
60
56
  dataList: [{ obj: vm, key: 'type' }],
61
57
  view: () => {
62
58
  if (vm.type === 'list') {
63
-
64
59
  return BgWidget.container(html`
65
60
  <div class="title-container">
66
61
  ${BgWidget.title('選單管理')}
67
62
  <div class="flex-fill"></div>
68
63
  ${BgWidget.darkButton(
69
- `新增${vm.tab==='menu' ? `頁首選單`:`頁腳選單`}`,
64
+ `新增${vm.tab === 'menu' ? `頁首選單` : `頁腳選單`}`,
70
65
  gvc.event(async () => {
71
- let title=''
72
- async function next(){
73
- const dialog=new ShareDialog(gvc.glitter)
74
- dialog.dataLoading({visible:true})
75
- const tab=vm.tab==='menu' ? `頁首選單`:`頁腳選單`
76
- let menu_all=(await ApiUser.getPublicConfig('menu-setting-list','manager')).response.value;
77
- menu_all.list=menu_all.list ?? [];
78
- menu_all.list=[
66
+ let title = '';
67
+ async function next() {
68
+ dialog.dataLoading({ visible: true });
69
+ const tab = vm.tab === 'menu' ? `頁首選單` : `頁腳選單`;
70
+ let menu_all = (await ApiUser.getPublicConfig('menu-setting-list', 'manager')).response.value;
71
+ menu_all.list = menu_all.list ?? [];
72
+ menu_all.list = [
79
73
  {
80
- tag:gvc.glitter.getUUID(),
81
- title:title || [tab,`${(menu_all.list.length+1)}`].join(''),
82
- tab:vm.tab==='menu' ? 'menu-setting':'footer-setting'
83
- }
74
+ tag: gvc.glitter.getUUID(),
75
+ title: title || [tab, `${menu_all.list.length + 1}`].join(''),
76
+ tab: vm.tab === 'menu' ? 'menu-setting' : 'footer-setting',
77
+ },
84
78
  ].concat(menu_all.list);
85
79
  await ApiUser.setPublicConfig({
86
- key:'menu-setting-list',
87
- value:menu_all,
88
- user_id:'manager'
80
+ key: 'menu-setting-list',
81
+ value: menu_all,
82
+ user_id: 'manager',
89
83
  });
90
- dialog.dataLoading({visible:false});
91
- gvc.notifyDataChange(id)
84
+ dialog.dataLoading({ visible: false });
85
+ gvc.notifyDataChange(id);
92
86
  }
93
87
  BgWidget.settingDialog({
94
88
  gvc: gvc,
@@ -96,69 +90,75 @@ export class MenusSetting {
96
90
  innerHTML: (gvc: GVC) => {
97
91
  return [
98
92
  BgWidget.editeInput({
99
- title:'',
100
- callback:(text)=>{
101
- title=text
93
+ title: '',
94
+ callback: text => {
95
+ title = text;
102
96
  },
103
- default:title,
104
- gvc:gvc,
105
- placeHolder:'請輸入選單名稱'
106
- })
107
- ].join('')
97
+ default: title,
98
+ gvc: gvc,
99
+ placeHolder: '請輸入選單名稱',
100
+ }),
101
+ ].join('');
108
102
  },
109
103
  footer_html: (gvc: GVC) => {
110
- return BgWidget.save(gvc.event(()=>{
111
- next()
112
- gvc.closeDialog()
113
- }),'儲存')
104
+ return BgWidget.save(
105
+ gvc.event(() => {
106
+ next();
107
+ gvc.closeDialog();
108
+ }),
109
+ '儲存'
110
+ );
114
111
  },
115
- width: 300
116
- })
117
-
118
- // vm.index = index;
119
- // vm.type = 'replace';
112
+ width: 300,
113
+ });
120
114
  })
121
115
  )}
122
116
  </div>
123
- ${def ? ``:BgWidget.tab(
124
- [
125
- { title: '主選單', key: 'menu' },
126
- { title: '頁腳', key: 'footer' }
127
- ],
128
- gvc,
129
- vm.tab,
130
- (text) => {
131
- vm.tab=text as any
132
- gvc.notifyDataChange(id);
133
- },
134
- `${document.body.clientWidth<800 ? ``:`margin-bottom:0px !important;`}
117
+ ${def
118
+ ? ''
119
+ : BgWidget.tab(
120
+ [
121
+ { title: '主選單', key: 'menu' },
122
+ { title: '頁腳', key: 'footer' },
123
+ ],
124
+ gvc,
125
+ vm.tab,
126
+ text => {
127
+ vm.tab = text as any;
128
+ gvc.notifyDataChange(id);
129
+ },
130
+ `${document.body.clientWidth < 800 ? '' : `margin-bottom:0px !important;`}
135
131
  `
136
- )}
132
+ )}
137
133
  ${BgWidget.container(
138
134
  BgWidget.mainCard(
139
135
  BgWidget.tableV3({
140
136
  gvc: gvc,
141
- getData: async (vmi) => {
142
- const tag=vm.tab==='menu' ? 'menu-setting':'footer-setting'
143
- let menu_all= (await ApiUser.getPublicConfig('menu-setting-list','manager')).response.value;
137
+ getData: async vmi => {
138
+ const tag = vm.tab === 'menu' ? 'menu-setting' : 'footer-setting';
139
+ let menu_all = (await ApiUser.getPublicConfig('menu-setting-list', 'manager')).response.value;
144
140
  menu_all.list = menu_all.list ?? [];
145
141
  vm.dataList = [
146
- { tag: tag, title: `
147
- <div> ${vm.tab==='menu' ? `頁首選單`:`頁腳選單`} <span style="font-size:12px;color:#36B;">系統預設</span></div>
148
- ` },
149
- ...menu_all.list.filter((d1:any)=>{
150
- return d1.tab===tag
151
- })
142
+ {
143
+ tag: tag,
144
+ title: html`
145
+ <div>
146
+ ${vm.tab === 'menu' ? '頁首選單' : '頁腳選單'}
147
+ <span style="font-size: 12px; color: #36B;">系統預設</span>
148
+ </div>
149
+ `,
150
+ },
151
+ ...menu_all.list.filter((d1: any) => d1.tab === tag),
152
152
  ];
153
-
153
+
154
154
  vmi.pageSize = 1;
155
155
  vmi.originalData = vm.dataList;
156
156
  vmi.tableData = getDatalist();
157
157
  vmi.loading = false;
158
158
  vmi.callback();
159
159
  },
160
- rowClick: (data, index) => {
161
- vm.select=vm.dataList[index]
160
+ rowClick: (_, index) => {
161
+ vm.select = vm.dataList[index];
162
162
  vm.type = 'replace';
163
163
  },
164
164
  filter: [],
@@ -192,20 +192,14 @@ export class MenusSetting {
192
192
  }
193
193
  },
194
194
  divCreate: {
195
- class: `w-100 `,
196
- style: `max-width:100%;`,
195
+ class: 'w-100',
196
+ style: 'max-width: 100%;',
197
197
  },
198
198
  };
199
199
  });
200
200
  }
201
201
 
202
- public static setMenu(cf: {
203
- goBack: () => void;
204
- gvc: GVC;
205
- widget: any;
206
- key: string;
207
- title: string;
208
- }) {
202
+ public static setMenu(cf: { goBack: () => void; gvc: GVC; widget: any; key: string; title: string }) {
209
203
  const vm: {
210
204
  id: string;
211
205
  link: {
@@ -215,7 +209,7 @@ export class MenusSetting {
215
209
  };
216
210
  loading: boolean;
217
211
  selected: boolean;
218
- language: LanguageLocation
212
+ language: LanguageLocation;
219
213
  } = {
220
214
  id: cf.gvc.glitter.getUUID(),
221
215
  link: {
@@ -225,8 +219,10 @@ export class MenusSetting {
225
219
  },
226
220
  selected: false,
227
221
  loading: true,
228
- language: (window.parent as any).store_info.language_setting.def
222
+ language: (window.parent as any).store_info.language_setting.def,
229
223
  };
224
+ const gvc = cf.gvc;
225
+ const dialog = new ShareDialog(gvc.glitter);
230
226
 
231
227
  ApiUser.getPublicConfig(cf.key, 'manager').then((data: any) => {
232
228
  if (data.response.value) {
@@ -241,22 +237,24 @@ export class MenusSetting {
241
237
  clearNoNeedData(dd.items || []);
242
238
  });
243
239
  }
240
+
244
241
  async function save() {
245
242
  for (const a of ['en-US', 'zh-CN', 'zh-TW']) {
246
- (vm.link as any)[a]=(vm.link as any)[a]??[]
243
+ (vm.link as any)[a] = (vm.link as any)[a] ?? [];
247
244
  clearNoNeedData((vm.link as any)[a]);
248
245
  }
249
246
 
250
- const dialog=new ShareDialog(gvc.glitter)
251
- dialog.dataLoading({visible:true})
252
- let menu_all=(await ApiUser.getPublicConfig('menu-setting-list','manager')).response.value;
253
- menu_all.list=menu_all.list ?? []
254
- const find_=menu_all.list.find((d1:any)=>{return d1.tag===cf.key});
255
- find_ &&( find_.title=cf.title)
247
+ dialog.dataLoading({ visible: true });
248
+ let menu_all = (await ApiUser.getPublicConfig('menu-setting-list', 'manager')).response.value;
249
+ menu_all.list = menu_all.list ?? [];
250
+ const find_ = menu_all.list.find((d1: any) => {
251
+ return d1.tag === cf.key;
252
+ });
253
+ find_ && (find_.title = cf.title);
256
254
  await ApiUser.setPublicConfig({
257
- key:'menu-setting-list',
258
- value:menu_all,
259
- user_id:'manager'
255
+ key: 'menu-setting-list',
256
+ value: menu_all,
257
+ user_id: 'manager',
260
258
  });
261
259
  ApiUser.setPublicConfig({
262
260
  key: cf.key,
@@ -264,11 +262,12 @@ export class MenusSetting {
264
262
  user_id: 'manager',
265
263
  }).then(data => {
266
264
  setTimeout(() => {
267
- dialog.dataLoading({visible:false})
268
- dialog.successMessage({text:'儲存成功'})
265
+ dialog.dataLoading({ visible: false });
266
+ dialog.successMessage({ text: '儲存成功' });
269
267
  }, 1000);
270
268
  });
271
269
  }
270
+
272
271
  function selectAll(array: MenuItem) {
273
272
  (array as any).selected = true;
274
273
  array.items.map(dd => {
@@ -276,6 +275,7 @@ export class MenusSetting {
276
275
  selectAll(dd);
277
276
  });
278
277
  }
278
+
279
279
  function clearAll(array: MenuItem) {
280
280
  (array as any).selected = false;
281
281
  array.items.map(dd => {
@@ -283,6 +283,7 @@ export class MenusSetting {
283
283
  clearAll(dd);
284
284
  });
285
285
  }
286
+
286
287
  function allSelect(dd: any) {
287
288
  return (
288
289
  !dd.items.find((d1: any) => {
@@ -290,6 +291,7 @@ export class MenusSetting {
290
291
  }) && (dd as any).selected
291
292
  );
292
293
  }
294
+
293
295
  function getSelectCount(dd: any) {
294
296
  let count = 0;
295
297
  if (dd.selected) {
@@ -300,6 +302,7 @@ export class MenusSetting {
300
302
  });
301
303
  return count;
302
304
  }
305
+
303
306
  function deleteSelect(items: MenuItem[]) {
304
307
  return items.filter(d1 => {
305
308
  d1.items = deleteSelect(d1.items || []);
@@ -307,15 +310,15 @@ export class MenusSetting {
307
310
  });
308
311
  }
309
312
 
310
- const gvc = cf.gvc;
311
313
  function refresh() {
312
314
  gvc.notifyDataChange(vm.id);
313
315
  }
316
+
314
317
  return gvc.bindView(() => {
315
318
  return {
316
319
  bind: vm.id,
317
320
  view: () => {
318
- vm.link[vm.language]=vm.link[vm.language] ?? []
321
+ vm.link[vm.language] = vm.link[vm.language] ?? [];
319
322
  const link = vm.link[vm.language];
320
323
 
321
324
  return html`<div class="title-container" style="width: 100%; max-width: 100%;">
@@ -324,37 +327,41 @@ export class MenusSetting {
324
327
  cf.goBack();
325
328
  })
326
329
  )}${BgWidget.title(cf.title ?? '選單設定')}
327
- <div class="mx-2 ${ ['menu-setting' , 'footer-setting' , 'text-manager'].includes(cf.key) ? `d-none`:``}">
328
- ${BgWidget.grayButton('重新命名',gvc.event(()=>{
329
- BgWidget.settingDialog({
330
- gvc: gvc,
331
- title: '重新命名',
332
- innerHTML: (gvc: GVC) => {
333
- return [
334
- BgWidget.editeInput({
335
- title:'',
336
- callback:(text)=>{
337
- cf.title=text
338
- },
339
- default:cf.title,
340
- gvc:gvc,
341
- placeHolder:''
342
- })
343
- ].join('')
344
- },
345
- footer_html: (gvc: GVC) => {
346
- return BgWidget.save(gvc.event(()=>{
347
- gvc.closeDialog()
348
- refresh()
349
- }),'儲存')
350
- },
351
- width: 500
352
- })
353
- }))}
354
- </div>
355
-
330
+ <div class="mx-2 ${['menu-setting', 'footer-setting', 'text-manager'].includes(cf.key) ? 'd-none' : ''}">
331
+ ${BgWidget.grayButton(
332
+ '重新命名',
333
+ gvc.event(() => {
334
+ BgWidget.settingDialog({
335
+ gvc: gvc,
336
+ title: '重新命名',
337
+ innerHTML: (gvc: GVC) => {
338
+ return [
339
+ BgWidget.editeInput({
340
+ title: '',
341
+ callback: text => {
342
+ cf.title = text;
343
+ },
344
+ default: cf.title,
345
+ gvc: gvc,
346
+ placeHolder: '',
347
+ }),
348
+ ].join('');
349
+ },
350
+ footer_html: (gvc: GVC) => {
351
+ return BgWidget.save(
352
+ gvc.event(() => {
353
+ gvc.closeDialog();
354
+ refresh();
355
+ }),
356
+ '儲存'
357
+ );
358
+ },
359
+ width: 500,
360
+ });
361
+ })
362
+ )}
363
+ </div>
356
364
  <div class="flex-fill"></div>
357
-
358
365
  ${LanguageBackend.switchBtn({
359
366
  gvc: gvc,
360
367
  language: vm.language,
@@ -373,19 +380,13 @@ export class MenusSetting {
373
380
  style="width: 100%; left: 0px; top: 0px; flex-direction: column; justify-content: flex-start; align-items: flex-start; gap: 20px; display: inline-flex"
374
381
  >
375
382
  <div
376
- class="w-100 ${getSelectCount({
377
- items: link,
378
- }) > 0
379
- ? ``
380
- : `d-none`}"
383
+ class="w-100 ${getSelectCount({ items: link }) > 0 ? '' : 'd-none'}"
381
384
  style="height: 40px; padding: 12px 18px;background: #F7F7F7; border-radius: 10px; justify-content: flex-end; align-items: center; gap: 8px; display: inline-flex"
382
385
  >
383
386
  <div
384
387
  style="flex: 1 1 0; color: #393939; font-size: 14px; font-family: Noto Sans; font-weight: 700; word-wrap: break-word"
385
388
  >
386
- 已選取${getSelectCount({
387
- items: link,
388
- })}項
389
+ 已選取${getSelectCount({ items: link })}項
389
390
  </div>
390
391
  <div
391
392
  style="cursor:pointer;padding: 4px 14px;background: white; box-shadow: 0px 0px 10px rgba(0, 0, 0, 0.10); border-radius: 20px; border: 1px #DDDDDD solid; justify-content: flex-start; align-items: flex-start; gap: 10px; display: flex"
@@ -408,28 +409,18 @@ export class MenusSetting {
408
409
  <div
409
410
  class="${allSelect({
410
411
  items: link,
411
- selected: !link.find(dd => {
412
- return !(dd as any).selected;
413
- }),
412
+ selected: !link.find(dd => !(dd as any).selected),
414
413
  })
415
- ? `fa-solid fa-square-check`
416
- : `fa-regular fa-square`}"
417
- style="color:#393939;width: 16px; height: 16px;cursor: pointer;"
414
+ ? 'fa-solid fa-square-check'
415
+ : 'fa-regular fa-square'}"
416
+ style="color: #393939; width: 16px; height: 16px; cursor: pointer;"
418
417
  onclick="${cf.gvc.event((e, event) => {
419
418
  event.stopPropagation();
420
419
 
421
- if (
422
- link.find(dd => {
423
- return !(dd as any).selected;
424
- })
425
- ) {
426
- selectAll({
427
- items: link,
428
- } as any);
420
+ if (link.find(dd => !(dd as any).selected)) {
421
+ selectAll({ items: link } as any);
429
422
  } else {
430
- clearAll({
431
- items: link,
432
- } as any);
423
+ clearAll({ items: link } as any);
433
424
  }
434
425
  gvc.notifyDataChange(vm.id);
435
426
  })}"
@@ -455,7 +446,7 @@ export class MenusSetting {
455
446
  .map((dd, index) => {
456
447
  const list = html`
457
448
  <div
458
- class=" w-100 "
449
+ class="w-100"
459
450
  style="width: 100%; justify-content: flex-start; align-items: center; gap: 5px; display: inline-flex;cursor: pointer;"
460
451
  onclick="${cf.gvc.event(() => {
461
452
  if (dd.items && dd.items.length > 0) {
@@ -469,7 +460,7 @@ export class MenusSetting {
469
460
  ? `fa-solid fa-square-check`
470
461
  : `fa-regular fa-square`}"
471
462
  style="color:#393939;width: 16px; height: 16px;"
472
- onclick="${cf.gvc.event((e, event) => {
463
+ onclick="${cf.gvc.event((_, event) => {
473
464
  event.stopPropagation();
474
465
  (dd as any).selected = !(dd as any).selected;
475
466
  if ((dd as any).selected) {
@@ -501,9 +492,9 @@ export class MenusSetting {
501
492
  </div>
502
493
  ${dd.items && dd.items.length > 0
503
494
  ? !(dd as any).toggle
504
- ? `<i class="fa-solid fa-angle-down color39"></i>`
505
- : `<i class="fa-solid fa-angle-up color39"></i>`
506
- : ``}
495
+ ? html`<i class="fa-solid fa-angle-down color39"></i>`
496
+ : html`<i class="fa-solid fa-angle-up color39"></i>`
497
+ : ''}
507
498
  </div>
508
499
  <div
509
500
  style="justify-content: flex-start; align-items: center; gap: 8px; display: inline-flex;white-space: normal;word-break: break-all;"
@@ -523,12 +514,13 @@ export class MenusSetting {
523
514
  <div class="flex-fill"></div>
524
515
  <div
525
516
  class="child me-2"
526
- onclick="${cf.gvc.event((e, event) => {
517
+ onclick="${cf.gvc.event((_, event) => {
527
518
  event.stopPropagation();
528
519
  MenusSetting.editEvent(
529
520
  {
530
521
  link: '',
531
522
  title: '',
523
+ visible_type: 'all',
532
524
  items: [],
533
525
  },
534
526
  data => {
@@ -543,7 +535,7 @@ export class MenusSetting {
543
535
  </div>
544
536
  <div
545
537
  class="child"
546
- onclick="${cf.gvc.event((e, event) => {
538
+ onclick="${cf.gvc.event((_, event) => {
547
539
  event.stopPropagation();
548
540
  MenusSetting.editEvent(dd, data => {
549
541
  array[index] = data;
@@ -558,13 +550,13 @@ export class MenusSetting {
558
550
  ${dd.items && dd.items.length > 0
559
551
  ? html`
560
552
  <div
561
- class=" w-100 ${(dd as any).toggle ? `` : `d-none`}"
553
+ class=" w-100 ${(dd as any).toggle ? '' : 'd-none'}"
562
554
  style="padding-left: 35px;"
563
555
  >
564
556
  ${renderItems(dd.items as MenuItem[]) as any}
565
557
  </div>
566
558
  `
567
- : ``}
559
+ : ''}
568
560
  `;
569
561
  return html`<li class="w-100 ">${list}</li>`;
570
562
  })
@@ -572,8 +564,8 @@ export class MenusSetting {
572
564
  },
573
565
  divCreate: {
574
566
  elem: 'ul',
575
- class: `w-100 my-2`,
576
- style: `display:flex;flex-direction: column;gap:18px;`,
567
+ class: 'w-100 my-2',
568
+ style: 'display:flex; flex-direction: column; gap: 18px;',
577
569
  },
578
570
  onCreate: () => {
579
571
  gvc.glitter.addMtScript(
@@ -590,11 +582,11 @@ export class MenusSetting {
590
582
  if (window.Sortable) {
591
583
  try {
592
584
  gvc.addStyle(`
593
- ul {
594
- list-style: none;
595
- padding: 0;
596
- }
597
- `);
585
+ ul {
586
+ list-style: none;
587
+ padding: 0;
588
+ }
589
+ `);
598
590
  function swapArr(arr: any, index1: number, index2: number) {
599
591
  const data = arr[index1];
600
592
  arr.splice(index1, 1);
@@ -629,6 +621,7 @@ export class MenusSetting {
629
621
  {
630
622
  link: '',
631
623
  title: '',
624
+ visible_type: 'all',
632
625
  items: [],
633
626
  },
634
627
  data => {
@@ -660,29 +653,30 @@ export class MenusSetting {
660
653
  </div>`
661
654
  )}
662
655
  <div class="update-bar-container">
663
- ${
664
- ['menu-setting' , 'footer-setting' , 'text-manager'].includes(cf.key) ? ``:BgWidget.danger(gvc.event(async () => {
665
- const dialog=new ShareDialog(gvc.glitter);
666
- dialog.checkYesOrNot({
667
- text:'是否確認刪除?',
668
- callback:async (response)=>{
669
- if(response){
670
- dialog.dataLoading({visible:true});
671
- let menu_all=(await ApiUser.getPublicConfig('menu-setting-list','manager')).response.value;
672
- menu_all.list=menu_all.list.filter((d1:any)=>d1.tag!=cf.key);
673
- await ApiUser.setPublicConfig({
674
- key:'menu-setting-list',
675
- value:menu_all,
676
- user_id:'manager'
677
- });
678
- dialog.dataLoading({visible:false});
679
- cf.goBack();
680
- }
681
- }
682
- })
683
-
684
- }))
685
- }
656
+ ${['menu-setting', 'footer-setting', 'text-manager'].includes(cf.key)
657
+ ? ''
658
+ : BgWidget.danger(
659
+ gvc.event(async () => {
660
+ dialog.checkYesOrNot({
661
+ text: '是否確認刪除?',
662
+ callback: async response => {
663
+ if (response) {
664
+ dialog.dataLoading({ visible: true });
665
+ let menu_all = (await ApiUser.getPublicConfig('menu-setting-list', 'manager')).response
666
+ .value;
667
+ menu_all.list = menu_all.list.filter((d1: any) => d1.tag != cf.key);
668
+ await ApiUser.setPublicConfig({
669
+ key: 'menu-setting-list',
670
+ value: menu_all,
671
+ user_id: 'manager',
672
+ });
673
+ dialog.dataLoading({ visible: false });
674
+ cf.goBack();
675
+ }
676
+ },
677
+ });
678
+ })
679
+ )}
686
680
  ${BgWidget.cancel(
687
681
  gvc.event(() => {
688
682
  cf.goBack();
@@ -704,49 +698,270 @@ export class MenusSetting {
704
698
 
705
699
  public static editEvent(data: MenuItem, save: (data: MenuItem) => void) {
706
700
  const gvc: GVC = (window.parent as any).glitter.pageConfig[0].gvc;
707
- const rightMenu = (window.parent as any).glitter.share.NormalPageEditor;
701
+ const glitter = gvc.glitter;
702
+ const rightMenu = glitter.share.NormalPageEditor;
703
+
704
+ const vm = {
705
+ search: '',
706
+ levelList: undefined as any,
707
+ userList: undefined as any,
708
+ visibleDataList: undefined as any,
709
+ cloneData: structuredClone(data),
710
+ show: false,
711
+ dataLoading: true,
712
+ };
713
+
714
+ const ids = {
715
+ main: glitter.getUUID(),
716
+ visibleSelect: glitter.getUUID(),
717
+ dataArray: glitter.getUUID(),
718
+ };
719
+
720
+ const setVisibleSelect = () => {
721
+ return gvc.bindView({
722
+ bind: ids.visibleSelect,
723
+ view: () => {
724
+ return html`
725
+ <div class="tx_normal fw-normal">選單可見對象</div>
726
+ <div class="d-flex align-items-center" style="margin-top: 8px; gap: 10px;">
727
+ ${[
728
+ BgWidget.select({
729
+ gvc,
730
+ callback: value => {
731
+ data.visible_type = value;
732
+ data.visible_data_array = [];
733
+ vm.visibleDataList = [];
734
+ vm.show = false;
735
+ vm.dataLoading = true;
736
+ gvc.notifyDataChange([ids.visibleSelect, ids.dataArray]);
737
+ },
738
+ default: data.visible_type ?? 'all',
739
+ options: [
740
+ { key: 'all', value: '所有顧客' },
741
+ { key: 'loggedIn', value: '已登入顧客' },
742
+ { key: 'user', value: '特定顧客' },
743
+ { key: 'level', value: '特定會員等級' },
744
+ ],
745
+ }),
746
+ ['user', 'level'].includes(data.visible_type)
747
+ ? BgWidget.grayButton(
748
+ '選擇',
749
+ gvc.event(() => {
750
+ if (!vm.show) {
751
+ vm.show = true;
752
+ gvc.notifyDataChange(ids.dataArray);
753
+ }
754
+ })
755
+ )
756
+ : '',
757
+ ].join('')}
758
+ </div>
759
+ `;
760
+ },
761
+ divCreate: {
762
+ style: 'margin-top: 8px;',
763
+ },
764
+ });
765
+ };
766
+
767
+ const optionView = () => {
768
+ const id = glitter.getUUID();
769
+
770
+ return gvc.bindView({
771
+ bind: id,
772
+ view: () => {
773
+ function includesItem(item: any) {
774
+ const text = vm.search.toLowerCase();
775
+ return item.name?.toLowerCase().includes(text) || item.note?.toLowerCase().includes(text);
776
+ }
777
+
778
+ const targetList = data.visible_type === 'user' ? vm.userList : vm.levelList;
779
+
780
+ if (!targetList) {
781
+ return BgWidget.spinner({ container: { class: 'w-100' } });
782
+ }
783
+
784
+ const filterList = targetList.filter((item: any) => includesItem(item));
785
+ const filterListIdArray = new Set(filterList.map((item: any) => item.key));
786
+
787
+ return BgWidget.multiCheckboxContainer(gvc, filterList, data.visible_data_array ?? [], items => {
788
+ data.visible_data_array = [
789
+ ...new Set(
790
+ (data.visible_data_array ?? [])
791
+ .filter(item => {
792
+ return !filterListIdArray.has(item);
793
+ })
794
+ .concat(items)
795
+ ),
796
+ ];
797
+ });
798
+ },
799
+ divCreate: {
800
+ style: 'max-height: 300px; overflow-y: auto; width: 100%;',
801
+ },
802
+ onCreate: () => {
803
+ if (vm.userList === undefined) {
804
+ this.getUserOption().then(data => {
805
+ vm.userList = data;
806
+ gvc.notifyDataChange(id);
807
+ });
808
+ }
809
+
810
+ if (vm.levelList === undefined) {
811
+ this.getLevelOption().then(data => {
812
+ vm.levelList = data;
813
+ gvc.notifyDataChange(id);
814
+ });
815
+ }
816
+ },
817
+ });
818
+ };
819
+
820
+ const setVisibleDataArray = () => {
821
+ return gvc.bindView({
822
+ bind: ids.dataArray,
823
+ view: () => {
824
+ if (data.visible_type === 'user' || data.visible_type === 'level') {
825
+ if (!vm.show) {
826
+ if (vm.dataLoading) {
827
+ return BgWidget.spinner({ container: { class: 'w-100' } });
828
+ }
829
+
830
+ return html`
831
+ <div class="mt-2">${data.visible_type === 'user' ? '顧客名稱' : '會員等級'}</div>
832
+ ${BgWidget.horizontalLine()}
833
+ <div class="d-flex flex-column gap-1">
834
+ ${Array.isArray(vm.visibleDataList)
835
+ ? data.visible_type === 'user'
836
+ ? vm.visibleDataList
837
+ .map(item => {
838
+ return html`<div class="d-flex gap-1">
839
+ <div>${item.userData.name}</div>
840
+ ${BgWidget.grayNote(item.account)}
841
+ </div>`;
842
+ })
843
+ .join('')
844
+ : vm.visibleDataList
845
+ .map(item => {
846
+ return html`<div class="d-flex gap-1">
847
+ <div>${item.title.replace('會員等級 - ', '')}</div>
848
+ </div>`;
849
+ })
850
+ .join('')
851
+ : ''}
852
+ </div>
853
+ `;
854
+ }
855
+
856
+ return BgWidget.mainCard(
857
+ [
858
+ html`<div
859
+ class="d-flex align-items-center cursor_pointer"
860
+ onclick="${gvc.event(() => {
861
+ vm.show = false;
862
+ vm.dataLoading = true;
863
+ gvc.notifyDataChange(ids.dataArray);
864
+ })}"
865
+ >
866
+ ${BgWidget.goBack('')}
867
+ <span>返回</span>
868
+ </div>`,
869
+ BgWidget.searchPlace(
870
+ gvc.event(e => {
871
+ vm.search = e.value;
872
+ gvc.notifyDataChange(ids.dataArray);
873
+ }),
874
+ vm.search || '',
875
+ '搜尋',
876
+ undefined,
877
+ '0',
878
+ 'width: 100%;'
879
+ ),
880
+ optionView(),
881
+ ].join(''),
882
+ 'd-flex flex-column align-items-start'
883
+ );
884
+ }
885
+
886
+ return '';
887
+ },
888
+ divCreate: {
889
+ class: 'mt-1 p-1',
890
+ },
891
+ onCreate: () => {
892
+ if (vm.dataLoading && (data.visible_type === 'user' || data.visible_type === 'level')) {
893
+ Promise.all([
894
+ Array.isArray(data.visible_data_array) && data.visible_data_array.length > 0
895
+ ? data.visible_type === 'user'
896
+ ? this.getUserList(data.visible_data_array)
897
+ : this.getLevelList(data.visible_data_array)
898
+ : [],
899
+ ]).then(([visibleDataList]) => {
900
+ vm.visibleDataList = visibleDataList;
901
+ vm.dataLoading = false;
902
+ gvc.notifyDataChange(ids.dataArray);
903
+ });
904
+ }
905
+ },
906
+ });
907
+ };
908
+
909
+ const backToDefault = () => {
910
+ return html`<div
911
+ class="position-absolute bottom-0 left-0 w-100 d-flex align-items-center justify-content-end p-3 border-top pe-4"
912
+ style="gap: 10px; background-color: #fff"
913
+ >
914
+ ${BgWidget.cancel(
915
+ gvc.event(() => {
916
+ data = vm.cloneData;
917
+ vm.show = false;
918
+ vm.dataLoading = true;
919
+ gvc.notifyDataChange(ids.main);
920
+ }),
921
+ '回到預設值'
922
+ )}
923
+ </div>`;
924
+ };
925
+
926
+ const view = [
927
+ BgWidget.editeInput({
928
+ gvc: gvc,
929
+ title: '選單名稱wwww',
930
+ default: data.title || '',
931
+ placeHolder: '請輸入選單名稱',
932
+ callback: text => {
933
+ data.title = text;
934
+ },
935
+ }),
936
+ BgWidget.linkList({
937
+ gvc: gvc,
938
+ title: '連結位置',
939
+ default: data.link || '',
940
+ placeHolder: '選擇或貼上外部連結',
941
+ callback: text => {
942
+ data.link = text;
943
+ },
944
+ }),
945
+ setVisibleSelect(),
946
+ setVisibleDataArray(),
947
+ backToDefault(),
948
+ ]
949
+ .map(h => html`<div class="w-100">${h}</div>`)
950
+ .join('');
708
951
 
709
952
  rightMenu.closeEvent = () => {
710
953
  if (data.title.length > 0 || data.link.length > 0) {
711
954
  save(data);
712
955
  }
713
956
  };
957
+
714
958
  rightMenu.toggle({
715
959
  visible: true,
716
960
  title: '新增選單',
717
- view: [
718
- gvc.bindView(() => {
719
- const id = gvc.glitter.getUUID();
720
- return {
721
- bind: id,
722
- view: () => {
723
- return [
724
- EditorElem.editeInput({
725
- gvc: gvc,
726
- title: '選單名稱',
727
- default: data.title || '',
728
- placeHolder: '請輸入選單名稱',
729
- callback: text => {
730
- data.title = text;
731
- },
732
- }),
733
- BgWidget.linkList({
734
- gvc: gvc,
735
- title: '',
736
- default: data.link || '',
737
- placeHolder: '選擇或貼上外部連結',
738
- callback: text => {
739
- data.link = text;
740
- },
741
- }),
742
- ].join('');
743
- },
744
- divCreate: {
745
- style: `padding:20px;`,
746
- },
747
- };
748
- }),
749
- ].join(''),
961
+ view: gvc.bindView({
962
+ bind: ids.main,
963
+ view: () => html`<div class="d-flex flex-column p-3">${view}</div>`,
964
+ }),
750
965
  right: true,
751
966
  });
752
967
  }
@@ -761,6 +976,7 @@ export class MenusSetting {
761
976
  save(data);
762
977
  }
763
978
  };
979
+
764
980
  rightMenu.toggle({
765
981
  visible: true,
766
982
  title: '新增分類',
@@ -791,7 +1007,7 @@ export class MenusSetting {
791
1007
  ].join('');
792
1008
  },
793
1009
  divCreate: {
794
- style: `padding:20px;`,
1010
+ style: 'padding: 20px;',
795
1011
  },
796
1012
  };
797
1013
  }),
@@ -799,6 +1015,81 @@ export class MenusSetting {
799
1015
  right: true,
800
1016
  });
801
1017
  }
1018
+
1019
+ //! 拿 user id
1020
+ static async getUserList(visible_data_array: string[]) {
1021
+ return await ApiUser.getUserList({
1022
+ page: 0,
1023
+ // limit: 99999,
1024
+ limit: 15,
1025
+ only_id: true,
1026
+ id: visible_data_array.join(','),
1027
+ }).then(dd => {
1028
+ try {
1029
+ return dd.response.data;
1030
+ } catch (error) {
1031
+ return [];
1032
+ }
1033
+ });
1034
+ }
1035
+
1036
+ //! 拿會員選項
1037
+ static async getUserOption() {
1038
+ return await ApiUser.getUserList({
1039
+ page: 0,
1040
+ // limit: 99999,
1041
+ limit: 15,
1042
+ only_id: true,
1043
+ }).then(dd => {
1044
+ try {
1045
+ return (
1046
+ dd.response.data.map(
1047
+ (item: {
1048
+ userID: number;
1049
+ userData: {
1050
+ name: string;
1051
+ email: string;
1052
+ };
1053
+ }) => {
1054
+ return {
1055
+ key: item.userID,
1056
+ name: item.userData.name ?? '(尚無姓名)',
1057
+ note: item.userData.email,
1058
+ };
1059
+ }
1060
+ ) ?? []
1061
+ );
1062
+ } catch (error) {
1063
+ return [];
1064
+ }
1065
+ });
1066
+ }
1067
+
1068
+ //! 拿等級id
1069
+ static async getLevelList(visible_data_array: string[]) {
1070
+ return await ApiUser.getUserGroupList('level').then(r => {
1071
+ if (r.result && Array.isArray(r.response?.data)) {
1072
+ return r.response.data.filter((d: { tag: string; title: string }) => {
1073
+ return visible_data_array?.includes(d.tag === '' ? 'default' : d.tag);
1074
+ });
1075
+ }
1076
+
1077
+ return [];
1078
+ });
1079
+ }
1080
+
1081
+ //! 拿等級選項
1082
+ static async getLevelOption() {
1083
+ return await ApiUser.getUserGroupList('level').then(r => {
1084
+ if (r.result && Array.isArray(r.response?.data)) {
1085
+ return r.response.data.map((d: { tag: string; title: string }) => ({
1086
+ key: d.tag || 'default',
1087
+ name: d.title.replace('會員等級 - ', ''),
1088
+ }));
1089
+ }
1090
+ return [];
1091
+ });
1092
+ }
802
1093
  }
803
1094
 
804
1095
  (window as any).glitter.setModule(import.meta.url, MenusSetting);