ts-glitter 22.4.7 → 22.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (98) hide show
  1. package/lib/glitterBundle/Glitter.css +74 -62
  2. package/lowcode/Entry.js +1 -1
  3. package/lowcode/Entry.ts +1 -1
  4. package/lowcode/backend-manager/bg-product.js +49 -32
  5. package/lowcode/backend-manager/bg-product.ts +57 -39
  6. package/lowcode/backend-manager/bg-widget.js +17 -0
  7. package/lowcode/backend-manager/bg-widget.ts +18 -0
  8. package/lowcode/cms-plugin/information/information-module.js +5 -5
  9. package/lowcode/cms-plugin/information/information-module.ts +9 -5
  10. package/lowcode/cms-plugin/menus-setting.js +69 -55
  11. package/lowcode/cms-plugin/menus-setting.ts +77 -61
  12. package/lowcode/cms-plugin/module/form-module.js +109 -89
  13. package/lowcode/cms-plugin/module/form-module.ts +680 -650
  14. package/lowcode/cms-plugin/module/product-excel.js +1 -0
  15. package/lowcode/cms-plugin/module/product-excel.ts +2 -0
  16. package/lowcode/cms-plugin/pos-pages/payment-page.js +28 -10
  17. package/lowcode/cms-plugin/pos-pages/payment-page.ts +29 -10
  18. package/lowcode/cms-plugin/shopping-allowance-manager.js +0 -1
  19. package/lowcode/cms-plugin/shopping-allowance-manager.ts +0 -1
  20. package/lowcode/cms-plugin/shopping-collections.js +367 -193
  21. package/lowcode/cms-plugin/shopping-collections.ts +664 -243
  22. package/lowcode/cms-plugin/shopping-information.js +392 -38
  23. package/lowcode/cms-plugin/shopping-information.ts +479 -87
  24. package/lowcode/cms-plugin/shopping-product-setting.js +2 -2
  25. package/lowcode/cms-plugin/shopping-product-setting.ts +2 -2
  26. package/lowcode/cms-plugin/shopping-setting-advance.js +906 -766
  27. package/lowcode/cms-plugin/shopping-setting-advance.ts +977 -841
  28. package/lowcode/cms-plugin/shopping-setting-basic.js +1547 -1285
  29. package/lowcode/cms-plugin/shopping-setting-basic.ts +1742 -1466
  30. package/lowcode/cms-plugin/stock-stores.js +1 -0
  31. package/lowcode/cms-plugin/stock-stores.ts +1 -0
  32. package/lowcode/cms-plugin/user-list.js +47 -12
  33. package/lowcode/cms-plugin/user-list.ts +52 -14
  34. package/lowcode/css/editor.css +6 -0
  35. package/lowcode/glitterBundle/Glitter.css +74 -62
  36. package/lowcode/jslib/nestable/index.html +317 -0
  37. package/lowcode/jslib/nestable/jquery.nestable.js +484 -0
  38. package/lowcode/official_view_component/form-widget/input-custom.js +98 -6
  39. package/lowcode/official_view_component/form-widget/input-custom.ts +121 -16
  40. package/lowcode/public-components/headers/header-class.js +63 -0
  41. package/lowcode/public-components/headers/header-class.ts +65 -0
  42. package/lowcode/public-components/headers/sy-02.js +386 -400
  43. package/lowcode/public-components/headers/sy-02.ts +482 -492
  44. package/lowcode/public-components/headers/sy-03.js +42 -43
  45. package/lowcode/public-components/headers/sy-03.ts +46 -43
  46. package/lowcode/public-components/headers/sy-04.js +43 -41
  47. package/lowcode/public-components/headers/sy-04.ts +48 -41
  48. package/lowcode/public-components/headers/sy-05.js +30 -27
  49. package/lowcode/public-components/headers/sy-05.ts +33 -27
  50. package/lowcode/public-components/product/product-list.js +160 -148
  51. package/lowcode/public-components/product/product-list.ts +186 -165
  52. package/lowcode/public-models/product.ts +26 -1
  53. package/lowcode/src/glitterBundle/Glitter.css +74 -62
  54. package/package.json +1 -1
  55. package/rxmnt81tnk.json +1 -0
  56. package/src/api-public/controllers/shop.js +10 -4
  57. package/src/api-public/controllers/shop.js.map +1 -1
  58. package/src/api-public/controllers/shop.ts +14 -9
  59. package/src/api-public/services/ezpay/tool.d.ts +1 -0
  60. package/src/api-public/services/mail.js +1 -1
  61. package/src/api-public/services/mail.js.map +1 -1
  62. package/src/api-public/services/mail.ts +1 -1
  63. package/src/api-public/services/schedule.d.ts +0 -1
  64. package/src/api-public/services/schedule.js +12 -35
  65. package/src/api-public/services/schedule.js.map +1 -1
  66. package/src/api-public/services/schedule.ts +15 -39
  67. package/src/api-public/services/shopee.js +7 -17
  68. package/src/api-public/services/shopping.d.ts +27 -6
  69. package/src/api-public/services/shopping.js +364 -85
  70. package/src/api-public/services/shopping.js.map +1 -1
  71. package/src/api-public/services/shopping.ts +510 -101
  72. package/src/api-public/services/updated-table-checked.js +58 -1
  73. package/src/api-public/services/updated-table-checked.js.map +1 -1
  74. package/src/api-public/services/updated-table-checked.ts +62 -1
  75. package/src/api-public/services/user-update.js +14 -0
  76. package/src/api-public/services/user-update.js.map +1 -1
  77. package/src/api-public/services/user-update.ts +15 -0
  78. package/src/api-public/services/user.js +1 -1
  79. package/src/api-public/services/user.js.map +1 -1
  80. package/src/api-public/services/user.ts +1 -1
  81. package/src/app-project/serverless/src/modules/database.d.ts +1 -1
  82. package/src/app-project/serverless/src/modules/redis.d.ts +1 -1
  83. package/src/helper/glitter-util.d.ts +1 -0
  84. package/src/index.js +7 -5
  85. package/src/index.js.map +1 -1
  86. package/src/index.ts +45 -38
  87. package/src/modules/firebase.js +1 -0
  88. package/src/modules/firebase.js.map +1 -1
  89. package/src/modules/firebase.ts +1 -0
  90. package/src/seo-config.d.ts +1 -1
  91. package/src/seo-config.js +1 -2
  92. package/src/seo-config.js.map +1 -1
  93. package/src/seo-config.ts +1 -2
  94. package/src/services/saas-table-check.js.map +1 -1
  95. package/src/services/ses.js +4 -3
  96. package/src/services/ses.js.map +1 -1
  97. package/src/services/system-schedule.js.map +1 -1
  98. package/src/services/system-schedule.ts +1 -0
