ts-glitter 13.3.5 → 13.3.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 (99) 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 -7
  4. package/lowcode/backend-manager/bg-blog.ts +8 -13
  5. package/lowcode/backend-manager/bg-graph-api.js +6 -11
  6. package/lowcode/backend-manager/bg-graph-api.ts +14 -20
  7. package/lowcode/backend-manager/bg-line.js +526 -1002
  8. package/lowcode/backend-manager/bg-line.ts +1815 -2354
  9. package/lowcode/backend-manager/bg-notify.js +392 -746
  10. package/lowcode/backend-manager/bg-notify.ts +436 -835
  11. package/lowcode/backend-manager/bg-project.js +176 -293
  12. package/lowcode/backend-manager/bg-project.ts +214 -344
  13. package/lowcode/backend-manager/bg-recommend.js +39 -148
  14. package/lowcode/backend-manager/bg-recommend.ts +43 -162
  15. package/lowcode/backend-manager/bg-sns.js +489 -814
  16. package/lowcode/backend-manager/bg-sns.ts +1876 -2238
  17. package/lowcode/backend-manager/bg-widget.js +301 -171
  18. package/lowcode/backend-manager/bg-widget.ts +324 -193
  19. package/lowcode/cms-plugin/ai-points.js +84 -67
  20. package/lowcode/cms-plugin/ai-points.ts +280 -247
  21. package/lowcode/cms-plugin/auto-reply.js +6 -7
  22. package/lowcode/cms-plugin/auto-reply.ts +6 -7
  23. package/lowcode/cms-plugin/data-analyze.js +5 -6
  24. package/lowcode/cms-plugin/data-analyze.ts +5 -6
  25. package/lowcode/cms-plugin/form-setting.js +122 -220
  26. package/lowcode/cms-plugin/form-setting.ts +124 -240
  27. package/lowcode/cms-plugin/line-auto-reply.js +17 -18
  28. package/lowcode/cms-plugin/line-auto-reply.ts +29 -36
  29. package/lowcode/cms-plugin/member-group-list.js +5 -2
  30. package/lowcode/cms-plugin/member-group-list.ts +5 -2
  31. package/lowcode/cms-plugin/member-type-list.js +36 -84
  32. package/lowcode/cms-plugin/member-type-list.ts +39 -92
  33. package/lowcode/cms-plugin/menus-setting.js +8 -73
  34. package/lowcode/cms-plugin/menus-setting.ts +8 -78
  35. package/lowcode/cms-plugin/permission-setting.js +73 -106
  36. package/lowcode/cms-plugin/permission-setting.ts +236 -278
  37. package/lowcode/cms-plugin/shopping-collections.js +95 -137
  38. package/lowcode/cms-plugin/shopping-collections.ts +103 -147
  39. package/lowcode/cms-plugin/shopping-discount-setting.js +310 -416
  40. package/lowcode/cms-plugin/shopping-discount-setting.ts +1269 -1386
  41. package/lowcode/cms-plugin/shopping-finance-setting.js +1 -0
  42. package/lowcode/cms-plugin/shopping-finance-setting.ts +1 -0
  43. package/lowcode/cms-plugin/shopping-order-manager.js +742 -973
  44. package/lowcode/cms-plugin/shopping-order-manager.ts +1928 -2164
  45. package/lowcode/cms-plugin/shopping-order-return.js +147 -267
  46. package/lowcode/cms-plugin/shopping-order-return.ts +154 -292
  47. package/lowcode/cms-plugin/shopping-product-setting.js +6 -2
  48. package/lowcode/cms-plugin/shopping-product-setting.ts +8 -4
  49. package/lowcode/cms-plugin/shopping-product-stock.js +12 -92
  50. package/lowcode/cms-plugin/shopping-product-stock.ts +14 -94
  51. package/lowcode/cms-plugin/shopping-product-text.js +0 -3
  52. package/lowcode/cms-plugin/shopping-product-text.ts +0 -3
  53. package/lowcode/cms-plugin/shopping-rebate.js +95 -151
  54. package/lowcode/cms-plugin/shopping-rebate.ts +101 -159
  55. package/lowcode/cms-plugin/sms-points.js +83 -67
  56. package/lowcode/cms-plugin/sms-points.ts +281 -241
  57. package/lowcode/cms-plugin/sns-auto-reply.js +18 -18
  58. package/lowcode/cms-plugin/sns-auto-reply.ts +34 -40
  59. package/lowcode/cms-plugin/user-list.js +71 -90
  60. package/lowcode/cms-plugin/user-list.ts +76 -95
  61. package/lowcode/cms-plugin/web-config-setting.js +61 -111
  62. package/lowcode/cms-plugin/web-config-setting.ts +65 -124
  63. package/lowcode/css/editor.css +5 -2
  64. package/lowcode/glitter-base/route/shopping.js +1 -1
  65. package/lowcode/glitter-base/route/shopping.ts +19 -19
  66. package/lowcode/jspage/editor.js +1 -1
  67. package/lowcode/jspage/editor.ts +1 -1
  68. package/lowcode/jspage/main.js +3 -0
  69. package/lowcode/jspage/main.ts +3 -0
  70. package/package.json +1 -2
  71. package/src/api-public/controllers/ai-chat.js.map +5 -1
  72. package/src/api-public/controllers/article.js.map +1 -1
  73. package/src/api-public/controllers/chat.js.map +1 -1
  74. package/src/api-public/controllers/fb-message.js.map +1 -1
  75. package/src/api-public/controllers/index.js.map +1 -1
  76. package/src/api-public/controllers/line-message.js.map +1 -1
  77. package/src/api-public/controllers/rebate.js.map +1 -1
  78. package/src/api-public/controllers/shop.js.map +1 -1
  79. package/src/api-public/controllers/user.js.map +1 -1
  80. package/src/api-public/services/auto-send-email.js.map +1 -1
  81. package/src/api-public/services/chat.js +3 -3
  82. package/src/api-public/services/chat.js.map +1 -1
  83. package/src/api-public/services/chat.ts +2 -3
  84. package/src/api-public/services/fb-message.js.map +5 -1
  85. package/src/api-public/services/filter-protect-data.js.map +1 -1
  86. package/src/api-public/services/line-message.js.map +1 -1
  87. package/src/api-public/services/monitor.js.map +1 -1
  88. package/src/api-public/services/notify.js.map +1 -1
  89. package/src/api-public/services/rebate.js.map +1 -1
  90. package/src/api-public/services/schedule.js.map +1 -1
  91. package/src/api-public/services/share-permission.js.map +1 -1
  92. package/src/api-public/services/shopping.js.map +1 -1
  93. package/src/api-public/services/user.js +67 -66
  94. package/src/api-public/services/user.js.map +1 -1
  95. package/src/api-public/services/user.ts +212 -182
  96. package/src/helper/glitter-util.js.map +1 -1
  97. package/src/modules/firebase.d.ts +1 -0
  98. package/src/modules/firebase.js +1 -1
  99. package/src/modules/firebase.js.map +1 -1
@@ -1,31 +1,32 @@
1
- import {GVC} from '../glitterBundle/GVController.js';
2
- import {BgWidget} from '../backend-manager/bg-widget.js';
3
- import {BgProduct, OptionsItem} from '../backend-manager/bg-product.js';
4
- import {ApiShop} from '../glitter-base/route/shopping.js';
5
- import {ApiPost} from '../glitter-base/route/post.js';
6
- import {ApiUser} from '../glitter-base/route/user.js';
7
- import {EditorElem} from '../glitterBundle/plugins/editor-elem.js';
8
- import {ShareDialog} from '../glitterBundle/dialog/ShareDialog.js';
9
- import {FilterOptions} from './filter-options.js';
10
- import {Tool} from '../modules/tool.js';
1
+ import { GVC } from '../glitterBundle/GVController.js';
2
+ import { BgWidget } from '../backend-manager/bg-widget.js';
3
+ import { BgProduct, OptionsItem } from '../backend-manager/bg-product.js';
4
+ import { ApiShop } from '../glitter-base/route/shopping.js';
5
+ import { ApiPost } from '../glitter-base/route/post.js';
6
+ import { ApiUser } from '../glitter-base/route/user.js';
7
+ import { EditorElem } from '../glitterBundle/plugins/editor-elem.js';
8
+ import { ShareDialog } from '../glitterBundle/dialog/ShareDialog.js';
9
+ import { FilterOptions } from './filter-options.js';
10
+ import { Tool } from '../modules/tool.js';
11
11
 