@@ -8,6 +8,13 @@ import { GlobalUser } from '../glitter-base/global/global-user.js';
8
8
  import { InformationModule, ViewModel } from './information/information-module.js';
9
9
 
10
10
  const html = String.raw;
11
+ const css = String.raw;
12
+
13
+ interface ReverseRule {
14
+ rule: string;
15
+ range: string;
16
+ enabled: boolean;
17
+ }
11
18
 
12
19
  export class ShoppingInformation {
13
20
  static saveArray: (() => Promise<boolean>)[] = [];
@@ -20,6 +27,9 @@ export class ShoppingInformation {
20
27
  id: glitter.getUUID(),
21
28
  tableId: glitter.getUUID(),
22
29
  filterId: glitter.getUUID(),
30
+ webTypeId: glitter.getUUID(),
31
+ reverseId: glitter.getUUID(),
32
+ reverseEditId: glitter.getUUID(),
23
33
  type: 'basic',
24
34
  data: {
25
35
  ubn: '',
@@ -125,6 +135,15 @@ export class ShoppingInformation {
125
135
  bind: vm.id,
126
136
  dataList: [{ obj: vm, key: 'type' }],
127
137
  view: () => {
138
+ gvc.glitter.addMtScript(
139
+ [
140
+ {
141
+ src: `https://raw.githack.com/SortableJS/Sortable/master/Sortable.js`,
142
+ },
143
+ ],
144
+ () => {},
145
+ () => {}
146
+ );
128
147
  if (vm.mainLoading) {
129
148
  ApiUser.getPublicConfig('store-information', 'manager').then((response: any) => {
130
149
  const data = response.response.value;
@@ -155,7 +174,9 @@ export class ShoppingInformation {
155
174
 
156
175
  function createSection(title: string, description?: string) {
157
176
  return html`
158
- <div class="d-flex" style="font-weight: 700;color: #393939; font-size: 16px;line-height: 1.4;gap: 6px;">${title}</div>
177
+ <div class="d-flex" style="font-weight: 700;color: #393939; font-size: 16px;line-height: 1.4;gap: 6px;">
178
+ ${title}
179
+ </div>
159
180
  ${description
160
181
  ? html` <div style="color: #8D8D8D; font-size: 14px; padding-right: 10px;">${description}</div>`
161
182
  : ''}
@@ -163,16 +184,17 @@ export class ShoppingInformation {
163
184
  }
164
185
 
165
186
  function createToggle(title: string, description: string, key: keyof typeof vm.data) {
166
- const toggleHtml = html` <div class="cursor_pointer form-check form-switch m-0 p-0" style="min-width: 50px;">
167
- <input
168
- class="form-check-input m-0"
169
- type="checkbox"
170
- onchange="${gvc.event(() => (vm.data[key] = !vm.data[key]))}"
171
- ${vm.data[key] ? 'checked' : ''}
172
- />
173
- </div>`
187
+ const toggleHtml = html` <div class="cursor_pointer form-check form-switch m-0 p-0" style="min-width: 50px;">
188
+ <input
189
+ class="form-check-input m-0"
190
+ type="checkbox"
191
+ onchange="${gvc.event(() => (vm.data[key] = !vm.data[key]))}"
192
+ ${vm.data[key] ? 'checked' : ''}
193
+ />
194
+ </div>`;
174
195
  return createRow(
175
- html`<div>${title}</div>${toggleHtml}`,
196
+ html` <div>${title}</div>
197
+ ${toggleHtml}`,
176
198
  description,
177
199
  ''
178
200
  );
@@ -243,6 +265,367 @@ export class ShoppingInformation {
243
265
  );
244
266
  }
245
267
 
268
+ function drawReserveSection() {
269
+ return gvc.bindView({
270
+ bind: vm.reverseId,
271
+ view: () => {
272
+ function drawQuest() {
273
+ return BgWidget.questionButton(
274
+ gvc.event(() => {
275
+ BgWidget.quesDialog({
276
+ gvc: gvc,
277
+ style: '',
278
+ innerHTML(gvc: GVC): string {
279
+ const hint =
280
+ '若是商店的每日營業時間為 上午09:00~上午12:00 且星期一固定公休' +
281
+ '作法:新增規則「幾點到幾點」指定時間、再設置「特定星期」指定星期一' +
282
+ '切記公休的規則要再下方,才能覆蓋掉上面的規則';
283
+ return html`
284
+ <div class="d-flex flex-column text-white">
285
+ <div>若是商店的每日營業時間為 上午09:00~上午12:00 且星期一固定公休,</div>
286
+ <div>作法:新增規則「幾點到幾點」指定時間、再設置「特定星期」指定星期一</div>
287
+ <div>切記公休的規則要再下方,才能覆蓋掉上面的規則</div>
288
+ <img src="${img}" alt="hintImg" style="margin-top:8px;" />
289
+ </div>
290
+ `;
291
+ },
292
+ });
293
+ })
294
+ );
295
+ }
296
+
297
+ function drawEdition() {
298
+ return gvc.bindView({
299
+ bind: vm.reverseEditId,
300
+ view: () => {
301
+ gvc.addStyle(css`
302
+ .range-input {
303
+ padding: 0 18px;
304
+ border-radius: 10px;
305
+ border: 1px solid #ddd;
306
+ background: #fff;
307
+ height: 40px;
308
+ gap: 10px;
309
+ }
310
+
311
+ .range-input-raw {
312
+ display: flex;
313
+ gap: 18px;
314
+ }
315
+ `);
316
+ try {
317
+ interface RangeViewType {
318
+ [key: string]: (ruleIndex: number) => string;
319
+ }
320
+
321
+ const toggleHtml = (ruleIndex: number) => {
322
+ let toggle = ruleData[ruleIndex].enabled
323
+ return html`
324
+ ${toggle?"開啟":"關閉"}
325
+ <div
326
+ class="cursor_pointer form-check form-switch m-0 p-0"
327
+ style="min-width: 50px;"
328
+ >
329
+ <input
330
+ class="form-check-input m-0"
331
+ type="checkbox"
332
+ onchange="${gvc.event(e => {
333
+ ruleData[ruleIndex].enabled = !toggle;
334
+ gvc.notifyDataChange(vm.reverseEditId);
335
+ })}"
336
+ ${toggle ? 'checked' : ''}
337
+ />
338
+ </div>`;
339
+ };
340
+ const rangeView: RangeViewType = {
341
+ date: (ruleIndex: number) => {
342
+ const dateInput = (dateString: string, index: number) => {
343
+ const date = dateString.split(',');
344
+ return html`
345
+ <div class="d-flex range-input flex-fill">
346
+ <input
347
+ class="border-0 w-100"
348
+ value="${date[index]}"
349
+ type="time"
350
+ onchange="${gvc.event(e => {
351
+ function isValidTimeRange(timeRange:string) {
352
+ const [start, end] = timeRange.split(',');
353
+
354
+ // 轉換時間為日期對象,並設置同一天的日期(例如,2023-01-01)
355
+ const startTime = new Date(`2023-01-01T${start}:00`);
356
+ const endTime = new Date(`2023-01-01T${end}:00`);
357
+
358
+ // 比較時間
359
+ return endTime > startTime;
360
+ }
361
+ date[index] = e.value;
362
+ ruleData[ruleIndex].range = isValidTimeRange(`${date[0]},${date[1]}`)?`${date[0]},${date[1]}`:`${date[1]},${date[0]}`;
363
+ gvc.notifyDataChange(vm.reverseEditId)
364
+ })}"
365
+ />
366
+ </div>
367
+ `;
368
+ };
369
+
370
+ return html`
371
+ <div class="h-100 d-flex range-input-raw">
372
+ ${dateInput(ruleData[ruleIndex].range, 0)} ${dateInput(ruleData[ruleIndex].range, 1)}
373
+ </div>
374
+ `;
375
+ },
376
+ week: (ruleIndex: number) => {
377
+
378
+
379
+ return BgWidget.select({
380
+ callback(value: any): void {
381
+ ruleData[ruleIndex].range = value
382
+ console.log(vm.data);
383
+ },
384
+ default: ruleData[ruleIndex].range,
385
+ gvc: gvc,
386
+ options: [
387
+ { key: "1", value: "禮拜一" },
388
+ { key: "2", value: "禮拜二" },
389
+ { key: "3", value: "禮拜三" },
390
+ { key: "4", value: "禮拜四" },
391
+ { key: "5", value: "禮拜五" },
392
+ { key: "6", value: "禮拜六" },
393
+ { key: "7", value: "禮拜日" }
394
+ ]
395
+
396
+ })
397
+ },
398
+ month: (ruleIndex: number) => {
399
+ const monthInput = (monthString: string, index: number) => {
400
+ const month = monthString.split(',');
401
+ return html`
402
+ <div class="d-flex range-input flex-fill">
403
+ <input
404
+ class="border-0 w-100"
405
+ value="${month[index]}"
406
+ type="number"
407
+ onchange="${gvc.event(e => {
408
+ const numberValue = Number(e.value);
409
+ if (numberValue > 12 || numberValue < 1) {
410
+ dialog.infoMessage({
411
+ text: '請輸入正確的月份數字',
412
+ callback: () => {
413
+ e.value = month[index];
414
+ },
415
+ });
416
+ } else {
417
+ month[index] = e.value;
418
+ ruleData[ruleIndex].range = `${month[0]},${month[1]}`;
419
+ }
420
+ })}"
421
+ />
422
+ <div class="tx_gray_16 d-flex align-items-center">月</div>
423
+ </div>
424
+ `;
425
+ };
426
+
427
+ return html`
428
+ <div class="h-100 d-flex range-input-raw">
429
+ ${monthInput(ruleData[ruleIndex].range, 0)} ${monthInput(ruleData[ruleIndex].range, 1)}
430
+ </div>
431
+ `;
432
+ },
433
+ };
434
+ return ruleData
435
+ .map((rule, index: number) => {
436
+ return html` <li
437
+ class="w-100 mb-2 d-flex align-items-center "
438
+ style="overflow: hidden;padding-bottom: 18px;height:58px;"
439
+ >
440
+ <div class="d-flex align-items-center pe-5 flex-shrink-0" style="width:33%">
441
+ <i class="fa-sharp fa-solid fa-grip-dots-vertical me-3 dragItem cursor_move"></i>
442
+ ${BgWidget.select({
443
+ gvc: gvc,
444
+ callback(value: any): void {
445
+ rule.rule = value;
446
+ const initData = {
447
+ month : ()=>{
448
+ return "1,12"
449
+ },
450
+ date:()=>{
451
+ return `00:00,23:59`
452
+ },
453
+ week:()=>{
454
+ return "1"
455
+ }
456
+ }
457
+ rule.range = initData[rule.rule as keyof typeof initData]();
458
+ gvc.notifyDataChange(vm.reverseEditId);
459
+ },
460
+ style: 'color:#393939',
461
+ default: rule.rule ?? 'month',
462
+ options: [
463
+ { key: 'month', value: '月份區間' },
464
+ { key: 'week', value: '特定星期' },
465
+ { key: 'date', value: '日期區間' },
466
+ ],
467
+ })}
468
+ </div>
469
+ <div class="h-100 pe-5" style="width:52%" >${rangeView[rule.rule ?? 'month'](index)}</div>
470
+ <div class="d-flex flex-shrink-0 position-relative" style="width:15%;gap:6px;">${toggleHtml(index)}
471
+ <i class="ms-auto fa-solid fa-xmark-large cursor_pointer" style="color:#B0B0B0" onclick="${gvc.event(()=>{
472
+ ruleData.splice(index, 1);
473
+ gvc.notifyDataChange(vm.reverseEditId);
474
+ })}"></i>
475
+ </div>
476
+
477
+ </li>`;
478
+ })
479
+ .join('');
480
+ } catch (e: any) {
481
+ console.log(e);
482
+ return e;
483
+ }
484
+ },
485
+ divCreate: {
486
+ elem: 'ul',
487
+ option: [{ key: 'id', value: vm.reverseEditId }],
488
+ class: 'd-flex flex-column m-0',
489
+ style: 'padding-top:24px;',
490
+ },
491
+ onCreate: () => {
492
+ let n = 0;
493
+ const interval = setInterval(() => {
494
+ n++;
495
+ if ((gvc.glitter.window as any).Sortable) {
496
+ try {
497
+ function swapArr(arr: any, index1: number, index2: number) {
498
+ const data = arr[index1];
499
+ arr.splice(index1, 1);
500
+ arr.splice(index2, 0, data);
501
+ }
502
+
503
+ let startIndex = 0;
504
+ //@ts-ignore
505
+ gvc.glitter.window.Sortable.create(gvc.glitter.document.getElementById(vm.reverseEditId), {
506
+ group: gvc.glitter.getUUID(),
507
+ animation: 100,
508
+ handle: '.dragItem',
509
+ onChange: function (evt: any) {},
510
+ onStart: function (evt: any) {
511
+ startIndex = evt.oldIndex;
512
+ },
513
+ onEnd: (evt: any) => {
514
+ swapArr(ruleData, startIndex, evt.newIndex);
515
+ },
516
+ });
517
+ } catch (e) {}
518
+ clearInterval(interval);
519
+ }
520
+ if (n > 100) {
521
+ clearInterval(interval);
522
+ }
523
+ }, 100);
524
+ },
525
+ });
526
+ }
527
+
528
+ gvc.addStyle(css`
529
+ .quest-Dialog {
530
+ padding: 10px;
531
+ border-radius: 10px;
532
+ }
533
+ `);
534
+ let ruleData: ReverseRule[] = vm.data.ruleData??[];
535
+ const emptyData: ReverseRule = {
536
+ enabled: false,
537
+ range: '1,12',
538
+ rule: 'month',
539
+ };
540
+ const img =
541
+ 'https://d3jnmi1tfjgtti.cloudfront.net/file/122538856/sizeoriginal_s*px$_sasas8s7sfscs5s0_messageImage_1748238444050.jpg';
542
+ const sectionText = {
543
+ first: {
544
+ title: '營業/預約時段管理',
545
+ subTitle: '管理商店的營業時段與公休日,活動預約時間將依此設定自動生成',
546
+ quest: drawQuest(),
547
+ },
548
+ section: {
549
+ rawTitle: [
550
+ { key: 'rule', text: '規則', width: 'width:33%' },
551
+ {
552
+ key: 'range',
553
+ text: '區間',
554
+ width: 'flex-grow:1',
555
+ },
556
+ { key: 'enabled', text: '預約功能', width: 'width:15%' },
557
+ ],
558
+ data: ruleData,
559
+ },
560
+ third: {
561
+ text: '※ 下方的規則優先覆蓋上方的規則',
562
+ btn: BgWidget.save(
563
+ gvc.event(() => {
564
+
565
+ ruleData.push(structuredClone(emptyData));
566
+ vm.data.ruleData = ruleData;
567
+ gvc.notifyDataChange(vm.reverseEditId);
568
+ }),
569
+ '新增規則'
570
+ ),
571
+ },
572
+ };
573
+ return BgWidget.mainCard(html`
574
+ <div class="d-flex flex-column" style="gap: 24px;">
575
+ <!-- reverse first section-->
576
+ <div class="d-flex flex-column">
577
+ <div class="tx_700">${sectionText.first.title} ${sectionText.first.quest}</div>
578
+ <div class="tx_gray_14">${sectionText.first.subTitle}</div>
579
+ </div>
580
+ <!-- reverse second section-->
581
+ <div class="d-flex flex-column">
582
+ <div class="d-flex">
583
+ ${sectionText.section.rawTitle
584
+ .map(rawTitle => {
585
+ return html` <div class="d-flex tx_700" style="${rawTitle.width}">${rawTitle.text}</div> `;
586
+ })
587
+ .join('')}
588
+ </div>
589
+ <div class="d-flex flex-column" style="gap:33px;">${drawEdition()}</div>
590
+ </div>
591
+ <!-- reverse third section-->
592
+ <div class="d-flex" style="padding: 12px 20px;background: #F7F7F7;">
593
+ <div class="tx_700 d-flex align-items-center">${sectionText.third.text}</div>
594
+ <div class="ms-auto">${sectionText.third.btn}</div>
595
+ </div>
596
+ </div>
597
+ `);
598
+ },
599
+ divCreate: {},
600
+ });
601
+ }
602
+
603
+ function drawWebTypeSection() {
604
+ return gvc.bindView({
605
+ bind: vm.webTypeId,
606
+ view: () => {
607
+ const webTypeSection: Record<string, any> = {
608
+ reserve: drawReserveSection(),
609
+ };
610
+
611
+ return html`
612
+ <div class="d-flex flex-column">
613
+ ${vm.data.web_type
614
+ .map((web_type: string) => {
615
+ if (webTypeSection[web_type]) {
616
+ return webTypeSection[web_type];
617
+ }
618
+ return ``;
619
+ })
620
+ .filter((item: string) => item !== '')
621
+ .join(BgWidget.mbContainer(24))}
622
+ ${BgWidget.mbContainer(24)}
623
+ </div>
624
+ `;
625
+ },
626
+ divCreate: {},
627
+ });
628
+ }
246
629
 
247
630
  const typeMap: Record<string, () => string> = {
248
631
  basic: () => {
@@ -367,9 +750,11 @@ export class ShoppingInformation {
367
750
  .shopnex.tw
368
751
  </div>
369
752
  </div>
370
- ${domainType==='custom' ? (()=>{
371
- return ``
372
- })():``}
753
+ ${domainType === 'custom'
754
+ ? (() => {
755
+ return ``;
756
+ })()
757
+ : ``}
373
758
  <div class="d-flex justify-content-end">${BgWidget.save(gvc.event(applyDomain), '申請')}</div>
374
759
  </div>
375
760
  `,
@@ -578,84 +963,91 @@ export class ShoppingInformation {
578
963
  ],
579
964
  callback: (array: any) => {
580
965
  vm.data.web_type = array;
966
+ gvc.notifyDataChange('web_type');
581
967
  },
582
968
  type: 'multiple',
583
969
  })}
584
- `)
585
- return BgWidget.mainCard(html`
586
- <div class="tx_700">商店類型</div>
587
- <div class="tx_gray_14">系統將根據您勾選的項目,開放相對應的功能</div>
588
- ${BgWidget.inlineCheckBox({
589
- title: '',
590
- gvc,
591
- def: vm.data.web_type,
592
- array: [
593
- { title: '零售購物', value: 'shop' },
594
- { title: '授課網站', value: 'teaching' },
595
- { title: '預約系統', value: 'reserve' },
596
- { title: '餐飲組合', value: 'kitchen' },
597
- { title: '秤重交易', value: 'weighing' },
598
- ],
599
- callback: (array: any) => {
600
- vm.data.web_type = array;
601
- },
602
- type: 'multiple',
603
- })}
604
- `) +
605
- BgWidget.mbContainer(24)
606
- +
607
- BgWidget.mainCard(html`
608
- <div class="d-flex flex-column " style="gap:18px;">
609
- <div class="tx_700">商店功能</div>
610
- ${createToggle('啟用 AI 選品', '透過 AI 選品功能,用戶可以使用自然語言描述找到所需商品', 'ai_search')}
611
- ${GlobalUser.getPlan().id > 0
612
- ? createToggle(
613
- '啟用聊聊功能',
614
- '啟用聊聊功能,方便客戶直接於官網前台與您聯繫,並詢問商品詳細內容',
615
- 'chat_toggle'
616
- )
617
- : ''}
618
- ${createToggle(
619
- '啟用心願單功能',
620
- '方便客戶收藏並管理喜愛的商品清單,隨時查看心儀商品,提升購物體驗與轉換率',
621
- 'wishlist'
622
- )}
623
- ${createToggle('啟用顧客評論功能', '顧客可以對您的商品進行評論', 'customer_comment')}
624
- ${createToggle(
625
- '啟用 Cookie 聲明',
626
- '如需使用廣告追蹤行為,必須啟用 Cookie 聲明,才可發送廣告',
627
- 'cookie_check'
628
- )}
629
- ${createToggle('顯示商品剩餘庫存', '啟用此功能,顧客會在商品頁面看到此商品剩餘的庫存數', 'stock_view')}
630
- ${createToggle(
631
- '線上商店開放預購商品',
632
- '啟用此功能,顧客可以在線上商店的商品無庫存時,進行預購',
633
- 'pre_order_status'
634
- )}
635
- ${createToggle(
636
- '商品卡片顯示區間價格',
637
- '啟用後,若商品有多個規格、不同價位,前台商品卡片將會使用價格區間來顯示,關閉則顯示該商品規格中最低價者',
638
- 'interval_price_card'
639
- )}
640
- ${createToggle(
641
- '單獨顯示商品特價',
642
- '啟用此功能,會將含有特價的商品價格或區間,單獨使用紅字顯示,關閉則採用刪改線的方式呈現特價',
643
- 'independent_special_price'
644
- )}
645
- ${createPickUpModeDialog(
646
- '取貨號碼',
647
- '針對特店取貨功能,開啟取貨號碼功能消費者需告知商家取貨號碼並前往特店取貨'
648
- )}
649
- ${createCheckoutModeDialog(
650
- '訂單結算模式',
651
- '設定訂單結算模式,可調整顧客累積消費金額、會員等級、數據分析的統計機制'
652
- )}
653
- ${createInvoiceModeDialog(
654
- '發票開立時機',
655
- '設定發票開立的時機,可在商家想要的時間點,開立並發送訂單發票'
656
- )}
657
- </div>
658
970
  `);
971
+ return (
972
+ BgWidget.mainCard(html`
973
+ <div class="tx_700">商店類型</div>
974
+ <div class="tx_gray_14">系統將根據您勾選的項目,開放相對應的功能</div>
975
+ ${BgWidget.inlineCheckBox({
976
+ title: '',
977
+ gvc,
978
+ def: vm.data.web_type,
979
+ array: [
980
+ { title: '零售購物', value: 'shop' },
981
+ { title: '授課網站', value: 'teaching' },
982
+ { title: '預約系統', value: 'reserve' },
983
+ { title: '餐飲組合', value: 'kitchen' },
984
+ { title: '秤重交易', value: 'weighing' },
985
+ ],
986
+ callback: (array: any) => {
987
+ vm.data.web_type = array;
988
+ },
989
+ type: 'multiple',
990
+ })}
991
+ `) +
992
+ BgWidget.mbContainer(24) +
993
+ drawWebTypeSection() +
994
+ BgWidget.mainCard(html`
995
+ <div class="d-flex flex-column " style="gap:18px;">
996
+ <div class="tx_700">商店功能</div>
997
+ ${createToggle('啟用 AI 選品', '透過 AI 選品功能,用戶可以使用自然語言描述找到所需商品', 'ai_search')}
998
+ ${GlobalUser.getPlan().id > 0
999
+ ? createToggle(
1000
+ '啟用聊聊功能',
1001
+ '啟用聊聊功能,方便客戶直接於官網前台與您聯繫,並詢問商品詳細內容',
1002
+ 'chat_toggle'
1003
+ )
1004
+ : ''}
1005
+ ${createToggle(
1006
+ '啟用心願單功能',
1007
+ '方便客戶收藏並管理喜愛的商品清單,隨時查看心儀商品,提升購物體驗與轉換率',
1008
+ 'wishlist'
1009
+ )}
1010
+ ${createToggle('啟用顧客評論功能', '顧客可以對您的商品進行評論', 'customer_comment')}
1011
+ ${createToggle(
1012
+ '啟用 Cookie 聲明',
1013
+ '如需使用廣告追蹤行為,必須啟用 Cookie 聲明,才可發送廣告',
1014
+ 'cookie_check'
1015
+ )}
1016
+ ${createToggle(
1017
+ '顯示商品剩餘庫存',
1018
+ '啟用此功能,顧客會在商品頁面看到此商品剩餘的庫存數',
1019
+ 'stock_view'
1020
+ )}
1021
+ ${createToggle(
1022
+ '線上商店開放預購商品',
1023
+ '啟用此功能,顧客可以在線上商店的商品無庫存時,進行預購',
1024
+ 'pre_order_status'
1025
+ )}
1026
+ ${createToggle(
1027
+ '商品卡片顯示區間價格',
1028
+ '啟用後,若商品有多個規格、不同價位,前台商品卡片將會使用價格區間來顯示,關閉則顯示該商品規格中最低價者',
1029
+ 'interval_price_card'
1030
+ )}
1031
+ ${createToggle(
1032
+ '單獨顯示商品特價',
1033
+ '啟用此功能,會將含有特價的商品價格或區間,單獨使用紅字顯示,關閉則採用刪改線的方式呈現特價',
1034
+ 'independent_special_price'
1035
+ )}
1036
+ ${createPickUpModeDialog(
1037
+ '取貨號碼',
1038
+ '針對特店取貨功能,開啟取貨號碼功能消費者需告知商家取貨號碼並前往特店取貨'
1039
+ )}
1040
+ ${createCheckoutModeDialog(
1041
+ '訂單結算模式',
1042
+ '設定訂單結算模式,可調整顧客累積消費金額、會員等級、數據分析的統計機制'
1043
+ )}
1044
+ ${createInvoiceModeDialog(
1045
+ '發票開立時機',
1046
+ '設定發票開立的時機,可在商家想要的時間點,開立並發送訂單發票'
1047
+ )}
1048
+ </div>
1049
+ `)
1050
+ );
659
1051
  },
660
1052
  global: () => {
661
1053
  return BgWidget.mainCard(html`