12
12
  export class ShoppingDiscountSetting {
13
- public static getLabel(voucher_type:string){
14
- switch (voucher_type){
15
- case "giveaway":
16
- return `贈品活動`
17
- case "add_on_items":
18
- return `加價購活動`
19
- case "discount":
20
- return `折扣活動`
21
- case "rebate":
22
- return `回饋金活動`
23
- case "shipment_free":
24
- return `免運費活動`
13
+ public static getLabel(voucher_type: string) {
14
+ switch (voucher_type) {
15
+ case 'giveaway':
16
+ return `贈品活動`;
17
+ case 'add_on_items':
18
+ return `加價購活動`;
19
+ case 'discount':
20
+ return `折扣活動`;
21
+ case 'rebate':
22
+ return `回饋金活動`;
23
+ case 'shipment_free':
24
+ return `免運費活動`;
25
25
  }
26
- return ``
26
+ return ``;
27
27
  }
28
- public static main(gvc: GVC,voucher_type:'rebate' | 'discount' | 'shipment_free' | 'add_on_items' | 'giveaway') {
28
+
29
+ public static main(gvc: GVC, voucher_type: 'rebate' | 'discount' | 'shipment_free' | 'add_on_items' | 'giveaway') {
29
30
  const glitter = gvc.glitter;
30
31
  const vm: {
31
32
  type: 'list' | 'add' | 'replace';
@@ -45,7 +46,7 @@ export class ShoppingDiscountSetting {
45
46
  const filterID = glitter.getUUID();
46
47
  return {
47
48
  bind: id,
48
- dataList: [{obj: vm, key: 'type'}],
49
+ dataList: [{ obj: vm, key: 'type' }],
49
50
  view: () => {
50
51
  if (vm.type === 'list') {
51
52
  return BgWidget.container(
@@ -54,71 +55,48 @@ export class ShoppingDiscountSetting {
54
55
  ${BgWidget.title(ShoppingDiscountSetting.getLabel(voucher_type))}
55
56
  <div class="flex-fill"></div>
56
57
  ${BgWidget.darkButton(
57
- `新增${ShoppingDiscountSetting.getLabel(voucher_type)}`,
58
- gvc.event(() => {
59
- vm.data = undefined;
60
- vm.type = 'add';
61
- })
58
+ `新增${ShoppingDiscountSetting.getLabel(voucher_type)}`,
59
+ gvc.event(() => {
60
+ vm.data = undefined;
61
+ vm.type = 'add';
62
+ })
62
63
  )}
63
64
  </div>
64
65
  ${BgWidget.container(
65
- BgWidget.mainCard(
66
- BgWidget.tableV2({
67
- gvc: gvc,
68
- getData: (vmi) => {
69
- ApiShop.getVoucher({
70
- page: vmi.page - 1,
71
- limit: 20,
72
- search: vm.query || undefined,
73
- voucher_type:voucher_type
74
- }).then((data) => {
75
- vmi.pageSize = Math.ceil(data.response.total / 20);
76
- vm.dataList = data.response.data;
77
-
78
- function getDatalist() {
79
- return data.response.data.map((dd: any) => {
80
- return [
81
- {
82
- key: EditorElem.checkBoxOnly({
83
- gvc: gvc,
84
- def: !data.response.data.find((dd: any) => {
85
- return !dd.checked;
86
- }),
87
- callback: (result) => {
88
- data.response.data.map((dd: any) => {
89
- dd.checked = result;
90
- });
91
- vmi.data = getDatalist();
92
- vmi.callback();
93
- gvc.notifyDataChange(filterID);
94
- },
95
- }),
96
- value: EditorElem.checkBoxOnly({
97
- gvc: gvc,
98
- def: dd.checked,
99
- callback: (result) => {
100
- dd.checked = result;
101
- vmi.data = getDatalist();
102
- vmi.callback();
103
- gvc.notifyDataChange(filterID);
104
- },
105
- style: 'height:25px;',
106
- }),
107
- },
108
- {
109
- key: '標題',
110
- value: html`<span
111
- class="fs-7">${dd.content.title}</span>`,
112
- },
113
- {
114
- key: '狀態',
115
- value: dd.content.status
116
- ? BgWidget.successInsignia('啟用中')
117
- : BgWidget.secondaryInsignia('已停用'),
118
- },
119
- {
120
- key: '觸發方式',
121
- value: html`<span class="fs-7"
66
+ BgWidget.mainCard(
67
+ [
68
+ BgWidget.searchPlace(
69
+ gvc.event((e) => {
70
+ vm.query = e.value;
71
+ gvc.notifyDataChange(id);
72
+ }),
73
+ vm.query || '',
74
+ '搜尋所有折扣'
75
+ ),
76
+ BgWidget.tableV3({
77
+ gvc: gvc,
78
+ getData: (vmi) => {
79
+ const limit = 20;
80
+ ApiShop.getVoucher({
81
+ page: vmi.page - 1,
82
+ limit: limit,
83
+ search: vm.query || undefined,
84
+ voucher_type: voucher_type,
85
+ }).then((data) => {
86
+ function getDatalist() {
87
+ return data.response.data.map((dd: any) => {
88
+ return [
89
+ {
90
+ key: '標題',
91
+ value: html`<span class="fs-7">${dd.content.title}</span>`,
92
+ },
93
+ {
94
+ key: '狀態',
95
+ value: dd.content.status ? BgWidget.successInsignia('啟用中') : BgWidget.secondaryInsignia('已停用'),
96
+ },
97
+ {
98
+ key: '觸發方式',
99
+ value: html`<span class="fs-7"
122
100
  >${(() => {
123
101
  switch (dd.content.trigger) {
124
102
  case 'auto':
@@ -131,108 +109,71 @@ export class ShoppingDiscountSetting {
131
109
  return '尚未設定';
132
110
  }
133
111
  })()}</span
134
- >`,
135
- },
136
- {
137
- key: '對象',
138
- value: html`<span
139
- class="fs-7">${dd.content.for === 'product' ? `指定商品` : `商品分類`}</span>`,
140
- },
141
- {
142
- key: '折扣項目',
143
- value: html`<span
144
- class="fs-7">${dd.content.method === 'percent' ? `折扣${dd.content.value}%` : `折扣$${dd.content.value}`}</span>`,
145
- },
146
- ];
147
- });
148
- }
112
+ >`,
113
+ },
114
+ {
115
+ key: '對象',
116
+ value: html`<span class="fs-7">${dd.content.for === 'product' ? `指定商品` : `商品分類`}</span>`,
117
+ },
118
+ {
119
+ key: '折扣項目',
120
+ value: html`<span class="fs-7"
121
+ >${dd.content.method === 'percent' ? `折扣${dd.content.value}%` : `折扣$${dd.content.value}`}</span
122
+ >`,
123
+ },
124
+ ];
125
+ });
126
+ }
149
127
 
150
- vmi.data = getDatalist();
151
- vmi.loading = false;
152
- vmi.callback();
153
- });
154
- },
155
- rowClick: (data, index) => {
156
- vm.data = vm.dataList[index].content;
157
- vm.type = 'replace';
128
+ vm.dataList = data.response.data;
129
+ vmi.pageSize = Math.ceil(data.response.total / limit);
130
+ vmi.originalData = vm.dataList;
131
+ vmi.tableData = getDatalist();
132
+ vmi.loading = false;
133
+ vmi.callback();
134
+ });
135
+ },
136
+ rowClick: (data, index) => {
137
+ vm.data = vm.dataList[index].content;
138
+ vm.type = 'replace';
139
+ },
140
+ filter: [
141
+ {
142
+ name: '批量移除',
143
+ event: () => {
144
+ const dialog = new ShareDialog(gvc.glitter);
145
+ dialog.checkYesOrNot({
146
+ text: '是否確認刪除所選項目?',
147
+ callback: (response) => {
148
+ if (response) {
149
+ dialog.dataLoading({ visible: true });
150
+ ApiShop.deleteVoucher({
151
+ id: vm.dataList
152
+ .filter((dd: any) => {
153
+ return dd.checked;
154
+ })
155
+ .map((dd: any) => {
156
+ return dd.id;
157
+ })
158
+ .join(`,`),
159
+ }).then((res) => {
160
+ dialog.dataLoading({ visible: false });
161
+ if (res.result) {
162
+ vm.dataList = undefined;
163
+ gvc.notifyDataChange(id);
164
+ } else {
165
+ dialog.errorMessage({ text: '刪除失敗' });
166
+ }
167
+ });
168
+ }
169
+ },
170
+ });
171
+ },
158
172
  },
159
- filter: html` ${BgWidget.searchPlace(
160
- gvc.event((e) => {
161
- vm.query = e.value;
162
- gvc.notifyDataChange(id);
163
- }),
164
- vm.query || '',
165
- '搜尋所有折扣'
166
- )}
167
- ${gvc.bindView(() => {
168
- return {
169
- bind: filterID,
170
- view: () => {
171
- if (
172
- !vm.dataList ||
173
- !vm.dataList.find((dd: any) => {
174
- return dd.checked;
175
- })
176
- ) {
177
- return ``;
178
- } else {
179
- const dialog = new ShareDialog(gvc.glitter);
180
- const selCount = vm.dataList.filter((dd: any) => dd.checked).length;
181
- return BgWidget.selNavbar({
182
- count: selCount,
183
- buttonList: [
184
- BgWidget.selEventButton(
185
- '批量移除',
186
- gvc.event(() => {
187
- dialog.checkYesOrNot({
188
- text: '是否確認刪除所選項目?',
189
- callback: (response) => {
190
- if (response) {
191
- dialog.dataLoading({visible: true});
192
- ApiShop.deleteVoucher({
193
- id: vm.dataList
194
- .filter((dd: any) => {
195
- return dd.checked;
196
- })
197
- .map((dd: any) => {
198
- return dd.id;
199
- })
200
- .join(`,`),
201
- }).then((res) => {
202
- dialog.dataLoading({visible: false});
203
- if (res.result) {
204
- vm.dataList = undefined;
205
- gvc.notifyDataChange(id);
206
- } else {
207
- dialog.errorMessage({text: '刪除失敗'});
208
- }
209
- });
210
- }
211
- },
212
- });
213
- })
214
- ),
215
- ],
216
- });
217
- }
218
- },
219
- divCreate: () => {
220
- return {
221
- class: `d-flex align-items-center p-2 py-3 ${
222
- !vm.dataList ||
223
- !vm.dataList.find((dd: any) => {
224
- return dd.checked;
225
- })
226
- ? `d-none`
227
- : ``
228
- }`,
229
- style: ``,
230
- };
231
- },
232
- };
233
- })}`,
234
- })
235
- )
173
+ ],
174
+ }),
175
+ ].join('')
176
+ )
236
177
  )}
237
178
  ${BgWidget.mbContainer(120)}
238
179
  `,
@@ -243,14 +184,14 @@ export class ShoppingDiscountSetting {
243
184
  vm: vm,
244
185
  gvc: gvc,
245
186
  type: 'replace',
246
- reBackType:voucher_type
187
+ reBackType: voucher_type,
247
188
  });
248
189
  } else {
249
190
  return this.voucherEditor({
250
191
  vm: vm,
251
192
  gvc: gvc,
252
193
  type: 'add',
253
- reBackType:voucher_type
194
+ reBackType: voucher_type,
254
195
  });
255
196
  }
256
197
  },
@@ -267,10 +208,10 @@ export class ShoppingDiscountSetting {
267
208
  const hours = now.getHours().toString().padStart(2, '0');
268
209
  const dateStr = `${year}-${month}-${day}`;
269
210
  const timeStr = `${hours}:00`;
270
- return {date: dateStr, time: timeStr};
211
+ return { date: dateStr, time: timeStr };
271
212
  };
272
213
 
273
- public static voucherEditor(obj: { vm: any; gvc: GVC; type?: 'add' | 'replace'; defData?: any,reBackType:string }) {
214
+ public static voucherEditor(obj: { vm: any; gvc: GVC; type?: 'add' | 'replace'; defData?: any; reBackType: string }) {
274
215
  const gvc = obj.gvc;
275
216
  const glitter = gvc.glitter;
276
217
  const vm = obj.vm;
@@ -284,7 +225,7 @@ export class ShoppingDiscountSetting {
284
225
  trigger: 'auto' | 'code' | 'distribution';
285
226
  device: ('normal' | 'pos')[];
286
227
  value: string;
287
- add_on_products?:string[]
228
+ add_on_products?: string[];
288
229
  for: 'collection' | 'product' | 'all';
289
230
  rule: 'min_price' | 'min_count';
290
231
  counting: 'single' | 'each';
@@ -337,9 +278,9 @@ export class ShoppingDiscountSetting {
337
278
  };
338
279
 
339
280
  const productForList = [
340
- {title: '所有商品', value: 'all'},
341
- {title: '商品分類', value: 'collection'},
342
- {title: '單一商品', value: 'product'},
281
+ { title: '所有商品', value: 'all' },
282
+ { title: '商品分類', value: 'collection' },
283
+ { title: '單一商品', value: 'product' },
343
284
  ];
344
285
 
345
286
  function getVoucherTextList() {
@@ -424,805 +365,762 @@ export class ShoppingDiscountSetting {
424
365
  return BgWidget.container(
425
366
  [
426
367
  // 上層導覽
427
- html`
428
- <div class="d-flex w-100 align-items-center">
429
- ${BgWidget.goBack(
430
- gvc.event(() => {
431
- vm.type = 'list';
432
- })
433
- )}
434
- ${BgWidget.title(obj.type === 'add' ? `新增${ShoppingDiscountSetting.getLabel(obj.reBackType)}` : `編輯${ShoppingDiscountSetting.getLabel(obj.reBackType)}`)}
435
- </div>`,
368
+ html` <div class="d-flex w-100 align-items-center">
369
+ ${BgWidget.goBack(
370
+ gvc.event(() => {
371
+ vm.type = 'list';
372
+ })
373
+ )}
374
+ ${BgWidget.title(obj.type === 'add' ? `新增${ShoppingDiscountSetting.getLabel(obj.reBackType)}` : `編輯${ShoppingDiscountSetting.getLabel(obj.reBackType)}`)}
375
+ </div>`,
436
376
  // 左右容器
437
- html`
438
- <div class="d-flex justify-content-center ${document.body.clientWidth < 768 ? 'flex-column' : ''}"
439
- style="gap: 24px">
440
- ${BgWidget.container(
441
- // 優惠券設定
377
+ html` <div class="d-flex justify-content-center ${document.body.clientWidth < 768 ? 'flex-column' : ''}" style="gap: 24px">
378
+ ${BgWidget.container(
379
+ // 優惠券設定
380
+ [
381
+ BgWidget.mainCard(
442
382
  [
443
- BgWidget.mainCard(
444
- [
445
- html`
446
- <div class="tx_700">活動標題</div>
447
- ${BgWidget.mbContainer(18)}
448
- ${BgWidget.editeInput({
449
- gvc: gvc,
450
- title: '',
451
- default: voucherData.title,
452
- placeHolder: '請輸入活動標題',
453
- callback: (text) => {
454
- voucherData.title = text;
455
- },
456
- })}
457
- ${BgWidget.grayNote('顧客將會在「購物車」與「結帳」看見此標題', 'margin-left: 4px;')}`,
458
- html`
459
- <div class="tx_700">活動狀態</div>
460
- ${BgWidget.mbContainer(12)}
461
- ${BgWidget.switchTextButton(gvc, voucherData.status === 1, {
462
- left: '關閉',
463
- right: '啟用'
464
- }, (bool) => {
465
- voucherData.status = bool ? 1 : 0;
466
- })}`,
467
- ].join(BgWidget.horizontalLine())
468
- ),
469
- BgWidget.mainCard(
383
+ html` <div class="tx_700">活動標題</div>
384
+ ${BgWidget.mbContainer(18)}
385
+ ${BgWidget.editeInput({
386
+ gvc: gvc,
387
+ title: '',
388
+ default: voucherData.title,
389
+ placeHolder: '請輸入活動標題',
390
+ callback: (text) => {
391
+ voucherData.title = text;
392
+ },
393
+ })}
394
+ ${BgWidget.grayNote('顧客將會在「購物車」與「結帳」看見此標題', 'margin-left: 4px;')}`,
395
+ html` <div class="tx_700">活動狀態</div>
396
+ ${BgWidget.mbContainer(12)}
397
+ ${BgWidget.switchTextButton(
398
+ gvc,
399
+ voucherData.status === 1,
400
+ {
401
+ left: '關閉',
402
+ right: '啟用',
403
+ },
404
+ (bool) => {
405
+ voucherData.status = bool ? 1 : 0;
406
+ }
407
+ )}`,
408
+ ].join(BgWidget.horizontalLine())
409
+ ),
410
+ BgWidget.mainCard(
411
+ [
412
+ html` <div class="tx_700">活動方式</div>
413
+ ${BgWidget.mbContainer(18)}
414
+ ${BgWidget.multiCheckboxContainer(
415
+ gvc,
470
416
  [
471
- html`
472
- <div class="tx_700">活動方式</div>
473
- ${BgWidget.mbContainer(18)}
474
- ${BgWidget.multiCheckboxContainer(
475
- gvc,
476
- [
477
- {
478
- key: 'auto',
479
- name: '自動折扣',
480
- innerHtml: BgWidget.grayNote('顧客將在結帳時,自動獲得折扣'),
417
+ {
418
+ key: 'auto',
419
+ name: '自動折扣',
420
+ innerHtml: BgWidget.grayNote('顧客將在結帳時,自動獲得折扣'),
421
+ },
422
+ {
423
+ key: 'code',
424
+ name: '優惠代碼',
425
+ innerHtml: (() => {
426
+ const id = glitter.getUUID();
427
+ return gvc.bindView({
428
+ bind: id,
429
+ view: () =>
430
+ gvc.map([
431
+ BgWidget.grayNote('顧客可在結帳時輸入優惠代碼,來獲得折扣'),
432
+ BgWidget.editeInput({
433
+ gvc: gvc,
434
+ title: '',
435
+ default: voucherData.code ?? '',
436
+ placeHolder: '請輸入優惠券代碼',
437
+ callback: (text) => {
438
+ voucherData.code = text;
439
+ },
440
+ endText: html` <div class="d-flex justify-content-end">
441
+ ${BgWidget.mbContainer(8)}
442
+ ${BgWidget.blueNote(
443
+ document.body.clientWidth > 768 ? '隨機產生優惠代碼' : '隨機產生',
444
+ gvc.event(() => {
445
+ voucherData.code = Tool.randomString(6).toUpperCase();
446
+ gvc.notifyDataChange(id);
447
+ })
448
+ )}
449
+ </div>`,
450
+ }),
451
+ ]),
452
+ });
453
+ })(),
454
+ },
455
+ {
456
+ key: 'distribution',
457
+ name: '供分銷連結或一頁式網頁使用',
458
+ },
459
+ ],
460
+ [voucherData.trigger],
461
+ (text) => {
462
+ if (text[0] === 'auto') {
463
+ voucherData.code = undefined;
464
+ }
465
+ if (text[0] === 'distribution') {
466
+ voucherData.for = 'all';
467
+ }
468
+ voucherData.trigger = text[0] as 'auto' | 'code' | 'distribution';
469
+ gvc.notifyDataChange(viewID);
470
+ },
471
+ { single: true }
472
+ )}`,
473
+ html` <div class="tx_700">活動對象</div>
474
+ ${BgWidget.mbContainer(18)}
475
+ ${gvc.bindView(() => {
476
+ const id = gvc.glitter.getUUID();
477
+ return {
478
+ bind: id,
479
+ view: () => {
480
+ return html`
481
+ <div style="display: flex; flex-direction: column; gap: 8px;">
482
+ ${BgWidget.selectFilter({
483
+ gvc: gvc,
484
+ callback: (text) => {
485
+ voucherData.target = text;
486
+ gvc.notifyDataChange(id);
481
487
  },
482
- {
483
- key: 'code',
484
- name: '優惠代碼',
485
- innerHtml: (() => {
486
- const id = glitter.getUUID();
487
- return gvc.bindView({
488
- bind: id,
489
- view: () =>
490
- gvc.map([
491
- BgWidget.grayNote('顧客可在結帳時輸入優惠代碼,來獲得折扣'),
492
- BgWidget.editeInput({
493
- gvc: gvc,
494
- title: '',
495
- default: voucherData.code ?? '',
496
- placeHolder: '請輸入優惠券代碼',
497
- callback: (text) => {
498
- voucherData.code = text;
499
- },
500
- endText: html`
501
- <div class="d-flex justify-content-end">
502
- ${BgWidget.mbContainer(8)}
503
- ${BgWidget.blueNote(
504
- document.body.clientWidth > 768 ? '隨機產生優惠代碼' : '隨機產生',
505
- gvc.event(() => {
506
- voucherData.code = Tool.randomString(6).toUpperCase();
507
- gvc.notifyDataChange(id);
508
- })
488
+ default: voucherData.target ?? 'all',
489
+ options: [
490
+ {
491
+ key: 'all',
492
+ value: '所有顧客',
493
+ },
494
+ {
495
+ key: 'customer',
496
+ value: '特定顧客',
497
+ },
498
+ {
499
+ key: 'levels',
500
+ value: '會員等級',
501
+ },
502
+ {
503
+ key: 'group',
504
+ value: '顧客分群',
505
+ },
506
+ ],
507
+ style: 'width: 100%;',
508
+ })}
509
+ <div>
510
+ ${(() => {
511
+ switch (voucherData.target) {
512
+ case 'all':
513
+ return '';
514
+ case 'customer':
515
+ return gvc.bindView(() => {
516
+ const customVM = {
517
+ id: gvc.glitter.getUUID(),
518
+ loading: true,
519
+ dataList: [] as OptionsItem[],
520
+ };
521
+ return {
522
+ bind: customVM.id,
523
+ view: () => {
524
+ if (customVM.loading) {
525
+ return BgWidget.spinner();
526
+ }
527
+ return html`
528
+ <div class="d-flex flex-column p-2" style="gap: 18px;">
529
+ <div
530
+ class="d-flex align-items-center gray-bottom-line-18"
531
+ style="justify-content: space-between;"
532
+ >
533
+ <div class="form-check-label c_updown_label">
534
+ <div class="tx_normal">顧客名稱</div>
535
+ </div>
536
+ ${BgWidget.grayButton(
537
+ '查看全部',
538
+ gvc.event(() => {
539
+ BgWidget.selectDropDialog({
540
+ gvc: gvc,
541
+ title: '搜尋特定顧客',
542
+ tag: 'select_users',
543
+ updownOptions: FilterOptions.userOrderBy,
544
+ callback: (value) => {
545
+ voucherData.targetList = value;
546
+ customVM.loading = true;
547
+ gvc.notifyDataChange(customVM.id);
548
+ },
549
+ default: voucherData.targetList ?? [],
550
+ api: (data: { query: string; orderString: string }) => {
551
+ return new Promise((resolve) => {
552
+ ApiUser.getUserListOrders({
553
+ page: 0,
554
+ limit: 99999,
555
+ search: data.query,
556
+ orderString: data.orderString,
557
+ }).then((dd) => {
558
+ if (dd.response.data) {
559
+ resolve(
560
+ dd.response.data.map(
561
+ (item: {
562
+ userID: number;
563
+ userData: {
564
+ name: string;
565
+ email: string;
566
+ };
567
+ }) => {
568
+ return {
569
+ key: item.userID,
570
+ value: item.userData.name ?? '(尚無姓名)',
571
+ note: item.userData.email,
572
+ };
573
+ }
574
+ )
575
+ );
576
+ }
577
+ });
578
+ });
579
+ },
580
+ style: 'width: 100%;',
581
+ });
582
+ }),
583
+ { textStyle: 'font-weight: 400;' }
509
584
  )}
510
- </div>`,
511
- }),
512
- ]),
513
- });
514
- })(),
515
- },
516
- {
517
- key: 'distribution',
518
- name: '供分銷連結或一頁式網頁使用',
519
- },
520
- ],
521
- [voucherData.trigger],
522
- (text) => {
523
- if (text[0] === 'auto') {
524
- voucherData.code = undefined;
525
- }
526
- if (text[0] === 'distribution') {
527
- voucherData.for = 'all';
528
- }
529
- voucherData.trigger = text[0] as 'auto' | 'code' | 'distribution';
530
- gvc.notifyDataChange(viewID);
531
- },
532
- {single: true}
533
- )}`,
534
- html`
535
- <div class="tx_700">活動對象</div>
536
- ${BgWidget.mbContainer(18)}
537
- ${gvc.bindView(() => {
538
- const id = gvc.glitter.getUUID();
539
- return {
540
- bind: id,
541
- view: () => {
542
- return html`
543
- <div style="display: flex; flex-direction: column; gap: 8px;">
544
- ${BgWidget.selectFilter({
545
- gvc: gvc,
546
- callback: (text) => {
547
- voucherData.target = text;
548
- gvc.notifyDataChange(id);
549
- },
550
- default: voucherData.target ?? 'all',
551
- options: [
552
- {
553
- key: 'all',
554
- value: '所有顧客'
555
- },
556
- {
557
- key: 'customer',
558
- value: '特定顧客'
559
- },
560
- {
561
- key: 'levels',
562
- value: '會員等級'
563
- },
564
- {
565
- key: 'group',
566
- value: '顧客分群'
567
- },
568
- ],
569
- style: 'width: 100%;',
570
- })}
571
- <div>
572
- ${(() => {
573
- switch (voucherData.target) {
574
- case 'all':
575
- return '';
576
- case 'customer':
577
- return gvc.bindView(() => {
578
- const customVM = {
579
- id: gvc.glitter.getUUID(),
580
- loading: true,
581
- dataList: [] as OptionsItem[],
582
- };
583
- return {
584
- bind: customVM.id,
585
- view: () => {
586
- if (customVM.loading) {
587
- return BgWidget.spinner();
585
+ </div>
586
+ ${obj.gvc.map(
587
+ customVM.dataList.map((opt: OptionsItem, index) => {
588
+ return html` <div class="form-check-label c_updown_label">
589
+ <span class="tx_normal">${index + 1} . ${opt.value}</span>
590
+ ${opt.note ? html` <span class="tx_gray_12 ms-2">${opt.note}</span> ` : ''}
591
+ </div>`;
592
+ })
593
+ )}
594
+ </div>
595
+ `;
596
+ },
597
+ onCreate: () => {
598
+ if (customVM.loading) {
599
+ if (voucherData.targetList.length === 0) {
600
+ setTimeout(() => {
601
+ customVM.dataList = [];
602
+ customVM.loading = false;
603
+ gvc.notifyDataChange(customVM.id);
604
+ }, 200);
605
+ } else {
606
+ ApiUser.getUserList({
607
+ page: 0,
608
+ limit: 99999,
609
+ id: voucherData.targetList.join(','),
610
+ }).then((dd) => {
611
+ if (dd.response.data) {
612
+ customVM.dataList = dd.response.data.map(
613
+ (item: {
614
+ userID: string;
615
+ userData: {
616
+ name: string;
617
+ email: string;
618
+ };
619
+ }) => {
620
+ return {
621
+ key: item.userID,
622
+ value: item.userData.name,
623
+ note: item.userData.email,
624
+ };
625
+ }
626
+ );
588
627
  }
589
- return html`
590
- <div class="d-flex flex-column p-2"
591
- style="gap: 18px;">
592
- <div
593
- class="d-flex align-items-center gray-bottom-line-18"
594
- style="justify-content: space-between;"
595
- >
596
- <div class="form-check-label c_updown_label">
597
- <div class="tx_normal">
598
- 顧客名稱
599
- </div>
600
- </div>
601
- ${BgWidget.grayButton(
602
- '查看全部',
603
- gvc.event(() => {
604
- BgWidget.selectDropDialog({
605
- gvc: gvc,
606
- title: '搜尋特定顧客',
607
- tag: 'select_users',
608
- updownOptions: FilterOptions.userOrderBy,
609
- callback: (value) => {
610
- voucherData.targetList = value;
611
- customVM.loading = true;
612
- gvc.notifyDataChange(customVM.id);
613
- },
614
- default: voucherData.targetList ?? [],
615
- api: (data: {
616
- query: string;
617
- orderString: string
618
- }) => {
619
- return new Promise((resolve) => {
620
- ApiUser.getUserListOrders({
621
- page: 0,
622
- limit: 99999,
623
- search: data.query,
624
- orderString: data.orderString,
625
- }).then((dd) => {
626
- if (dd.response.data) {
627
- resolve(
628
- dd.response.data.map(
629
- (item: {
630
- userID: number;
631
- userData: {
632
- name: string;
633
- email: string
634
- };
635
- }) => {
636
- return {
637
- key: item.userID,
638
- value: item.userData.name ?? '(尚無姓名)',
639
- note: item.userData.email,
640
- };
641
- }
642
- )
643
- );
644
- }
645
- });
646
- });
647
- },
648
- style: 'width: 100%;',
649
- });
650
- }),
651
- {textStyle: 'font-weight: 400;'}
652
- )}
653
- </div>
654
- ${obj.gvc.map(
655
- customVM.dataList.map((opt: OptionsItem, index) => {
656
- return html`
657
- <div class="form-check-label c_updown_label">
658
- <span class="tx_normal">${index + 1}
659
- . ${opt.value}</span>
660
- ${opt.note ? html`
661
- <span class="tx_gray_12 ms-2">${opt.note}</span> ` : ''}
662
- </div>`;
663
- })
664
- )}
665
- </div>
666
- `;
628
+ customVM.loading = false;
629
+ gvc.notifyDataChange(customVM.id);
630
+ });
631
+ }
632
+ }
633
+ },
634
+ };
635
+ });
636
+ case 'levels':
637
+ return (() => {
638
+ const levelVM = {
639
+ id: gvc.glitter.getUUID(),
640
+ loading: true,
641
+ dataList: [],
642
+ };
643
+ return gvc.bindView({
644
+ bind: levelVM.id,
645
+ view: () => {
646
+ if (levelVM.loading) {
647
+ return BgWidget.spinner({ text: { visible: false } });
648
+ } else {
649
+ return BgWidget.selectDropList({
650
+ gvc: gvc,
651
+ callback: (value: []) => {
652
+ voucherData.targetList = value;
653
+ gvc.notifyDataChange(id);
667
654
  },
668
- onCreate: () => {
669
- if (customVM.loading) {
670
- if (voucherData.targetList.length === 0) {
671
- setTimeout(() => {
672
- customVM.dataList = [];
673
- customVM.loading = false;
674
- gvc.notifyDataChange(customVM.id);
675
- }, 200);
676
- } else {
677
- ApiUser.getUserList({
678
- page: 0,
679
- limit: 99999,
680
- id: voucherData.targetList.join(','),
681
- }).then((dd) => {
682
- if (dd.response.data) {
683
- customVM.dataList = dd.response.data.map(
684
- (item: {
685
- userID: string;
686
- userData: {
687
- name: string;
688
- email: string
689
- }
690
- }) => {
691
- return {
692
- key: item.userID,
693
- value: item.userData.name,
694
- note: item.userData.email,
695
- };
696
- }
697
- );
698
- }
699
- customVM.loading = false;
700
- gvc.notifyDataChange(customVM.id);
701
- });
655
+ default: voucherData.targetList ?? [],
656
+ options: levelVM.dataList,
657
+ style: 'width: 100%;',
658
+ });
659
+ }
660
+ },
661
+ divCreate: {
662
+ style: 'width: 100%;',
663
+ },
664
+ onCreate: () => {
665
+ if (levelVM.loading) {
666
+ ApiUser.getPublicConfig('member_level_config', 'manager').then((dd: any) => {
667
+ if (dd.result && dd.response.value) {
668
+ levelVM.dataList = dd.response.value.levels.map(
669
+ (item: { id: string; tag_name: string }) => {
670
+ return {
671
+ key: item.id,
672
+ value: item.tag_name,
673
+ // note.txt: '人數'
674
+ };
702
675
  }
703
- }
676
+ );
677
+ levelVM.loading = false;
678
+ gvc.notifyDataChange(levelVM.id);
679
+ }
680
+ });
681
+ }
682
+ },
683
+ });
684
+ })();
685
+ case 'group':
686
+ return (() => {
687
+ const levelVM = {
688
+ id: gvc.glitter.getUUID(),
689
+ loading: true,
690
+ dataList: [],
691
+ };
692
+ return gvc.bindView({
693
+ bind: levelVM.id,
694
+ view: () => {
695
+ if (levelVM.loading) {
696
+ return BgWidget.spinner({ text: { visible: false } });
697
+ } else {
698
+ return BgWidget.selectDropList({
699
+ gvc: gvc,
700
+ callback: (value: []) => {
701
+ voucherData.targetList = value;
702
+ gvc.notifyDataChange(id);
704
703
  },
705
- };
706
- });
707
- case 'levels':
708
- return (() => {
709
- const levelVM = {
710
- id: gvc.glitter.getUUID(),
711
- loading: true,
712
- dataList: [],
713
- };
714
- return gvc.bindView({
715
- bind: levelVM.id,
716
- view: () => {
717
- if (levelVM.loading) {
718
- return BgWidget.spinner({text: {visible: false}});
719
- } else {
720
- return BgWidget.selectDropList({
704
+ default: voucherData.targetList ?? [],
705
+ options: levelVM.dataList,
706
+ style: 'width: 100%;',
707
+ });
708
+ }
709
+ },
710
+ divCreate: {
711
+ style: 'width: 100%;',
712
+ },
713
+ onCreate: () => {
714
+ if (levelVM.loading) {
715
+ ApiUser.getUserGroupList().then((dd: any) => {
716
+ if (dd.result && dd.response.data) {
717
+ levelVM.dataList = dd.response.data
718
+ .filter((item: any) => {
719
+ return item.type !== 'level';
720
+ })
721
+ .map((item: any) => {
722
+ return {
723
+ key: item.type,
724
+ value: item.title,
725
+ };
726
+ });
727
+ levelVM.loading = false;
728
+ gvc.notifyDataChange(levelVM.id);
729
+ }
730
+ });
731
+ }
732
+ },
733
+ });
734
+ })();
735
+ default:
736
+ return '';
737
+ }
738
+ })()}
739
+ </div>
740
+ </div>
741
+ `;
742
+ },
743
+ };
744
+ })}`,
745
+ html` <div class="tx_700">可使用訂單來源</div>
746
+ ${BgWidget.mbContainer(18)}
747
+ ${BgWidget.multiCheckboxContainer(
748
+ gvc,
749
+ [
750
+ { key: 'normal', name: 'APP & 官網' },
751
+ { key: 'pos', name: 'POS' },
752
+ ],
753
+ voucherData.device ?? ['normal'],
754
+ (text) => {
755
+ voucherData.device = text as ('normal' | 'pos')[];
756
+ gvc.notifyDataChange(viewID);
757
+ },
758
+ { single: false }
759
+ )}`,
760
+ ]
761
+ .map((str) => {
762
+ return html` <div>${str}</div>`;
763
+ })
764
+ .join(BgWidget.horizontalLine())
765
+ ),
766
+ BgWidget.mainCard(
767
+ gvc.bindView(() => {
768
+ const id = glitter.getUUID();
769
+ voucherData.forKey = voucherData.forKey ?? [];
770
+ let defKeys: any = {
771
+ collection: JSON.parse(JSON.stringify(voucherData.forKey)),
772
+ product: JSON.parse(JSON.stringify(voucherData.forKey)),
773
+ };
774
+ return {
775
+ bind: id,
776
+ dataList: [
777
+ { obj: voucherData, key: 'method' },
778
+ { obj: voucherData, key: 'reBackType' },
779
+ ],
780
+ view: () => {
781
+ return [
782
+ ...(() => {
783
+ if (['shipment_free', 'add_on_items', 'giveaway'].includes(voucherData.reBackType)) {
784
+ return [];
785
+ }
786
+ const valueInput = (obj: { startText?: string; endText?: string }) => {
787
+ return BgWidget.editeInput({
788
+ gvc: gvc,
789
+ type: 'number',
790
+ divStyle: 'width:150px;',
791
+ title: '',
792
+ default: voucherData.value,
793
+ placeHolder: '',
794
+ callback: (text) => {
795
+ const texInt = parseInt(text, 10);
796
+ if (voucherData.method === 'percent' && (texInt > 100 || texInt < 0)) {
797
+ const dialog = new ShareDialog(gvc.glitter);
798
+ dialog.infoMessage({ text: '數值需介於0~100' });
799
+ gvc.notifyDataChange(id);
800
+ } else {
801
+ voucherData.value = text;
802
+ }
803
+ },
804
+ startText: obj.startText,
805
+ endText: obj.endText,
806
+ });
807
+ };
808
+ return [
809
+ html` <div>
810
+ <div class="tx_700">折扣金額</div>
811
+ ${BgWidget.mbContainer(18)}
812
+ ${BgWidget.multiCheckboxContainer(
813
+ gvc,
814
+ [
815
+ {
816
+ key: 'fixed',
817
+ name: '固定金額',
818
+ innerHtml: valueInput({ startText: '$' }),
819
+ },
820
+ {
821
+ key: 'percent',
822
+ name: '百分比',
823
+ innerHtml: valueInput({ endText: '%' }),
824
+ },
825
+ ],
826
+ [voucherData.method],
827
+ (text) => {
828
+ voucherData.value = '0';
829
+ voucherData.method = text[0] as 'fixed' | 'percent';
830
+ gvc.notifyDataChange(pageVM.conditionId);
831
+ },
832
+ { single: true }
833
+ )}
834
+ </div>`,
835
+ ];
836
+ })(),
837
+ ...(() => {
838
+ if (voucherData.trigger === 'distribution') {
839
+ return [];
840
+ }
841
+ return [
842
+ html`
843
+ <div class="tx_700">
844
+ 套用至${voucherData.reBackType === 'shipment_free' ? BgWidget.grayNote('免運費僅限套用至所有商品', 'margin-left: 8px') : ''}
845
+ </div>
846
+ ${BgWidget.mbContainer(18)}
847
+ ${EditorElem.radio({
848
+ gvc: gvc,
849
+ title: '',
850
+ def: voucherData.for ?? 'all',
851
+ array: productForList,
852
+ callback: (text) => {
853
+ voucherData.forKey = defKeys[text];
854
+ voucherData.for = text as 'collection' | 'product' | 'all';
855
+ gvc.notifyDataChange(id);
856
+ },
857
+ oneLine: true,
858
+ readonly: voucherData.reBackType === 'shipment_free',
859
+ })}
860
+ ${BgWidget.mbContainer(8)}
861
+ ${(() => {
862
+ switch (voucherData.for) {
863
+ case 'collection':
864
+ return gvc.bindView(() => {
865
+ const subVM = {
866
+ id: gvc.glitter.getUUID(),
867
+ loading: true,
868
+ dataList: [] as OptionsItem[],
869
+ };
870
+ return {
871
+ bind: subVM.id,
872
+ view: () => {
873
+ if (subVM.loading) {
874
+ return BgWidget.spinner();
875
+ }
876
+ return html`
877
+ <div class="d-flex flex-column p-2" style="gap: 18px;">
878
+ <div
879
+ class="d-flex align-items-center gray-bottom-line-18"
880
+ style="gap: 24px; justify-content: space-between;"
881
+ >
882
+ <div class="form-check-label c_updown_label">
883
+ <div class="tx_normal">分類列表</div>
884
+ </div>
885
+ ${BgWidget.grayButton(
886
+ '選擇分類',
887
+ gvc.event(() => {
888
+ BgProduct.collectionsDialog({
721
889
  gvc: gvc,
722
- callback: (value: []) => {
723
- voucherData.targetList = value;
724
- gvc.notifyDataChange(id);
890
+ default: voucherData.forKey ?? [],
891
+ callback: async (value) => {
892
+ voucherData.forKey = value;
893
+ defKeys.collection = value;
894
+ subVM.dataList = await BgProduct.getCollectiosOpts(value);
895
+ subVM.loading = true;
896
+ gvc.notifyDataChange(subVM.id);
725
897
  },
726
- default: voucherData.targetList ?? [],
727
- options: levelVM.dataList,
728
- style: 'width: 100%;',
729
898
  });
730
- }
731
- },
732
- divCreate: {
733
- style: 'width: 100%;',
734
- },
735
- onCreate: () => {
736
- if (levelVM.loading) {
737
- ApiUser.getPublicConfig('member_level_config', 'manager').then((dd: any) => {
738
- if (dd.result && dd.response.value) {
739
- levelVM.dataList = dd.response.value.levels.map(
740
- (item: {
741
- id: string;
742
- tag_name: string
743
- }) => {
744
- return {
745
- key: item.id,
746
- value: item.tag_name,
747
- // note.txt: '人數'
748
- };
749
- }
750
- );
751
- levelVM.loading = false;
752
- gvc.notifyDataChange(levelVM.id);
753
- }
754
- });
755
- }
756
- },
899
+ }),
900
+ { textStyle: 'font-weight: 400;' }
901
+ )}
902
+ </div>
903
+ ${obj.gvc.map(
904
+ subVM.dataList.map((opt: OptionsItem, index) => {
905
+ return html` <div
906
+ class="d-flex align-items-center form-check-label c_updown_label gap-3"
907
+ >
908
+ <span class="tx_normal">${index + 1} . ${opt.value}</span>
909
+ ${opt.note ? html` <span class="tx_gray_12 ms-2">${opt.note}</span> ` : ''}
910
+ </div>`;
911
+ })
912
+ )}
913
+ </div>
914
+ `;
915
+ },
916
+ onCreate: () => {
917
+ if (subVM.loading) {
918
+ if (voucherData.forKey.length === 0) {
919
+ setTimeout(() => {
920
+ subVM.dataList = [];
921
+ subVM.loading = false;
922
+ gvc.notifyDataChange(subVM.id);
923
+ }, 200);
924
+ } else {
925
+ new Promise<OptionsItem[]>((resolve) => {
926
+ resolve(BgProduct.getCollectiosOpts(voucherData.forKey));
927
+ }).then((data) => {
928
+ subVM.dataList = data;
929
+ subVM.loading = false;
930
+ gvc.notifyDataChange(subVM.id);
757
931
  });
758
- })();
759
- case 'group':
760
- return (() => {
761
- const levelVM = {
762
- id: gvc.glitter.getUUID(),
763
- loading: true,
764
- dataList: [],
765
- };
766
- return gvc.bindView({
767
- bind: levelVM.id,
768
- view: () => {
769
- if (levelVM.loading) {
770
- return BgWidget.spinner({text: {visible: false}});
771
- } else {
772
- return BgWidget.selectDropList({
932
+ }
933
+ }
934
+ },
935
+ };
936
+ });
937
+ case 'product':
938
+ return gvc.bindView(() => {
939
+ const subVM = {
940
+ id: gvc.glitter.getUUID(),
941
+ loading: true,
942
+ dataList: [] as OptionsItem[],
943
+ };
944
+ return {
945
+ bind: subVM.id,
946
+ view: () => {
947
+ if (subVM.loading) {
948
+ return BgWidget.spinner();
949
+ }
950
+ return html`
951
+ <div class="d-flex flex-column p-2" style="gap: 18px;">
952
+ <div
953
+ class="d-flex align-items-center gray-bottom-line-18"
954
+ style="gap: 24px; justify-content: space-between;"
955
+ >
956
+ <div class="form-check-label c_updown_label">
957
+ <div class="tx_normal">商品列表</div>
958
+ </div>
959
+ ${BgWidget.grayButton(
960
+ '選擇商品',
961
+ gvc.event(() => {
962
+ BgProduct.productsDialog({
773
963
  gvc: gvc,
774
- callback: (value: []) => {
775
- voucherData.targetList = value;
776
- gvc.notifyDataChange(id);
964
+ default: voucherData.forKey ?? [],
965
+ callback: async (value) => {
966
+ voucherData.forKey = value;
967
+ defKeys.product = value;
968
+ subVM.dataList = await BgProduct.getProductOpts(voucherData.forKey);
969
+ subVM.loading = true;
970
+ gvc.notifyDataChange(subVM.id);
777
971
  },
778
- default: voucherData.targetList ?? [],
779
- options: levelVM.dataList,
780
- style: 'width: 100%;',
781
- });
782
- }
783
- },
784
- divCreate: {
785
- style: 'width: 100%;',
786
- },
787
- onCreate: () => {
788
- if (levelVM.loading) {
789
- ApiUser.getUserGroupList().then((dd: any) => {
790
- if (dd.result && dd.response.data) {
791
- levelVM.dataList = dd.response.data
792
- .filter((item: any) => {
793
- return item.type !== 'level';
794
- })
795
- .map((item: any) => {
796
- return {
797
- key: item.type,
798
- value: item.title,
799
- };
800
- });
801
- levelVM.loading = false;
802
- gvc.notifyDataChange(levelVM.id);
803
- }
804
972
  });
805
- }
806
- },
973
+ }),
974
+ { textStyle: 'font-weight: 400;' }
975
+ )}
976
+ </div>
977
+ ${subVM.dataList
978
+ .map((opt: OptionsItem, index) => {
979
+ return html` <div
980
+ class="d-flex align-items-center form-check-label c_updown_label gap-3"
981
+ >
982
+ <span class="tx_normal">${index + 1} .</span>
983
+ ${BgWidget.validImageBox({
984
+ gvc: gvc,
985
+ image: opt.image,
986
+ width: 40,
987
+ })}
988
+ <div class="tx_normal ${opt.note ? 'mb-1' : ''}">${opt.value}</div>
989
+ ${opt.note ? html` <div class="tx_gray_12">${opt.note}</div> ` : ''}
990
+ </div>`;
991
+ })
992
+ .join(``)}
993
+ </div>
994
+ `;
995
+ },
996
+ onCreate: () => {
997
+ if (subVM.loading) {
998
+ if (voucherData.forKey.length === 0) {
999
+ setTimeout(() => {
1000
+ subVM.dataList = [];
1001
+ subVM.loading = false;
1002
+ gvc.notifyDataChange(subVM.id);
1003
+ }, 200);
1004
+ } else {
1005
+ new Promise<OptionsItem[]>((resolve) => {
1006
+ resolve(BgProduct.getProductOpts(voucherData.forKey));
1007
+ }).then((data) => {
1008
+ subVM.dataList = data;
1009
+ subVM.loading = false;
1010
+ gvc.notifyDataChange(subVM.id);
807
1011
  });
808
- })();
809
- default:
810
- return '';
811
- }
812
- })()}
813
- </div>
814
- </div>
815
- `;
816
- },
817
- };
818
- })}`,
819
- html`
820
- <div class="tx_700">可使用訂單來源</div>
821
- ${BgWidget.mbContainer(18)}
822
- ${BgWidget.multiCheckboxContainer(
823
- gvc,
824
- [
825
- {key: 'normal', name: 'APP & 官網'},
826
- {key: 'pos', name: 'POS'},
827
- ],
828
- voucherData.device ?? ['normal'],
829
- (text) => {
830
- voucherData.device = text as ('normal' | 'pos')[];
831
- gvc.notifyDataChange(viewID);
832
- },
833
- {single: false}
834
- )}`,
835
- ]
836
- .map((str) => {
837
- return html`
838
- <div>${str}</div>`;
839
- })
840
- .join(BgWidget.horizontalLine())
841
- ),
842
- BgWidget.mainCard(
843
- gvc.bindView(() => {
844
- const id = glitter.getUUID();
845
- voucherData.forKey = voucherData.forKey ?? [];
846
- let defKeys: any = {
847
- collection: JSON.parse(JSON.stringify(voucherData.forKey)),
848
- product: JSON.parse(JSON.stringify(voucherData.forKey)),
849
- };
850
- return {
851
- bind: id,
852
- dataList: [
853
- {obj: voucherData, key: 'method'},
854
- {obj: voucherData, key: 'reBackType'},
855
- ],
856
- view: () => {
857
- return [
858
- ...(() => {
859
- if (['shipment_free', 'add_on_items','giveaway'].includes(voucherData.reBackType)) {
860
- return [];
861
- }
862
- const valueInput = (obj: {
863
- startText?: string;
864
- endText?: string
865
- }) => {
866
- return BgWidget.editeInput({
867
- gvc: gvc,
868
- type: 'number',
869
- divStyle: 'width:150px;',
870
- title: '',
871
- default: voucherData.value,
872
- placeHolder: '',
873
- callback: (text) => {
874
- const texInt = parseInt(text, 10);
875
- if (voucherData.method === 'percent' && (texInt > 100 || texInt < 0)) {
876
- const dialog = new ShareDialog(gvc.glitter);
877
- dialog.infoMessage({text: '數值需介於0~100'});
878
- gvc.notifyDataChange(id);
879
- } else {
880
- voucherData.value = text;
881
- }
882
- },
883
- startText: obj.startText,
884
- endText: obj.endText,
885
- });
886
- };
887
- return [
888
- html`
889
- <div>
890
- <div class="tx_700">折扣金額
891
- </div>
892
- ${BgWidget.mbContainer(18)}
893
- ${BgWidget.multiCheckboxContainer(
894
- gvc,
895
- [
896
- {
897
- key: 'fixed',
898
- name: '固定金額',
899
- innerHtml: valueInput({startText: '$'}),
900
- },
901
- {
902
- key: 'percent',
903
- name: '百分比',
904
- innerHtml: valueInput({endText: '%'}),
905
- },
906
- ],
907
- [voucherData.method],
908
- (text) => {
909
- voucherData.value = '0';
910
- voucherData.method = text[0] as 'fixed' | 'percent';
911
- gvc.notifyDataChange(pageVM.conditionId);
912
- },
913
- {single: true}
914
- )}
915
- </div>`,
916
- ];
917
- })(),
918
- ...(() => {
919
- if (voucherData.trigger === 'distribution') {
920
- return [];
1012
+ }
1013
+ }
1014
+ },
1015
+ };
1016
+ });
1017
+ case 'all':
1018
+ default:
1019
+ return '';
921
1020
  }
922
- return [
923
- html`
924
- <div class="tx_700">
925
- 套用至${voucherData.reBackType === 'shipment_free' ? BgWidget.grayNote('免運費僅限套用至所有商品', 'margin-left: 8px') : ''}
926
- </div>
927
- ${BgWidget.mbContainer(18)}
928
- ${EditorElem.radio({
929
- gvc: gvc,
930
- title: '',
931
- def: voucherData.for ?? 'all',
932
- array: productForList,
933
- callback: (text) => {
934
- voucherData.forKey = defKeys[text];
935
- voucherData.for = text as 'collection' | 'product' | 'all';
936
- gvc.notifyDataChange(id);
937
- },
938
- oneLine: true,
939
- readonly: voucherData.reBackType === 'shipment_free',
940
- })}
941
- ${BgWidget.mbContainer(8)}
942
- ${(() => {
943
- switch (voucherData.for) {
944
- case 'collection':
945
- return gvc.bindView(() => {
946
- const subVM = {
947
- id: gvc.glitter.getUUID(),
948
- loading: true,
949
- dataList: [] as OptionsItem[],
950
- };
951
- return {
952
- bind: subVM.id,
953
- view: () => {
954
- if (subVM.loading) {
955
- return BgWidget.spinner();
956
- }
957
- return html`
958
- <div class="d-flex flex-column p-2"
959
- style="gap: 18px;">
960
- <div
961
- class="d-flex align-items-center gray-bottom-line-18"
962
- style="gap: 24px; justify-content: space-between;"
963
- >
964
- <div class="form-check-label c_updown_label">
965
- <div class="tx_normal">
966
- 分類列表
967
- </div>
968
- </div>
969
- ${BgWidget.grayButton(
970
- '選擇分類',
971
- gvc.event(() => {
972
- BgProduct.collectionsDialog({
973
- gvc: gvc,
974
- default: voucherData.forKey ?? [],
975
- callback: async (value) => {
976
- voucherData.forKey = value;
977
- defKeys.collection = value;
978
- subVM.dataList = await BgProduct.getCollectiosOpts(value);
979
- subVM.loading = true;
980
- gvc.notifyDataChange(subVM.id);
981
- },
982
- });
983
- }),
984
- {textStyle: 'font-weight: 400;'}
985
- )}
986
- </div>
987
- ${obj.gvc.map(
988
- subVM.dataList.map((opt: OptionsItem, index) => {
989
- return html`
990
- <div
991
- class="d-flex align-items-center form-check-label c_updown_label gap-3"
992
- >
993
- <span class="tx_normal">${index + 1}
994
- . ${opt.value}</span>
995
- ${opt.note ? html`
996
- <span class="tx_gray_12 ms-2">${opt.note}</span> ` : ''}
997
- </div>`;
998
- })
999
- )}
1000
- </div>
1001
- `;
1002
- },
1003
- onCreate: () => {
1004
- if (subVM.loading) {
1005
- if (voucherData.forKey.length === 0) {
1006
- setTimeout(() => {
1007
- subVM.dataList = [];
1008
- subVM.loading = false;
1009
- gvc.notifyDataChange(subVM.id);
1010
- }, 200);
1011
- } else {
1012
- new Promise<OptionsItem[]>((resolve) => {
1013
- resolve(BgProduct.getCollectiosOpts(voucherData.forKey));
1014
- }).then((data) => {
1015
- subVM.dataList = data;
1016
- subVM.loading = false;
1017
- gvc.notifyDataChange(subVM.id);
1018
- });
1019
- }
1020
- }
1021
- },
1022
- };
1023
- });
1024
- case 'product':
1025
- return gvc.bindView(() => {
1026
- const subVM = {
1027
- id: gvc.glitter.getUUID(),
1028
- loading: true,
1029
- dataList: [] as OptionsItem[],
1030
- };
1031
- return {
1032
- bind: subVM.id,
1033
- view: () => {
1034
- if (subVM.loading) {
1035
- return BgWidget.spinner();
1036
- }
1037
- return html`
1038
- <div class="d-flex flex-column p-2"
1039
- style="gap: 18px;">
1040
- <div
1041
- class="d-flex align-items-center gray-bottom-line-18"
1042
- style="gap: 24px; justify-content: space-between;"
1043
- >
1044
- <div class="form-check-label c_updown_label">
1045
- <div class="tx_normal">
1046
- 商品列表
1047
- </div>
1048
- </div>
1049
- ${BgWidget.grayButton(
1050
- '選擇商品',
1051
- gvc.event(() => {
1052
- BgProduct.productsDialog({
1053
- gvc: gvc,
1054
- default: voucherData.forKey ?? [],
1055
- callback: async (value) => {
1056
- voucherData.forKey = value;
1057
- defKeys.product = value;
1058
- subVM.dataList = await BgProduct.getProductOpts(voucherData.forKey);
1059
- subVM.loading = true;
1060
- gvc.notifyDataChange(subVM.id);
1061
- },
1062
- });
1063
- }),
1064
- {textStyle: 'font-weight: 400;'}
1065
- )}
1066
- </div>
1067
- ${subVM.dataList.map((opt: OptionsItem, index) => {
1068
- return html`
1069
- <div
1070
- class="d-flex align-items-center form-check-label c_updown_label gap-3"
1071
- >
1072
- <span class="tx_normal">${index + 1}
1073
- .</span>
1074
- ${BgWidget.validImageBox({
1075
- gvc: gvc,
1076
- image: opt.image,
1077
- width: 40
1078
- })}
1079
- <div class="tx_normal ${opt.note ? 'mb-1' : ''}">
1080
- ${opt.value}
1081
- </div>
1082
- ${opt.note ? html`
1083
- <div class="tx_gray_12">
1084
- ${opt.note}
1085
- </div> ` : ''}
1086
- </div>`;
1087
- }).join(``)}
1088
- </div>
1089
- `;
1090
- },
1091
- onCreate: () => {
1092
- if (subVM.loading) {
1093
- if (voucherData.forKey.length === 0) {
1094
- setTimeout(() => {
1095
- subVM.dataList = [];
1096
- subVM.loading = false;
1097
- gvc.notifyDataChange(subVM.id);
1098
- }, 200);
1099
- } else {
1100
- new Promise<OptionsItem[]>((resolve) => {
1101
- resolve(BgProduct.getProductOpts(voucherData.forKey));
1102
- }).then((data) => {
1103
- subVM.dataList = data;
1104
- subVM.loading = false;
1105
- gvc.notifyDataChange(subVM.id);
1106
- });
1107
- }
1108
- }
1109
- },
1110
- };
1111
- });
1112
- case 'all':
1113
- default:
1114
- return '';
1115
- }
1116
- })()}
1117
- `,
1118
- ];
1119
- })(),
1120
- ].join(BgWidget.horizontalLine());
1121
- },
1122
- divCreate: {},
1123
- };
1124
- })
1125
- ),
1126
- ...(() => {
1127
-
1128
- if ( ['giveaway','add_on_items'].includes(voucherData.reBackType)) {
1129
- return [BgWidget.mainCard(gvc.bindView(() => {
1021
+ })()}
1022
+ `,
1023
+ ];
1024
+ })(),
1025
+ ].join(BgWidget.horizontalLine());
1026
+ },
1027
+ divCreate: {},
1028
+ };
1029
+ })
1030
+ ),
1031
+ ...(() => {
1032
+ if (['giveaway', 'add_on_items'].includes(voucherData.reBackType)) {
1033
+ return [
1034
+ BgWidget.mainCard(
1035
+ gvc.bindView(() => {
1130
1036
  const vm = {
1131
- id: gvc.glitter.getUUID()
1132
- }
1133
- if(!Array.isArray(voucherData.add_on_products)){
1134
- voucherData.add_on_products=[]
1037
+ id: gvc.glitter.getUUID(),
1038
+ };
1039
+ if (!Array.isArray(voucherData.add_on_products)) {
1040
+ voucherData.add_on_products = [];
1135
1041
  }
1136
1042
  return {
1137
1043
  bind: vm.id,
1138
1044
  view: () => {
1139
1045
  return html`
1140
- <div class="tx_700">${(voucherData.reBackType==='add_on_items') ? `加購品項`:`贈品品項`}</div>
1046
+ <div class="tx_700">${voucherData.reBackType === 'add_on_items' ? `加購品項` : `贈品品項`}</div>
1141
1047
  ${BgWidget.mbContainer(18)}
1142
1048
  ${obj.gvc.bindView(() => {
1143
1049
  const id = gvc.glitter.getUUID();
1144
1050
  return {
1145
1051
  bind: id,
1146
1052
  view: () => {
1147
-
1148
1053
  try {
1149
1054
  return html`
1150
1055
  <div
1151
- class="d-flex align-items-center gray-bottom-line-18"
1152
- style="gap: 24px; justify-content: space-between;"
1056
+ class="d-flex align-items-center gray-bottom-line-18"
1057
+ style="gap: 24px; justify-content: space-between;"
1153
1058
  >
1154
1059
  <div class="form-check-label c_updown_label">
1155
- <div class="tx_normal">
1156
- 商品列表
1157
- </div>
1060
+ <div class="tx_normal">商品列表</div>
1158
1061
  </div>
1159
1062
  ${BgWidget.grayButton(
1160
- '選擇商品',
1161
- gvc.event(() => {
1162
- BgProduct.productsDialog({
1163
- gvc: gvc,
1164
- default: voucherData.add_on_products ?? [],
1165
- callback: async (value) => {
1166
- voucherData.add_on_products = value;
1167
- gvc.notifyDataChange(id)
1168
- },
1169
- filter: (dd) => {
1170
- return true
1171
-
1172
- },
1173
- productType:(voucherData.reBackType==='add_on_items') ? 'addProduct':'giveaway'
1174
- });
1175
- }),
1176
- {textStyle: 'font-weight: 400;'}
1063
+ '選擇商品',
1064
+ gvc.event(() => {
1065
+ BgProduct.productsDialog({
1066
+ gvc: gvc,
1067
+ default: voucherData.add_on_products ?? [],
1068
+ callback: async (value) => {
1069
+ voucherData.add_on_products = value;
1070
+ gvc.notifyDataChange(id);
1071
+ },
1072
+ filter: (dd) => {
1073
+ return true;
1074
+ },
1075
+ productType: voucherData.reBackType === 'add_on_items' ? 'addProduct' : 'giveaway',
1076
+ });
1077
+ }),
1078
+ { textStyle: 'font-weight: 400;' }
1177
1079
  )}
1178
1080
  </div>
1179
1081
  ${gvc.bindView(() => {
1180
1082
  const vm: {
1181
- id: string,
1182
- loading: boolean,
1183
- data: OptionsItem[]
1083
+ id: string;
1084
+ loading: boolean;
1085
+ data: OptionsItem[];
1184
1086
  } = {
1185
1087
  id: gvc.glitter.getUUID(),
1186
1088
  loading: true,
1187
- data: []
1188
- }
1089
+ data: [],
1090
+ };
1189
1091
  BgProduct.getProductOpts(voucherData.add_on_products!).then((res) => {
1190
- vm.data = res
1191
- vm.loading = false
1192
- gvc.notifyDataChange(vm.id)
1193
- })
1092
+ vm.data = res;
1093
+ vm.loading = false;
1094
+ gvc.notifyDataChange(vm.id);
1095
+ });
1194
1096
  return {
1195
1097
  bind: vm.id,
1196
1098
  view: async () => {
1197
1099
  if (vm.loading) {
1198
- return BgWidget.spinner()
1100
+ return BgWidget.spinner();
1199
1101
  }
1200
- return vm.data.map((opt: OptionsItem, index) => {
1201
- return html`
1202
- <div
1203
- class="d-flex align-items-center form-check-label c_updown_label gap-3"
1102
+ return vm.data
1103
+ .map((opt: OptionsItem, index) => {
1104
+ return html` <div
1105
+ class="d-flex align-items-center form-check-label c_updown_label gap-3"
1204
1106
  >
1205
- <span class="tx_normal">${index + 1}
1206
- .</span>
1107
+ <span class="tx_normal">${index + 1} .</span>
1207
1108
  ${BgWidget.validImageBox({
1208
1109
  gvc: gvc,
1209
1110
  image: opt.image,
1210
- width: 40
1111
+ width: 40,
1211
1112
  })}
1212
- <div class="tx_normal ${opt.note ? 'mb-1' : ''}">
1213
- ${opt.value}
1214
- </div>
1215
- ${opt.note ? html`
1216
- <div class="tx_gray_12">
1217
- ${opt.note}
1218
- </div> ` : ''}
1113
+ <div class="tx_normal ${opt.note ? 'mb-1' : ''}">${opt.value}</div>
1114
+ ${opt.note ? html` <div class="tx_gray_12">${opt.note}</div> ` : ''}
1219
1115
  </div>`;
1220
- }).join('')
1221
- }, divCreate: {
1116
+ })
1117
+ .join('');
1118
+ },
1119
+ divCreate: {
1222
1120
  class: `d-flex py-2 flex-column`,
1223
- style: `gap:10px;`
1224
- }
1225
- }
1121
+ style: `gap:10px;`,
1122
+ },
1123
+ };
1226
1124
  })}
1227
1125
  `;
1228
1126
  } catch (e) {
@@ -1231,494 +1129,479 @@ export class ShoppingDiscountSetting {
1231
1129
  }
1232
1130
  },
1233
1131
  divCreate: {
1234
- class: `w-100`
1235
- }
1132
+ class: `w-100`,
1133
+ },
1236
1134
  };
1237
1135
  })}
1238
- `
1239
- }
1240
- }
1241
- }))]
1242
- } else {
1243
- return []
1244
- }
1245
- })(),
1246
- BgWidget.mainCard(
1247
- gvc.bindView(() => {
1248
- return {
1249
- bind: pageVM.conditionId,
1250
- view: () => {
1251
- const conditionInput = (text: string) => {
1252
- return BgWidget.editeInput({
1253
- gvc: gvc,
1254
- title: '',
1255
- divStyle: 'width:150px;',
1256
- default: `${voucherData.ruleValue ?? 0}`,
1257
- placeHolder: '',
1258
- callback: (value) => {
1259
- voucherData.ruleValue = parseInt(value, 10);
1260
- gvc.notifyDataChange(pageVM.conditionId);
1261
- },
1262
- endText: text,
1263
- });
1264
- };
1265
- const n = voucherData.ruleValue;
1266
- const floor = Math.floor(n / 2);
1267
- const ruleText = (sum: number) => {
1268
- return `${sum}${voucherData.rule === 'min_count' ? '個' : '元'}`;
1269
- };
1270
- voucherData.counting = voucherData.method === 'percent' || voucherData.reBackType === 'shipment_free' ? 'single' : voucherData.counting;
1271
- voucherData.conditionType = voucherData.reBackType === 'shipment_free' ? 'order' : voucherData.conditionType;
1272
- return [
1273
- html`
1274
- <div class="tx_700">消費條件</div>
1275
- ${BgWidget.mbContainer(18)}
1276
- ${BgWidget.multiCheckboxContainer(
1277
- gvc,
1278
- [
1279
- {
1280
- key: 'min_price',
1281
- name: '最低消費金額',
1282
- innerHtml: conditionInput('元'),
1283
- },
1284
- {
1285
- key: 'min_count',
1286
- name: '最少購買數量',
1287
- innerHtml: conditionInput('個'),
1288
- },
1289
- ],
1290
- [voucherData.rule],
1291
- (text) => {
1292
- voucherData.ruleValue = 0;
1293
- voucherData.rule = text[0] as 'min_price' | 'min_count';
1294
- gvc.notifyDataChange(pageVM.conditionId);
1295
- },
1296
- {single: true}
1297
- )}`,
1298
- html`
1299
- <div class="tx_700">計算單位</div>
1300
- ${BgWidget.mbContainer(18)}
1301
- ${BgWidget.multiCheckboxContainer(
1302
- gvc,
1303
- [
1304
- {
1305
- key: 'order',
1306
- name: '以整份訂單計算',
1307
- innerHtml: BgWidget.grayNote(
1308
- (() => {
1309
- if (voucherData.reBackType === 'shipment_free') {
1310
- return '優惠條件為整份訂單免運費';
1311
- }
1312
- return `若商品A購買${ruleText(floor)},加上商品B購買${ruleText(n - floor)},可觸發優惠`;
1313
- })()
1314
- ),
1315
- },
1316
- {
1317
- key: 'item',
1318
- name: '以商品計算',
1319
- innerHtml: BgWidget.grayNote(
1320
- `需要商品A購買滿${ruleText(n)},或商品B購買滿${ruleText(n)},即可觸發優惠<br/>若商品A購買${ruleText(
1321
- floor
1322
- )},加上商品B購買${ruleText(n - floor)},無法觸發優惠`
1323
- ),
1324
- },
1325
- ],
1326
- [voucherData.conditionType],
1327
- (text) => {
1328
- voucherData.conditionType = text[0] as 'item' | 'order';
1329
- gvc.notifyDataChange(pageVM.conditionId);
1330
- },
1331
- {
1332
- single: true,
1333
- readonly: voucherData.reBackType === 'shipment_free'
1334
- }
1335
- )}`,
1336
- html`
1337
- <div class="tx_700">重複觸發</div>
1338
- ${BgWidget.mbContainer(18)}
1339
- ${BgWidget.multiCheckboxContainer(
1340
- gvc,
1341
- [
1342
- {
1343
- key: 'single',
1344
- name: '不重複',
1345
- innerHtml: BgWidget.grayNote(
1346
- (() => {
1347
- if (voucherData.reBackType === 'shipment_free') {
1348
- return '整份訂單免運費,優惠不重複';
1349
- }
1350
- if (voucherData.method === 'percent') {
1351
- return '依百分比計算,優惠不重複';
1352
- }
1353
- return `購買${ruleText(n)}折Y元,額外購買至${ruleText(n * 2)}或${ruleText(n * 3)}依然是折Y元`;
1354
- })()
1355
- ),
1356
- },
1357
- {
1358
- key: 'each',
1359
- name: '重複',
1360
- innerHtml: BgWidget.grayNote(
1361
- `購買${ruleText(n)}折Y元,購買${ruleText(n * 2)}則折Y * 2元,購買${ruleText(n * 3)}則折Y * 3元,以此類推`
1362
- ),
1363
- },
1364
- ],
1365
- [voucherData.counting],
1366
- (text) => {
1367
- voucherData.counting = text[0] as 'single' | 'each';
1368
- gvc.notifyDataChange(pageVM.conditionId);
1369
- },
1370
- {
1371
- single: true,
1372
- readonly: voucherData.method === 'percent' || voucherData.reBackType === 'shipment_free'
1373
- }
1374
- )}`,
1375
- ].join(BgWidget.horizontalLine());
1136
+ `;
1376
1137
  },
1377
1138
  };
1378
1139
  })
1379
- ),
1380
- BgWidget.mainCard(
1381
- gvc.bindView(() => {
1382
- const id = glitter.getUUID();
1383
- return {
1384
- bind: id,
1385
- view: () => {
1386
- return html`
1387
- <div class="tx_700">是否與其他優惠券疊加使用
1388
- </div>
1389
- ${BgWidget.mbContainer(18)}
1390
- ${BgWidget.multiCheckboxContainer(
1391
- gvc,
1392
- [
1393
- {
1394
- key: 'false',
1395
- name: '不可疊加',
1396
- },
1397
- {
1398
- key: 'true',
1399
- name: '可以疊加',
1400
- innerHtml: BgWidget.grayNote('系統將以最大優惠排序進行判定'),
1401
- },
1402
- ],
1403
- [voucherData.overlay ? 'true' : 'false'],
1404
- (text) => {
1405
- voucherData.overlay = text[0] === 'true';
1406
- gvc.notifyDataChange(id);
1407
- },
1408
- {single: true}
1409
- )}`;
1140
+ ),
1141
+ ];
1142
+ } else {
1143
+ return [];
1144
+ }
1145
+ })(),
1146
+ BgWidget.mainCard(
1147
+ gvc.bindView(() => {
1148
+ return {
1149
+ bind: pageVM.conditionId,
1150
+ view: () => {
1151
+ const conditionInput = (text: string) => {
1152
+ return BgWidget.editeInput({
1153
+ gvc: gvc,
1154
+ title: '',
1155
+ divStyle: 'width:150px;',
1156
+ default: `${voucherData.ruleValue ?? 0}`,
1157
+ placeHolder: '',
1158
+ callback: (value) => {
1159
+ voucherData.ruleValue = parseInt(value, 10);
1160
+ gvc.notifyDataChange(pageVM.conditionId);
1410
1161
  },
1411
- };
1412
- })
1413
- ),
1414
- BgWidget.mainCard(
1415
- gvc.bindView(() => {
1416
- const id = glitter.getUUID();
1417
- return {
1418
- bind: id,
1419
- view: () => {
1420
- const inputStyle = 'display: block; width:200px;';
1421
- return [
1422
- html`
1423
- <div class="tx_700">全館總使用次數</div>
1424
- ${BgWidget.mbContainer(18)}
1425
- ${BgWidget.multiCheckboxContainer(
1426
- gvc,
1427
- [
1428
- {
1429
- key: 'noLimited',
1430
- name: '無限制',
1431
- },
1432
- {
1433
- key: 'hasLimited',
1434
- name: '限制次數',
1435
- innerHtml: html`
1436
- <div class="d-flex align-items-center">
1437
- <span class="tx_normal me-2">可使用次數</span>
1438
- ${BgWidget.editeInput({
1439
- gvc: gvc,
1440
- title: '',
1441
- type: 'number',
1442
- divStyle: 'width: 150px;',
1443
- default: `${voucherData.macroLimited ?? 0}`,
1444
- placeHolder: '',
1445
- callback: (text) => {
1446
- voucherData.macroLimited = parseInt(text, 10);
1447
- },
1448
- endText: '次',
1449
- })}
1450
- </div>`,
1451
- },
1452
- ],
1453
- [voucherData.macroLimited === 0 ? 'noLimited' : 'hasLimited'],
1454
- (text) => {
1455
- if (text[0] === 'noLimited') {
1456
- voucherData.macroLimited = 0;
1457
- }
1162
+ endText: text,
1163
+ });
1164
+ };
1165
+ const n = voucherData.ruleValue;
1166
+ const floor = Math.floor(n / 2);
1167
+ const ruleText = (sum: number) => {
1168
+ return `${sum}${voucherData.rule === 'min_count' ? '個' : '元'}`;
1169
+ };
1170
+ voucherData.counting = voucherData.method === 'percent' || voucherData.reBackType === 'shipment_free' ? 'single' : voucherData.counting;
1171
+ voucherData.conditionType = voucherData.reBackType === 'shipment_free' ? 'order' : voucherData.conditionType;
1172
+ return [
1173
+ html` <div class="tx_700">消費條件</div>
1174
+ ${BgWidget.mbContainer(18)}
1175
+ ${BgWidget.multiCheckboxContainer(
1176
+ gvc,
1177
+ [
1178
+ {
1179
+ key: 'min_price',
1180
+ name: '最低消費金額',
1181
+ innerHtml: conditionInput(''),
1182
+ },
1183
+ {
1184
+ key: 'min_count',
1185
+ name: '最少購買數量',
1186
+ innerHtml: conditionInput('個'),
1187
+ },
1188
+ ],
1189
+ [voucherData.rule],
1190
+ (text) => {
1191
+ voucherData.ruleValue = 0;
1192
+ voucherData.rule = text[0] as 'min_price' | 'min_count';
1193
+ gvc.notifyDataChange(pageVM.conditionId);
1194
+ },
1195
+ { single: true }
1196
+ )}`,
1197
+ html` <div class="tx_700">計算單位</div>
1198
+ ${BgWidget.mbContainer(18)}
1199
+ ${BgWidget.multiCheckboxContainer(
1200
+ gvc,
1201
+ [
1202
+ {
1203
+ key: 'order',
1204
+ name: '以整份訂單計算',
1205
+ innerHtml: BgWidget.grayNote(
1206
+ (() => {
1207
+ if (voucherData.reBackType === 'shipment_free') {
1208
+ return '優惠條件為整份訂單免運費';
1209
+ }
1210
+ return `若商品A購買${ruleText(floor)},加上商品B購買${ruleText(n - floor)},可觸發優惠`;
1211
+ })()
1212
+ ),
1213
+ },
1214
+ {
1215
+ key: 'item',
1216
+ name: '以商品計算',
1217
+ innerHtml: BgWidget.grayNote(
1218
+ `需要商品A購買滿${ruleText(n)},或商品B購買滿${ruleText(n)},即可觸發優惠<br/>若商品A購買${ruleText(
1219
+ floor
1220
+ )},加上商品B購買${ruleText(n - floor)},無法觸發優惠`
1221
+ ),
1222
+ },
1223
+ ],
1224
+ [voucherData.conditionType],
1225
+ (text) => {
1226
+ voucherData.conditionType = text[0] as 'item' | 'order';
1227
+ gvc.notifyDataChange(pageVM.conditionId);
1228
+ },
1229
+ {
1230
+ single: true,
1231
+ readonly: voucherData.reBackType === 'shipment_free',
1232
+ }
1233
+ )}`,
1234
+ html` <div class="tx_700">重複觸發</div>
1235
+ ${BgWidget.mbContainer(18)}
1236
+ ${BgWidget.multiCheckboxContainer(
1237
+ gvc,
1238
+ [
1239
+ {
1240
+ key: 'single',
1241
+ name: '不重複',
1242
+ innerHtml: BgWidget.grayNote(
1243
+ (() => {
1244
+ if (voucherData.reBackType === 'shipment_free') {
1245
+ return '整份訂單免運費,優惠不重複';
1246
+ }
1247
+ if (voucherData.method === 'percent') {
1248
+ return '依百分比計算,優惠不重複';
1249
+ }
1250
+ return `購買${ruleText(n)}折Y元,額外購買至${ruleText(n * 2)}或${ruleText(n * 3)}依然是折Y元`;
1251
+ })()
1252
+ ),
1253
+ },
1254
+ {
1255
+ key: 'each',
1256
+ name: '重複',
1257
+ innerHtml: BgWidget.grayNote(
1258
+ `購買${ruleText(n)}折Y元,購買${ruleText(n * 2)}則折Y * 2元,購買${ruleText(n * 3)}則折Y * 3元,以此類推`
1259
+ ),
1260
+ },
1261
+ ],
1262
+ [voucherData.counting],
1263
+ (text) => {
1264
+ voucherData.counting = text[0] as 'single' | 'each';
1265
+ gvc.notifyDataChange(pageVM.conditionId);
1266
+ },
1267
+ {
1268
+ single: true,
1269
+ readonly: voucherData.method === 'percent' || voucherData.reBackType === 'shipment_free',
1270
+ }
1271
+ )}`,
1272
+ ].join(BgWidget.horizontalLine());
1273
+ },
1274
+ };
1275
+ })
1276
+ ),
1277
+ BgWidget.mainCard(
1278
+ gvc.bindView(() => {
1279
+ const id = glitter.getUUID();
1280
+ return {
1281
+ bind: id,
1282
+ view: () => {
1283
+ return html` <div class="tx_700">是否與其他優惠券疊加使用</div>
1284
+ ${BgWidget.mbContainer(18)}
1285
+ ${BgWidget.multiCheckboxContainer(
1286
+ gvc,
1287
+ [
1288
+ {
1289
+ key: 'false',
1290
+ name: '不可疊加',
1291
+ },
1292
+ {
1293
+ key: 'true',
1294
+ name: '可以疊加',
1295
+ innerHtml: BgWidget.grayNote('系統將以最大優惠排序進行判定'),
1296
+ },
1297
+ ],
1298
+ [voucherData.overlay ? 'true' : 'false'],
1299
+ (text) => {
1300
+ voucherData.overlay = text[0] === 'true';
1301
+ gvc.notifyDataChange(id);
1302
+ },
1303
+ { single: true }
1304
+ )}`;
1305
+ },
1306
+ };
1307
+ })
1308
+ ),
1309
+ BgWidget.mainCard(
1310
+ gvc.bindView(() => {
1311
+ const id = glitter.getUUID();
1312
+ return {
1313
+ bind: id,
1314
+ view: () => {
1315
+ const inputStyle = 'display: block; width:200px;';
1316
+ return [
1317
+ html` <div class="tx_700">全館總使用次數</div>
1318
+ ${BgWidget.mbContainer(18)}
1319
+ ${BgWidget.multiCheckboxContainer(
1320
+ gvc,
1321
+ [
1322
+ {
1323
+ key: 'noLimited',
1324
+ name: '無限制',
1325
+ },
1326
+ {
1327
+ key: 'hasLimited',
1328
+ name: '限制次數',
1329
+ innerHtml: html` <div class="d-flex align-items-center">
1330
+ <span class="tx_normal me-2">可使用次數</span>
1331
+ ${BgWidget.editeInput({
1332
+ gvc: gvc,
1333
+ title: '',
1334
+ type: 'number',
1335
+ divStyle: 'width: 150px;',
1336
+ default: `${voucherData.macroLimited ?? 0}`,
1337
+ placeHolder: '',
1338
+ callback: (text) => {
1339
+ voucherData.macroLimited = parseInt(text, 10);
1458
1340
  },
1459
- {single: true}
1460
- )}`,
1461
- html`
1462
- <div class="tx_700">個人總使用次數</div>
1463
- ${BgWidget.mbContainer(18)}
1464
- ${BgWidget.multiCheckboxContainer(
1465
- gvc,
1466
- [
1467
- {
1468
- key: 'noLimited',
1469
- name: '無限制',
1470
- },
1471
- {
1472
- key: 'hasLimited',
1473
- name: '限制次數',
1474
- innerHtml: html`
1475
- <div class="d-flex align-items-center">
1476
- <span class="tx_normal me-2">可使用次數</span>
1477
- ${BgWidget.editeInput({
1478
- gvc: gvc,
1479
- title: '',
1480
- type: 'number',
1481
- divStyle: 'width: 150px;',
1482
- default: `${voucherData.microLimited ?? 0}`,
1483
- placeHolder: '',
1484
- callback: (text) => {
1485
- voucherData.microLimited = parseInt(text, 10);
1486
- },
1487
- endText: '次',
1488
- })}
1489
- </div>`,
1490
- },
1491
- ],
1492
- [voucherData.microLimited === 0 ? 'noLimited' : 'hasLimited'],
1493
- (text) => {
1494
- if (text[0] === 'noLimited') {
1495
- voucherData.microLimited = 0;
1496
- }
1341
+ endText: '次',
1342
+ })}
1343
+ </div>`,
1344
+ },
1345
+ ],
1346
+ [voucherData.macroLimited === 0 ? 'noLimited' : 'hasLimited'],
1347
+ (text) => {
1348
+ if (text[0] === 'noLimited') {
1349
+ voucherData.macroLimited = 0;
1350
+ }
1351
+ },
1352
+ { single: true }
1353
+ )}`,
1354
+ html` <div class="tx_700">個人總使用次數</div>
1355
+ ${BgWidget.mbContainer(18)}
1356
+ ${BgWidget.multiCheckboxContainer(
1357
+ gvc,
1358
+ [
1359
+ {
1360
+ key: 'noLimited',
1361
+ name: '無限制',
1362
+ },
1363
+ {
1364
+ key: 'hasLimited',
1365
+ name: '限制次數',
1366
+ innerHtml: html` <div class="d-flex align-items-center">
1367
+ <span class="tx_normal me-2">可使用次數</span>
1368
+ ${BgWidget.editeInput({
1369
+ gvc: gvc,
1370
+ title: '',
1371
+ type: 'number',
1372
+ divStyle: 'width: 150px;',
1373
+ default: `${voucherData.microLimited ?? 0}`,
1374
+ placeHolder: '',
1375
+ callback: (text) => {
1376
+ voucherData.microLimited = parseInt(text, 10);
1497
1377
  },
1498
- {single: true}
1499
- )}`,
1500
- html`
1501
- <div class="tx_700">有效日期</div>
1502
- <div class="d-flex mb-3 ${document.body.clientWidth < 768 ? 'flex-column' : ''}"
1503
- style="gap: 12px">
1378
+ endText: '次',
1379
+ })}
1380
+ </div>`,
1381
+ },
1382
+ ],
1383
+ [voucherData.microLimited === 0 ? 'noLimited' : 'hasLimited'],
1384
+ (text) => {
1385
+ if (text[0] === 'noLimited') {
1386
+ voucherData.microLimited = 0;
1387
+ }
1388
+ },
1389
+ { single: true }
1390
+ )}`,
1391
+ html` <div class="tx_700">有效日期</div>
1392
+ <div class="d-flex mb-3 ${document.body.clientWidth < 768 ? 'flex-column' : ''}" style="gap: 12px">
1393
+ <div class="d-flex align-items-center">
1394
+ <span class="tx_normal me-2">開始日期</span>
1395
+ ${BgWidget.editeInput({
1396
+ gvc: gvc,
1397
+ title: '',
1398
+ type: 'date',
1399
+ style: inputStyle,
1400
+ default: `${voucherData.startDate}`,
1401
+ placeHolder: '',
1402
+ callback: (text) => {
1403
+ voucherData.startDate = text;
1404
+ },
1405
+ })}
1406
+ </div>
1407
+ <div class="d-flex align-items-center">
1408
+ <span class="tx_normal me-2">開始時間</span>
1409
+ ${BgWidget.editeInput({
1410
+ gvc: gvc,
1411
+ title: '',
1412
+ type: 'time',
1413
+ style: inputStyle,
1414
+ default: `${voucherData.startTime}`,
1415
+ placeHolder: '',
1416
+ callback: (text) => {
1417
+ voucherData.startTime = text;
1418
+ },
1419
+ })}
1420
+ </div>
1421
+ </div>
1422
+ ${BgWidget.multiCheckboxContainer(
1423
+ gvc,
1424
+ [
1425
+ {
1426
+ key: 'noEnd',
1427
+ name: '無期限',
1428
+ },
1429
+ {
1430
+ key: 'withEnd',
1431
+ name: '有效期限',
1432
+ innerHtml: html` <div class="d-flex mt-0 mt-md-3 ${document.body.clientWidth < 768 ? 'flex-column' : ''}" style="gap: 12px">
1504
1433
  <div class="d-flex align-items-center">
1505
- <span class="tx_normal me-2">開始日期</span>
1434
+ <span class="tx_normal me-2">結束日期</span>
1506
1435
  ${BgWidget.editeInput({
1507
1436
  gvc: gvc,
1508
1437
  title: '',
1509
1438
  type: 'date',
1510
1439
  style: inputStyle,
1511
- default: `${voucherData.startDate}`,
1440
+ default: `${voucherData.endDate}`,
1512
1441
  placeHolder: '',
1513
1442
  callback: (text) => {
1514
- voucherData.startDate = text;
1443
+ voucherData.endDate = text;
1515
1444
  },
1516
1445
  })}
1517
1446
  </div>
1518
1447
  <div class="d-flex align-items-center">
1519
- <span class="tx_normal me-2">開始時間</span>
1448
+ <span class="tx_normal me-2">結束時間</span>
1520
1449
  ${BgWidget.editeInput({
1521
1450
  gvc: gvc,
1522
1451
  title: '',
1523
1452
  type: 'time',
1524
1453
  style: inputStyle,
1525
- default: `${voucherData.startTime}`,
1454
+ default: `${voucherData.endTime}`,
1526
1455
  placeHolder: '',
1527
1456
  callback: (text) => {
1528
- voucherData.startTime = text;
1457
+ voucherData.endTime = text;
1529
1458
  },
1530
1459
  })}
1531
1460
  </div>
1532
- </div>
1533
- ${BgWidget.multiCheckboxContainer(
1534
- gvc,
1535
- [
1536
- {
1537
- key: 'noEnd',
1538
- name: '無期限',
1539
- },
1540
- {
1541
- key: 'withEnd',
1542
- name: '有效期限',
1543
- innerHtml: html`
1544
- <div class="d-flex mt-0 mt-md-3 ${document.body.clientWidth < 768 ? 'flex-column' : ''}"
1545
- style="gap: 12px">
1546
- <div class="d-flex align-items-center">
1547
- <span class="tx_normal me-2">結束日期</span>
1548
- ${BgWidget.editeInput({
1549
- gvc: gvc,
1550
- title: '',
1551
- type: 'date',
1552
- style: inputStyle,
1553
- default: `${voucherData.endDate}`,
1554
- placeHolder: '',
1555
- callback: (text) => {
1556
- voucherData.endDate = text;
1557
- },
1558
- })}
1559
- </div>
1560
- <div class="d-flex align-items-center">
1561
- <span class="tx_normal me-2">結束時間</span>
1562
- ${BgWidget.editeInput({
1563
- gvc: gvc,
1564
- title: '',
1565
- type: 'time',
1566
- style: inputStyle,
1567
- default: `${voucherData.endTime}`,
1568
- placeHolder: '',
1569
- callback: (text) => {
1570
- voucherData.endTime = text;
1571
- },
1572
- })}
1573
- </div>
1574
- </div>`,
1575
- },
1576
- ],
1577
- [voucherData.endDate ? `withEnd` : `noEnd`],
1578
- (text) => {
1579
- if (text[0] === 'noEnd') {
1580
- voucherData.endDate = undefined;
1581
- voucherData.endTime = undefined;
1582
- }
1583
- },
1584
- {single: true}
1585
- )}`,
1586
- ].join(BgWidget.horizontalLine());
1587
- },
1588
- };
1589
- })
1590
- ),
1591
- ].join(BgWidget.mbContainer(24)),
1592
- undefined,
1593
- 'padding: 0 ; margin: 0 !important; width: 68.5%;'
1594
- )}
1595
- ${BgWidget.container(
1596
- // 摘要預覽
1597
- gvc.bindView(() => {
1598
- const id = gvc.glitter.getUUID();
1599
- return {
1600
- bind: id,
1601
- dataList: Object.keys(voucherData).map((key) => {
1602
- return {obj: voucherData, key};
1603
- }),
1604
- view: () => {
1605
- return BgWidget.mainCard(
1606
- gvc.bindView(() => {
1607
- const id = gvc.glitter.getUUID();
1608
- return {
1609
- bind: id,
1610
- view: () => {
1611
- return html`
1612
- <div class="tx_700">摘要</div>
1613
- ${BgWidget.mbContainer(18)}
1614
- <div style="display: flex; gap: 12px; flex-direction: column;">
1615
- ${gvc.map(
1616
- getVoucherTextList().map((text) => {
1617
- return html`
1618
- <div class="${text.length > 0 ? 'tx_normal' : 'gray-top-bottom-line-6'}">
1619
- ${text}
1620
- </div>`;
1621
- })
1622
- )}
1623
- </div>
1624
- `;
1461
+ </div>`,
1625
1462
  },
1626
- };
1627
- })
1628
- );
1629
- },
1630
- divCreate: {
1631
- class: 'summary-card p-0',
1463
+ ],
1464
+ [voucherData.endDate ? `withEnd` : `noEnd`],
1465
+ (text) => {
1466
+ if (text[0] === 'noEnd') {
1467
+ voucherData.endDate = undefined;
1468
+ voucherData.endTime = undefined;
1469
+ }
1470
+ },
1471
+ { single: true }
1472
+ )}`,
1473
+ ].join(BgWidget.horizontalLine());
1632
1474
  },
1633
1475
  };
1476
+ })
1477
+ ),
1478
+ ].join(BgWidget.mbContainer(24)),
1479
+ undefined,
1480
+ 'padding: 0 ; margin: 0 !important; width: 68.5%;'
1481
+ )}
1482
+ ${BgWidget.container(
1483
+ // 摘要預覽
1484
+ gvc.bindView(() => {
1485
+ const id = gvc.glitter.getUUID();
1486
+ return {
1487
+ bind: id,
1488
+ dataList: Object.keys(voucherData).map((key) => {
1489
+ return { obj: voucherData, key };
1634
1490
  }),
1635
- undefined,
1636
- 'padding: 0; margin: 0 !important; width: 26.5%;'
1637
- )}
1638
- </div>`,
1491
+ view: () => {
1492
+ return BgWidget.mainCard(
1493
+ gvc.bindView(() => {
1494
+ const id = gvc.glitter.getUUID();
1495
+ return {
1496
+ bind: id,
1497
+ view: () => {
1498
+ return html`
1499
+ <div class="tx_700">摘要</div>
1500
+ ${BgWidget.mbContainer(18)}
1501
+ <div style="display: flex; gap: 12px; flex-direction: column;">
1502
+ ${gvc.map(
1503
+ getVoucherTextList().map((text) => {
1504
+ return html` <div class="${text.length > 0 ? 'tx_normal' : 'gray-top-bottom-line-6'}">${text}</div>`;
1505
+ })
1506
+ )}
1507
+ </div>
1508
+ `;
1509
+ },
1510
+ };
1511
+ })
1512
+ );
1513
+ },
1514
+ divCreate: {
1515
+ class: 'summary-card p-0',
1516
+ },
1517
+ };
1518
+ }),
1519
+ undefined,
1520
+ 'padding: 0; margin: 0 !important; width: 26.5%;'
1521
+ )}
1522
+ </div>`,
1639
1523
  // 空白容器
1640
1524
  BgWidget.mbContainer(240),
1641
1525
  // 儲存資料
1642
- html`
1643
- <div class="update-bar-container">
1644
- ${obj.type === 'replace'
1645
- ? BgWidget.cancel(
1646
- gvc.event(() => {
1647
- const dialog = new ShareDialog(obj.gvc.glitter);
1648
- dialog.checkYesOrNot({
1649
- text: '是否確認刪除優惠券?',
1650
- callback: (response) => {
1651
- if (response) {
1652
- dialog.dataLoading({visible: true});
1653
- ApiShop.deleteVoucher({
1654
- id: voucherData.id,
1655
- }).then((res) => {
1656
- dialog.dataLoading({visible: false});
1657
- if (res.result) {
1658
- vm.type = 'list';
1659
- } else {
1660
- dialog.errorMessage({text: '刪除失敗'});
1661
- }
1662
- });
1663
- }
1664
- },
1665
- });
1666
- }),
1667
- '刪除優惠券'
1668
- )
1669
- : ''}
1670
- ${BgWidget.cancel(
1671
- gvc.event(() => {
1672
- vm.type = 'list';
1673
- })
1674
- )}
1675
- ${BgWidget.save(
1676
- gvc.event(() => {
1677
- voucherData.start_ISO_Date = '';
1678
- voucherData.end_ISO_Date = '';
1679
- glitter.ut.tryMethod([
1680
- () => {
1681
- voucherData.start_ISO_Date = new Date(`${voucherData.startDate} ${voucherData.startTime}`).toISOString();
1682
- },
1683
- () => {
1684
- voucherData.end_ISO_Date = new Date(`${voucherData.endDate} ${voucherData.endTime}`).toISOString();
1685
- },
1686
- ]);
1687
- const dialog = new ShareDialog(gvc.glitter);
1688
- if (obj.type === 'replace') {
1689
- dialog.dataLoading({text: '正在更新優惠券', visible: true});
1690
- ApiPost.put({
1691
- postData: voucherData,
1692
- token: (window.parent as any).saasConfig.config.token,
1693
- type: 'manager',
1694
- }).then((re) => {
1695
- dialog.dataLoading({visible: false});
1696
- if (re.result) {
1697
- vm.status = 'list';
1698
- dialog.successMessage({text: '上傳成功'});
1699
- } else {
1700
- dialog.errorMessage({text: '上傳失敗'});
1701
- }
1702
- });
1526
+ html` <div class="update-bar-container">
1527
+ ${obj.type === 'replace'
1528
+ ? BgWidget.cancel(
1529
+ gvc.event(() => {
1530
+ const dialog = new ShareDialog(obj.gvc.glitter);
1531
+ dialog.checkYesOrNot({
1532
+ text: '是否確認刪除優惠券?',
1533
+ callback: (response) => {
1534
+ if (response) {
1535
+ dialog.dataLoading({ visible: true });
1536
+ ApiShop.deleteVoucher({
1537
+ id: voucherData.id,
1538
+ }).then((res) => {
1539
+ dialog.dataLoading({ visible: false });
1540
+ if (res.result) {
1541
+ vm.type = 'list';
1542
+ } else {
1543
+ dialog.errorMessage({ text: '刪除失敗' });
1544
+ }
1545
+ });
1546
+ }
1547
+ },
1548
+ });
1549
+ }),
1550
+ '刪除優惠券'
1551
+ )
1552
+ : ''}
1553
+ ${BgWidget.cancel(
1554
+ gvc.event(() => {
1555
+ vm.type = 'list';
1556
+ })
1557
+ )}
1558
+ ${BgWidget.save(
1559
+ gvc.event(() => {
1560
+ voucherData.start_ISO_Date = '';
1561
+ voucherData.end_ISO_Date = '';
1562
+ glitter.ut.tryMethod([
1563
+ () => {
1564
+ voucherData.start_ISO_Date = new Date(`${voucherData.startDate} ${voucherData.startTime}`).toISOString();
1565
+ },
1566
+ () => {
1567
+ voucherData.end_ISO_Date = new Date(`${voucherData.endDate} ${voucherData.endTime}`).toISOString();
1568
+ },
1569
+ ]);
1570
+ const dialog = new ShareDialog(gvc.glitter);
1571
+ if (obj.type === 'replace') {
1572
+ dialog.dataLoading({ text: '正在更新優惠券', visible: true });
1573
+ ApiPost.put({
1574
+ postData: voucherData,
1575
+ token: (window.parent as any).saasConfig.config.token,
1576
+ type: 'manager',
1577
+ }).then((re) => {
1578
+ dialog.dataLoading({ visible: false });
1579
+ if (re.result) {
1580
+ vm.status = 'list';
1581
+ dialog.successMessage({ text: '上傳成功' });
1703
1582
  } else {
1704
- dialog.dataLoading({text: '正在新增優惠券', visible: true});
1705
- ApiPost.post({
1706
- postData: voucherData,
1707
- token: (window.parent as any).saasConfig.config.token,
1708
- type: 'manager',
1709
- }).then((re) => {
1710
- dialog.dataLoading({visible: false});
1711
- if (re.result) {
1712
- vm.type = 'list';
1713
- dialog.successMessage({text: `上傳成功`});
1714
- } else {
1715
- dialog.errorMessage({text: `上傳失敗`});
1716
- }
1717
- });
1583
+ dialog.errorMessage({ text: '上傳失敗' });
1718
1584
  }
1719
- })
1720
- )}
1721
- </div>`,
1585
+ });
1586
+ } else {
1587
+ dialog.dataLoading({ text: '正在新增優惠券', visible: true });
1588
+ ApiPost.post({
1589
+ postData: voucherData,
1590
+ token: (window.parent as any).saasConfig.config.token,
1591
+ type: 'manager',
1592
+ }).then((re) => {
1593
+ dialog.dataLoading({ visible: false });
1594
+ if (re.result) {
1595
+ vm.type = 'list';
1596
+ dialog.successMessage({ text: `上傳成功` });
1597
+ } else {
1598
+ dialog.errorMessage({ text: `上傳失敗` });
1599
+ }
1600
+ });
1601
+ }
1602
+ })
1603
+ )}
1604
+ </div>`,
1722
1605
  ].join(BgWidget.mbContainer(24)),
1723
1606
  BgWidget.getContainerWidth()
1724
1607
  );