@@ -645,7 +645,7 @@ export class ShoppingProductSetting {
645
645
  const language_data = postMD.language_data[ShoppingProductSetting.select_language];
646
646
  imageLibrary.selectImageFromArray(language_data.preview_image, {
647
647
  gvc: gvc,
648
- title: html ` <div class="d-flex flex-column" >圖片庫</div>`,
648
+ title: html ` <div class="d-flex flex-column">圖片庫</div>`,
649
649
  getSelect: imageUrl => {
650
650
  variant[`preview_image_${ShoppingProductSetting.select_language}`] = imageUrl;
651
651
  gvc.notifyDataChange(id);
@@ -1382,7 +1382,7 @@ export class ShoppingProductSetting {
1382
1382
  </div>
1383
1383
  <div class="flex-fill"></div>
1384
1384
  <div class="d-flex align-items-center justify-content-end w-100 mt-2">
1385
- <div class="me-2 ">
1385
+ <div class="me-2">
1386
1386
  ${LanguageBackend.switchBtn({
1387
1387
  gvc: gvc,
1388
1388
  language: vm.language,
@@ -741,7 +741,7 @@ export class ShoppingProductSetting {
741
741
  ];
742
742
  imageLibrary.selectImageFromArray(language_data.preview_image, {
743
743
  gvc: gvc,
744
- title: html` <div class="d-flex flex-column" >圖片庫</div>`,
744
+ title: html` <div class="d-flex flex-column">圖片庫</div>`,
745
745
  getSelect: imageUrl => {
746
746
  variant[`preview_image_${ShoppingProductSetting.select_language}`] = imageUrl;
747
747
  gvc.notifyDataChange(id);
@@ -1643,7 +1643,7 @@ export class ShoppingProductSetting {
1643
1643
  </div>
1644
1644
  <div class="flex-fill"></div>
1645
1645
  <div class="d-flex align-items-center justify-content-end w-100 mt-2">
1646
- <div class="me-2 ">
1646
+ <div class="me-2">
1647
1647
  ${LanguageBackend.switchBtn({
1648
1648
  gvc: gvc,
1649
1649
  language: vm.language,