ts-glitter 20.8.7 → 20.8.9

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 (177) hide show
  1. package/lowcode/Entry.js +1 -1
  2. package/lowcode/Entry.ts +1 -1
  3. package/lowcode/backend-manager/bg-product.js +1 -1
  4. package/lowcode/backend-manager/bg-product.ts +1 -1
  5. package/lowcode/backend-manager/bg-recommend.js +1 -1
  6. package/lowcode/backend-manager/bg-recommend.ts +2 -2
  7. package/lowcode/backend-manager/bg-shopping.js +2 -5
  8. package/lowcode/backend-manager/bg-shopping.ts +2 -5
  9. package/lowcode/cms-plugin/POS-setting.js +58 -34
  10. package/lowcode/cms-plugin/POS-setting.ts +69 -33
  11. package/lowcode/cms-plugin/data-analyze-orders.js +0 -1
  12. package/lowcode/cms-plugin/data-analyze-orders.ts +1 -1
  13. package/lowcode/cms-plugin/data-analyze.js +1 -21
  14. package/lowcode/cms-plugin/data-analyze.ts +25 -25
  15. package/lowcode/cms-plugin/filter-options.js +1 -1
  16. package/lowcode/cms-plugin/filter-options.ts +1 -2
  17. package/lowcode/cms-plugin/information/information-module.js +275 -0
  18. package/lowcode/cms-plugin/information/information-module.ts +308 -0
  19. package/lowcode/cms-plugin/pos-pages/models.ts +3 -1
  20. package/lowcode/cms-plugin/pos-pages/payment-page.js +3 -11
  21. package/lowcode/cms-plugin/pos-pages/payment-page.ts +3 -11
  22. package/lowcode/cms-plugin/pos-pages/pos-function.js +1 -0
  23. package/lowcode/cms-plugin/pos-pages/pos-function.ts +1 -0
  24. package/lowcode/cms-plugin/pos-pages/products-page.js +1 -1
  25. package/lowcode/cms-plugin/pos-pages/products-page.ts +1 -1
  26. package/lowcode/cms-plugin/product-service.js +4 -9
  27. package/lowcode/cms-plugin/product-service.ts +4 -13
  28. package/lowcode/cms-plugin/shopping-discount-setting.js +76 -27
  29. package/lowcode/cms-plugin/shopping-discount-setting.ts +123 -63
  30. package/lowcode/cms-plugin/shopping-information.js +21 -167
  31. package/lowcode/cms-plugin/shopping-information.ts +35 -191
  32. package/lowcode/cms-plugin/shopping-order-return.js +212 -360
  33. package/lowcode/cms-plugin/shopping-order-return.ts +349 -482
  34. package/lowcode/cms-plugin/shopping-product-setting.js +8 -0
  35. package/lowcode/cms-plugin/shopping-product-setting.ts +12 -4
  36. package/lowcode/form-view/e-commerce/product-select.js +59 -51
  37. package/lowcode/form-view/e-commerce/product-select.ts +279 -266
  38. package/lowcode/glitter-base/global/language.js +2 -1
  39. package/lowcode/glitter-base/global/language.ts +2 -1
  40. package/lowcode/public-components/checkout/index.ts +2078 -2078
  41. package/lowcode/public-components/headers/sy-02.js +190 -179
  42. package/lowcode/public-components/headers/sy-02.ts +397 -370
  43. package/lowcode/public-components/headers/sy-03.js +133 -107
  44. package/lowcode/public-components/headers/sy-03.ts +276 -244
  45. package/lowcode/public-components/headers/sy-04.js +181 -146
  46. package/lowcode/public-components/headers/sy-04.ts +289 -247
  47. package/lowcode/public-components/product/pd-class.js +31 -23
  48. package/lowcode/public-components/product/pd-class.ts +51 -29
  49. package/lowcode/public-components/user-manager/um-voucher.js +1 -0
  50. package/lowcode/public-components/user-manager/um-voucher.ts +1 -0
  51. package/package.json +1 -1
  52. package/src/Language.js +1 -1
  53. package/src/Language.js.map +1 -1
  54. package/src/Language.ts +1 -1
  55. package/src/api-public/controllers/ai-chat.js.map +1 -1
  56. package/src/api-public/controllers/chat.js.map +1 -1
  57. package/src/api-public/controllers/customer-sessions.js.map +1 -1
  58. package/src/api-public/controllers/fb-message.js.map +1 -1
  59. package/src/api-public/controllers/fb-service.js.map +1 -1
  60. package/src/api-public/controllers/invoice.js.map +1 -1
  61. package/src/api-public/controllers/line-message.js.map +1 -1
  62. package/src/api-public/controllers/oauth.js.map +1 -1
  63. package/src/api-public/controllers/progress.js.map +1 -1
  64. package/src/api-public/controllers/rebate.js.map +1 -1
  65. package/src/api-public/controllers/recommend.js.map +1 -1
  66. package/src/api-public/controllers/reconciliation.js.map +1 -1
  67. package/src/api-public/controllers/shop.js +5 -2
  68. package/src/api-public/controllers/shop.js.map +1 -1
  69. package/src/api-public/controllers/shop.ts +7 -3
  70. package/src/api-public/controllers/shopee.js.map +1 -1
  71. package/src/api-public/controllers/sms.js.map +1 -1
  72. package/src/api-public/controllers/smtp.js.map +1 -1
  73. package/src/api-public/controllers/stock.js.map +1 -1
  74. package/src/api-public/controllers/track.js.map +1 -1
  75. package/src/api-public/controllers/voucher.js.map +1 -1
  76. package/src/api-public/models/glitter-finance.js +1 -2
  77. package/src/api-public/models/glitter-finance.js.map +1 -1
  78. package/src/api-public/services/EcInvoice.js.map +1 -1
  79. package/src/api-public/services/article.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.map +1 -1
  82. package/src/api-public/services/checkout-event.d.ts +1 -0
  83. package/src/api-public/services/checkout-event.js +17 -7
  84. package/src/api-public/services/checkout-event.js.map +1 -1
  85. package/src/api-public/services/checkout-event.ts +21 -9
  86. package/src/api-public/services/checkout.js.map +1 -1
  87. package/src/api-public/services/custom-code.js.map +1 -1
  88. package/src/api-public/services/customer-sessions.js.map +1 -1
  89. package/src/api-public/services/data-analyze.js +209 -196
  90. package/src/api-public/services/data-analyze.js.map +1 -1
  91. package/src/api-public/services/data-analyze.ts +219 -205
  92. package/src/api-public/services/delivery.js.map +1 -1
  93. package/src/api-public/services/ezpay/tool.d.ts +0 -1
  94. package/src/api-public/services/ezpay/tool.js.map +1 -1
  95. package/src/api-public/services/fake-data-model/fake-order.js.map +1 -1
  96. package/src/api-public/services/fake-data-model/fake-product.js.map +1 -1
  97. package/src/api-public/services/fake-data-model/fake-user.js.map +1 -1
  98. package/src/api-public/services/fb-api.js.map +1 -1
  99. package/src/api-public/services/filter-protect-data.js.map +1 -1
  100. package/src/api-public/services/financial-service.js +0 -1
  101. package/src/api-public/services/financial-service.js.map +1 -1
  102. package/src/api-public/services/form-check.js.map +1 -1
  103. package/src/api-public/services/graph-api.js.map +1 -1
  104. package/src/api-public/services/initial-fake-data.js.map +1 -1
  105. package/src/api-public/services/invoice.d.ts +3 -9
  106. package/src/api-public/services/invoice.js +66 -85
  107. package/src/api-public/services/invoice.js.map +1 -1
  108. package/src/api-public/services/invoice.ts +287 -293
  109. package/src/api-public/services/language-setting.js.map +1 -1
  110. package/src/api-public/services/mail.js.map +1 -1
  111. package/src/api-public/services/manager.js.map +1 -1
  112. package/src/api-public/services/paynow-logistics.js.map +1 -1
  113. package/src/api-public/services/phone-verify.js.map +1 -1
  114. package/src/api-public/services/pos.js.map +1 -1
  115. package/src/api-public/services/post.js.map +1 -1
  116. package/src/api-public/services/product-initial.js.map +1 -1
  117. package/src/api-public/services/rebate.js.map +1 -1
  118. package/src/api-public/services/reconciliation.js.map +1 -1
  119. package/src/api-public/services/schedule.d.ts +1 -0
  120. package/src/api-public/services/schedule.js +27 -0
  121. package/src/api-public/services/schedule.js.map +1 -1
  122. package/src/api-public/services/schedule.ts +30 -0
  123. package/src/api-public/services/shopping.d.ts +4 -3
  124. package/src/api-public/services/shopping.js +40 -20
  125. package/src/api-public/services/shopping.js.map +1 -1
  126. package/src/api-public/services/shopping.ts +52 -28
  127. package/src/api-public/services/stock.js.map +1 -1
  128. package/src/api-public/services/terms-check.js.map +1 -1
  129. package/src/api-public/services/updated-table-checked.js.map +1 -1
  130. package/src/api-public/services/user-update.js.map +1 -1
  131. package/src/api-public/services/user.d.ts +10 -0
  132. package/src/api-public/services/user.js +35 -8
  133. package/src/api-public/services/user.js.map +1 -1
  134. package/src/api-public/services/user.ts +50 -7
  135. package/src/api-public/services/voucher.js.map +1 -1
  136. package/src/api-public/utils/ut-database.js.map +1 -1
  137. package/src/app-project/android/app/src/main/res/xml/network_security_config.xml +3 -3
  138. package/src/app-project/android/app/src/main/res/xml/s.xml +5 -5
  139. package/src/app-project/android/gradlew.bat +94 -94
  140. package/src/app-project/serverless/src/controllers/index.js.map +1 -1
  141. package/src/app-project/serverless/src/controllers/sample.js.map +1 -1
  142. package/src/app-project/serverless/src/modules/database.d.ts +1 -2
  143. package/src/app-project/serverless/src/modules/database.js.map +1 -1
  144. package/src/app-project/serverless/src/modules/exception.js.map +1 -1
  145. package/src/app-project/serverless/src/modules/hooks.js.map +1 -1
  146. package/src/app-project/serverless/src/modules/logger.js.map +1 -1
  147. package/src/app-project/serverless/src/modules/redis.d.ts +1 -1
  148. package/src/app-project/serverless/src/modules/redis.js.map +1 -1
  149. package/src/app-project/serverless/src/modules/response.js.map +1 -1
  150. package/src/app-project/serverless/src/modules/ssh.js.map +1 -1
  151. package/src/controllers/ai.js.map +1 -1
  152. package/src/controllers/global-event.js.map +1 -1
  153. package/src/controllers/page.js.map +1 -1
  154. package/src/controllers/private_config.js.map +1 -1
  155. package/src/export/export-test.js.map +1 -1
  156. package/src/firebase/message.js +1 -2
  157. package/src/firebase/message.js.map +1 -1
  158. package/src/helper/app_creater.js +1 -2
  159. package/src/helper/app_creater.js.map +1 -1
  160. package/src/helper/glitter-util.d.ts +0 -1
  161. package/src/helper/glitter-util.js.map +1 -1
  162. package/src/lambda/interface.d.ts +1 -1
  163. package/src/lambda/interface.js +2 -2
  164. package/src/lambda/interface.js.map +1 -1
  165. package/src/modules/exception.js.map +1 -1
  166. package/src/modules/hooks.js.map +1 -1
  167. package/src/modules/response.js.map +1 -1
  168. package/src/modules/ssh.js.map +1 -1
  169. package/src/public-config-initial/auto-fcm.js.map +1 -1
  170. package/src/run.js.map +1 -1
  171. package/src/run.ts +12 -12
  172. package/src/services/ai.js.map +1 -1
  173. package/src/services/ses.js +1 -2
  174. package/src/services/ses.js.map +1 -1
  175. package/src/services/system-schedule.js.map +1 -1
  176. package/src/update-progress-track.js.map +1 -1
  177. package/src/update-script.js.map +1 -1
@@ -35,6 +35,7 @@ function getVoucherText(gvc: GVC, voucherData: VoucherContent): string[] {
35
35
  const productForList = [
36
36
  { title: Language.text('all_products'), value: 'all' },
37
37
  { title: Language.text('product_categories'), value: 'collection' },
38
+ { title: Language.text('products'), value: 'manager_tag' }, // 管理員標籤的篩選於前台顯示「特定商品」
38
39
  { title: Language.text('products'), value: 'product' },
39
40
  ];
40
41
 
@@ -390,7 +390,7 @@ export class ProductsPage {
390
390
  return html `
391
391
  <div class="w-100 d-flex">
392
392
  <div style="font-size: 18px;font-style: normal;font-weight: 700;">${data.left}</div>
393
- <div class="ms-auto" style="font-size: 16px;font-weight: 700;">${data.right}</div>
393
+ <div class="ms-auto" style="font-size: 16px;font-weight: 700;">$ ${data.right}</div>
394
394
  </div>
395
395
  `;
396
396
  })
@@ -480,7 +480,7 @@ export class ProductsPage {
480
480
  return html`
481
481
  <div class="w-100 d-flex">
482
482
  <div style="font-size: 18px;font-style: normal;font-weight: 700;">${data.left}</div>
483
- <div class="ms-auto" style="font-size: 16px;font-weight: 700;">${data.right}</div>
483
+ <div class="ms-auto" style="font-size: 16px;font-weight: 700;">$ ${data.right}</div>
484
484
  </div>
485
485
  `;
486
486
  })
@@ -5,16 +5,11 @@ export class ProductService {
5
5
  const gvc = obj.gvc;
6
6
  const dialog = new ShareDialog(gvc.glitter);
7
7
  function checkEmpty() {
8
- const variantsCheckList = ['sale_price'];
9
8
  if (postMD.product_category !== 'kitchen') {
10
- for (const checkItem of variantsCheckList) {
11
- if (postMD['variants'][0][checkItem] == undefined ||
12
- postMD['variants'][0][checkItem] == 0) {
13
- dialog.infoMessage({
14
- text: '售價未填',
15
- });
16
- return false;
17
- }
9
+ const salePrice = postMD['variants'][0]['sale_price'];
10
+ if (salePrice === '' || salePrice === undefined || salePrice === null) {
11
+ dialog.infoMessage({ text: '尚未填寫售價' });
12
+ return false;
18
13
  }
19
14
  }
20
15
  for (const index in postMD['variants']) {
@@ -1,7 +1,6 @@
1
1
  import { ShareDialog } from '../glitterBundle/dialog/ShareDialog.js';
2
2
  import { ShoppingProductSetting } from './shopping-product-setting.js';
3
3
  import { LanguageData } from '../public-models/product.js';
4
- import { CheckInput } from '../modules/checkInput.js';
5
4
 
6
5
  export class ProductService {
7
6
  public static checkData(postMD: any, obj: any, vm: any, refresh: () => void) {
@@ -9,19 +8,11 @@ export class ProductService {
9
8
  const dialog = new ShareDialog(gvc.glitter);
10
9
 
11
10
  function checkEmpty() {
12
- const variantsCheckList = ['sale_price'];
13
-
14
11
  if (postMD.product_category !== 'kitchen') {
15
- for (const checkItem of variantsCheckList) {
16
- if (
17
- (postMD['variants'][0] as any)[checkItem] == undefined ||
18
- (postMD['variants'][0] as any)[checkItem] == 0
19
- ) {
20
- dialog.infoMessage({
21
- text: '售價未填',
22
- });
23
- return false;
24
- }
12
+ const salePrice = (postMD['variants'][0] as any)['sale_price'];
13
+ if (salePrice === '' || salePrice === undefined || salePrice === null) {
14
+ dialog.infoMessage({ text: '尚未填寫售價' });
15
+ return false;
25
16
  }
26
17
  }
27
18
 
@@ -38,7 +38,6 @@ export class ShoppingDiscountSetting {
38
38
  const html = String.raw;
39
39
  return gvc.bindView(() => {
40
40
  const id = glitter.getUUID();
41
- const filterID = glitter.getUUID();
42
41
  return {
43
42
  bind: id,
44
43
  dataList: [{ obj: vm, key: 'type' }],
@@ -75,7 +74,7 @@ export class ShoppingDiscountSetting {
75
74
  };
76
75
  function getDatalist() {
77
76
  return data.response.data.map((dd) => {
78
- var _a;
77
+ var _a, _b;
79
78
  return [
80
79
  {
81
80
  key: '標題',
@@ -96,9 +95,9 @@ export class ShoppingDiscountSetting {
96
95
  </span>`,
97
96
  },
98
97
  {
99
- key: '對象',
98
+ key: '套用至',
100
99
  value: html `<span class="fs-7"
101
- >${dd.content.for === 'product' ? `指定商品` : `商品分類`}</span
100
+ >${(_b = ShoppingDiscountSetting.productForList.find(item => item.value === dd.content.for)) === null || _b === void 0 ? void 0 : _b.title}</span
102
101
  >`,
103
102
  },
104
103
  {
@@ -190,17 +189,12 @@ export class ShoppingDiscountSetting {
190
189
  const vm = obj.vm;
191
190
  const html = String.raw;
192
191
  const voucherData = Object.assign({ title: '', code: '', trigger: 'auto', method: 'fixed', value: '0', for: 'all', forKey: [], device: ['normal'], rule: 'min_price', ruleValue: 1000, startDate: this.getDateTime().date, startTime: this.getDateTime().time, endDate: undefined, endTime: undefined, status: 1, type: 'voucher', overlay: false, start_ISO_Date: '', end_ISO_Date: '', reBackType: obj.reBackType, rebateEndDay: '30', target: 'all', targetList: [], macroLimited: 0, microLimited: 0, counting: 'single', conditionType: 'order', includeDiscount: 'before', productOffStart: 'price_desc' }, vm.data);
193
- const productForList = [
194
- { title: '所有商品', value: 'all' },
195
- { title: '商品分類', value: 'collection' },
196
- { title: '單一商品', value: 'product' },
197
- ];
198
192
  function getVoucherTextList() {
199
193
  var _a, _b;
200
194
  return [
201
195
  `活動標題:${voucherData.title && voucherData.title.length > 0 ? voucherData.title : '尚無標題'}`,
202
196
  `適用商品:${(() => {
203
- const forData = productForList.find(item => item.value === voucherData.for);
197
+ const forData = ShoppingDiscountSetting.productForList.find(item => item.value === voucherData.for);
204
198
  return forData ? forData.title : '';
205
199
  })()}`,
206
200
  `活動方式:${(() => {
@@ -466,7 +460,7 @@ export class ShoppingDiscountSetting {
466
460
  </div>
467
461
  ${obj.gvc.map(customVM.dataList.map((opt, index) => {
468
462
  return html ` <div class="form-check-label c_updown_label">
469
- <span class="tx_normal">${index + 1} . ${opt.value}</span>
463
+ <span class="tx_normal">${index + 1}. ${opt.value}</span>
470
464
  ${opt.note
471
465
  ? html ` <span class="tx_gray_12 ms-2">${opt.note}</span> `
472
466
  : ''}
@@ -634,10 +628,12 @@ export class ShoppingDiscountSetting {
634
628
  BgWidget.mainCard(gvc.bindView(() => {
635
629
  var _a;
636
630
  const id = glitter.getUUID();
631
+ const originForType = String(voucherData.for);
637
632
  voucherData.forKey = (_a = voucherData.forKey) !== null && _a !== void 0 ? _a : [];
638
633
  let defKeys = {
639
634
  collection: JSON.parse(JSON.stringify(voucherData.forKey)),
640
635
  product: JSON.parse(JSON.stringify(voucherData.forKey)),
636
+ manager_tag: JSON.parse(JSON.stringify(voucherData.forKey)),
641
637
  };
642
638
  return {
643
639
  bind: id,
@@ -711,7 +707,7 @@ export class ShoppingDiscountSetting {
711
707
  gvc: gvc,
712
708
  title: '',
713
709
  def: (_a = voucherData.for) !== null && _a !== void 0 ? _a : 'all',
714
- array: productForList,
710
+ array: ShoppingDiscountSetting.productForList,
715
711
  callback: text => {
716
712
  voucherData.forKey = defKeys[text];
717
713
  voucherData.for = text;
@@ -722,6 +718,52 @@ export class ShoppingDiscountSetting {
722
718
  ${BgWidget.mbContainer(8)}
723
719
  ${(() => {
724
720
  switch (voucherData.for) {
721
+ case 'manager_tag':
722
+ return gvc.bindView(() => {
723
+ const subVM = {
724
+ id: gvc.glitter.getUUID(),
725
+ dataList: originForType === 'manager_tag' ? [...defKeys.manager_tag] : [],
726
+ };
727
+ return {
728
+ bind: subVM.id,
729
+ view: () => {
730
+ return html `
731
+ <div class="d-flex flex-column p-2" style="gap: 18px;">
732
+ <div
733
+ class="d-flex align-items-center gray-bottom-line-18"
734
+ style="gap: 24px; justify-content: space-between;"
735
+ >
736
+ <div class="form-check-label c_updown_label">
737
+ <div class="tx_normal">標籤列表</div>
738
+ </div>
739
+ ${BgWidget.grayButton('選擇標籤', gvc.event(() => {
740
+ BgProduct.useProductTags({
741
+ gvc,
742
+ config_key: 'product_manager_tags',
743
+ def: originForType === 'manager_tag' && voucherData.forKey
744
+ ? voucherData.forKey.map(item => `${item}`)
745
+ : [],
746
+ callback: (value) => __awaiter(this, void 0, void 0, function* () {
747
+ voucherData.forKey = value;
748
+ defKeys.manager_tag = value;
749
+ subVM.dataList = value;
750
+ gvc.notifyDataChange(subVM.id);
751
+ }),
752
+ });
753
+ }), { textStyle: 'font-weight: 400;' })}
754
+ </div>
755
+ ${obj.gvc.map(subVM.dataList.map((opt, index) => {
756
+ return html ` <div
757
+ class="d-flex align-items-center form-check-label c_updown_label gap-3"
758
+ >
759
+ <span class="tx_normal">${index + 1}. #${opt}</span>
760
+ </div>`;
761
+ }))}
762
+ </div>
763
+ `;
764
+ },
765
+ };
766
+ });
725
767
  case 'collection':
726
768
  return gvc.bindView(() => {
727
769
  const subVM = {
@@ -763,7 +805,7 @@ export class ShoppingDiscountSetting {
763
805
  return html ` <div
764
806
  class="d-flex align-items-center form-check-label c_updown_label gap-3"
765
807
  >
766
- <span class="tx_normal">${index + 1} . ${opt.value}</span>
808
+ <span class="tx_normal">${index + 1}. ${opt.value}</span>
767
809
  ${opt.note
768
810
  ? html ` <span class="tx_gray_12 ms-2">${opt.note}</span> `
769
811
  : ''}
@@ -836,7 +878,7 @@ export class ShoppingDiscountSetting {
836
878
  return html ` <div
837
879
  class="d-flex align-items-center form-check-label c_updown_label gap-3"
838
880
  >
839
- <span class="tx_normal">${index + 1} .</span>
881
+ <span class="tx_normal">${index + 1}.</span>
840
882
  ${BgWidget.validImageBox({
841
883
  gvc: gvc,
842
884
  image: opt.image,
@@ -886,7 +928,6 @@ export class ShoppingDiscountSetting {
886
928
  })(),
887
929
  ].join(BgWidget.horizontalLine());
888
930
  },
889
- divCreate: {},
890
931
  };
891
932
  })),
892
933
  ...(() => {
@@ -961,7 +1002,7 @@ export class ShoppingDiscountSetting {
961
1002
  return html ` <div
962
1003
  class="d-flex align-items-center form-check-label c_updown_label gap-3"
963
1004
  >
964
- <span class="tx_normal">${index + 1} .</span>
1005
+ <span class="tx_normal">${index + 1}.</span>
965
1006
  ${BgWidget.validImageBox({
966
1007
  gvc: gvc,
967
1008
  image: opt.image,
@@ -1265,7 +1306,8 @@ export class ShoppingDiscountSetting {
1265
1306
  ...(() => {
1266
1307
  var _a, _b;
1267
1308
  if (voucherData.reBackType === 'rebate') {
1268
- return [[
1309
+ return [
1310
+ [
1269
1311
  `<div class="tx_700">購物金有效天數</div>`,
1270
1312
  BgWidget.multiCheckboxContainer(gvc, [
1271
1313
  {
@@ -1276,13 +1318,13 @@ export class ShoppingDiscountSetting {
1276
1318
  key: 'withEnd',
1277
1319
  name: '有效期限',
1278
1320
  innerHtml: html ` <div
1279
- class="d-flex mt-0 mt-md-3 ${document.body.clientWidth < 768
1321
+ class="d-flex mt-0 mt-md-3 ${document.body.clientWidth < 768
1280
1322
  ? 'flex-column'
1281
1323
  : ''}"
1282
- style="gap: 12px"
1283
- >
1284
- <div class="d-flex align-items-center" style="gap:10px;">
1285
- ${BgWidget.editeInput({
1324
+ style="gap: 12px"
1325
+ >
1326
+ <div class="d-flex align-items-center" style="gap:10px;">
1327
+ ${BgWidget.editeInput({
1286
1328
  gvc: gvc,
1287
1329
  title: '',
1288
1330
  type: 'number',
@@ -1294,16 +1336,17 @@ export class ShoppingDiscountSetting {
1294
1336
  gvc.notifyDataChange(id);
1295
1337
  },
1296
1338
  })}
1297
- <span class="tx_normal me-2">天</span>
1298
- </div>
1299
- </div>`,
1339
+ <span class="tx_normal me-2">天</span>
1340
+ </div>
1341
+ </div>`,
1300
1342
  },
1301
1343
  ], [parseInt((_b = voucherData.rebateEndDay) !== null && _b !== void 0 ? _b : '0', 10) ? `withEnd` : `noEnd`], text => {
1302
1344
  if (text[0] === 'noEnd') {
1303
1345
  voucherData.rebateEndDay = '0';
1304
1346
  }
1305
- }, { single: true })
1306
- ].join('<div class="my-2"></div>')];
1347
+ }, { single: true }),
1348
+ ].join('<div class="my-2"></div>'),
1349
+ ];
1307
1350
  }
1308
1351
  else {
1309
1352
  return [];
@@ -1535,4 +1578,10 @@ ShoppingDiscountSetting.getDateTime = (n = 0) => {
1535
1578
  const timeStr = `${hours}:00`;
1536
1579
  return { date: dateStr, time: timeStr };
1537
1580
  };
1581
+ ShoppingDiscountSetting.productForList = [
1582
+ { title: '所有商品', value: 'all' },
1583
+ { title: '商品分類', value: 'collection' },
1584
+ { title: '管理員標籤', value: 'manager_tag' },
1585
+ { title: '特定商品', value: 'product' },
1586
+ ];
1538
1587
  window.glitter.setModule(import.meta.url, ShoppingDiscountSetting);
@@ -8,6 +8,8 @@ import { ShareDialog } from '../glitterBundle/dialog/ShareDialog.js';
8
8
  import { FilterOptions } from './filter-options.js';
9
9
  import { Tool } from '../modules/tool.js';
10
10
 
11
+ type VoucherForType = 'all' | 'collection' | 'product' | 'manager_tag';
12
+
11
13
  export class ShoppingDiscountSetting {
12
14
  public static getLabel(voucher_type: string): string {
13
15
  const labels: Record<string, string> = {
@@ -37,7 +39,6 @@ export class ShoppingDiscountSetting {
37
39
 
38
40
  return gvc.bindView(() => {
39
41
  const id = glitter.getUUID();
40
- const filterID = glitter.getUUID();
41
42
  return {
42
43
  bind: id,
43
44
  dataList: [{ obj: vm, key: 'type' }],
@@ -104,9 +105,11 @@ export class ShoppingDiscountSetting {
104
105
  </span>`,
105
106
  },
106
107
  {
107
- key: '對象',
108
+ key: '套用至',
108
109
  value: html`<span class="fs-7"
109
- >${dd.content.for === 'product' ? `指定商品` : `商品分類`}</span
110
+ >${ShoppingDiscountSetting.productForList.find(
111
+ item => item.value === dd.content.for
112
+ )?.title}</span
110
113
  >`,
111
114
  },
112
115
  {
@@ -205,6 +208,13 @@ export class ShoppingDiscountSetting {
205
208
  return { date: dateStr, time: timeStr };
206
209
  };
207
210
 
211
+ static productForList = [
212
+ { title: '所有商品', value: 'all' },
213
+ { title: '商品分類', value: 'collection' },
214
+ { title: '管理員標籤', value: 'manager_tag' },
215
+ { title: '特定商品', value: 'product' },
216
+ ];
217
+
208
218
  public static voucherEditor(obj: { vm: any; gvc: GVC; type?: 'add' | 'replace'; defData?: any; reBackType: string }) {
209
219
  const gvc = obj.gvc;
210
220
  const glitter = gvc.glitter;
@@ -220,7 +230,7 @@ export class ShoppingDiscountSetting {
220
230
  device: ('normal' | 'pos')[];
221
231
  value: string;
222
232
  add_on_products?: string[];
223
- for: 'collection' | 'product' | 'all';
233
+ for: VoucherForType;
224
234
  rule: 'min_price' | 'min_count';
225
235
  counting: 'single' | 'each';
226
236
  conditionType: 'item' | 'order';
@@ -276,17 +286,11 @@ export class ShoppingDiscountSetting {
276
286
  ...vm.data,
277
287
  };
278
288
 
279
- const productForList = [
280
- { title: '所有商品', value: 'all' },
281
- { title: '商品分類', value: 'collection' },
282
- { title: '單一商品', value: 'product' },
283
- ];
284
-
285
289
  function getVoucherTextList() {
286
290
  return [
287
291
  `活動標題:${voucherData.title && voucherData.title.length > 0 ? voucherData.title : '尚無標題'}`,
288
292
  `適用商品:${(() => {
289
- const forData = productForList.find(item => item.value === voucherData.for);
293
+ const forData = ShoppingDiscountSetting.productForList.find(item => item.value === voucherData.for);
290
294
  return forData ? forData.title : '';
291
295
  })()}`,
292
296
  `活動方式:${(() => {
@@ -586,7 +590,7 @@ export class ShoppingDiscountSetting {
586
590
  ${obj.gvc.map(
587
591
  customVM.dataList.map((opt: OptionsItem, index) => {
588
592
  return html` <div class="form-check-label c_updown_label">
589
- <span class="tx_normal">${index + 1} . ${opt.value}</span>
593
+ <span class="tx_normal">${index + 1}. ${opt.value}</span>
590
594
  ${opt.note
591
595
  ? html` <span class="tx_gray_12 ms-2">${opt.note}</span> `
592
596
  : ''}
@@ -770,10 +774,12 @@ export class ShoppingDiscountSetting {
770
774
  BgWidget.mainCard(
771
775
  gvc.bindView(() => {
772
776
  const id = glitter.getUUID();
777
+ const originForType = String(voucherData.for);
773
778
  voucherData.forKey = voucherData.forKey ?? [];
774
779
  let defKeys: any = {
775
780
  collection: JSON.parse(JSON.stringify(voucherData.forKey)),
776
781
  product: JSON.parse(JSON.stringify(voucherData.forKey)),
782
+ manager_tag: JSON.parse(JSON.stringify(voucherData.forKey)),
777
783
  };
778
784
  return {
779
785
  bind: id,
@@ -851,10 +857,10 @@ export class ShoppingDiscountSetting {
851
857
  gvc: gvc,
852
858
  title: '',
853
859
  def: voucherData.for ?? 'all',
854
- array: productForList,
860
+ array: ShoppingDiscountSetting.productForList,
855
861
  callback: text => {
856
862
  voucherData.forKey = defKeys[text];
857
- voucherData.for = text as 'collection' | 'product' | 'all';
863
+ voucherData.for = text as VoucherForType;
858
864
  gvc.notifyDataChange(id);
859
865
  },
860
866
  oneLine: true,
@@ -862,6 +868,60 @@ export class ShoppingDiscountSetting {
862
868
  ${BgWidget.mbContainer(8)}
863
869
  ${(() => {
864
870
  switch (voucherData.for) {
871
+ case 'manager_tag':
872
+ return gvc.bindView(() => {
873
+ const subVM = {
874
+ id: gvc.glitter.getUUID(),
875
+ dataList: originForType === 'manager_tag' ? [...defKeys.manager_tag] : [],
876
+ };
877
+
878
+ return {
879
+ bind: subVM.id,
880
+ view: () => {
881
+ return html`
882
+ <div class="d-flex flex-column p-2" style="gap: 18px;">
883
+ <div
884
+ class="d-flex align-items-center gray-bottom-line-18"
885
+ style="gap: 24px; justify-content: space-between;"
886
+ >
887
+ <div class="form-check-label c_updown_label">
888
+ <div class="tx_normal">標籤列表</div>
889
+ </div>
890
+ ${BgWidget.grayButton(
891
+ '選擇標籤',
892
+ gvc.event(() => {
893
+ BgProduct.useProductTags({
894
+ gvc,
895
+ config_key: 'product_manager_tags',
896
+ def:
897
+ originForType === 'manager_tag' && voucherData.forKey
898
+ ? voucherData.forKey.map(item => `${item}`)
899
+ : [],
900
+ callback: async value => {
901
+ voucherData.forKey = value;
902
+ defKeys.manager_tag = value;
903
+ subVM.dataList = value;
904
+ gvc.notifyDataChange(subVM.id);
905
+ },
906
+ });
907
+ }),
908
+ { textStyle: 'font-weight: 400;' }
909
+ )}
910
+ </div>
911
+ ${obj.gvc.map(
912
+ subVM.dataList.map((opt, index) => {
913
+ return html` <div
914
+ class="d-flex align-items-center form-check-label c_updown_label gap-3"
915
+ >
916
+ <span class="tx_normal">${index + 1}. #${opt}</span>
917
+ </div>`;
918
+ })
919
+ )}
920
+ </div>
921
+ `;
922
+ },
923
+ };
924
+ });
865
925
  case 'collection':
866
926
  return gvc.bindView(() => {
867
927
  const subVM = {
@@ -907,7 +967,7 @@ export class ShoppingDiscountSetting {
907
967
  return html` <div
908
968
  class="d-flex align-items-center form-check-label c_updown_label gap-3"
909
969
  >
910
- <span class="tx_normal">${index + 1} . ${opt.value}</span>
970
+ <span class="tx_normal">${index + 1}. ${opt.value}</span>
911
971
  ${opt.note
912
972
  ? html` <span class="tx_gray_12 ms-2">${opt.note}</span> `
913
973
  : ''}
@@ -985,7 +1045,7 @@ export class ShoppingDiscountSetting {
985
1045
  return html` <div
986
1046
  class="d-flex align-items-center form-check-label c_updown_label gap-3"
987
1047
  >
988
- <span class="tx_normal">${index + 1} .</span>
1048
+ <span class="tx_normal">${index + 1}.</span>
989
1049
  ${BgWidget.validImageBox({
990
1050
  gvc: gvc,
991
1051
  image: opt.image,
@@ -1034,7 +1094,6 @@ export class ShoppingDiscountSetting {
1034
1094
  })(),
1035
1095
  ].join(BgWidget.horizontalLine());
1036
1096
  },
1037
- divCreate: {},
1038
1097
  };
1039
1098
  })
1040
1099
  ),
@@ -1122,7 +1181,7 @@ export class ShoppingDiscountSetting {
1122
1181
  return html` <div
1123
1182
  class="d-flex align-items-center form-check-label c_updown_label gap-3"
1124
1183
  >
1125
- <span class="tx_normal">${index + 1} .</span>
1184
+ <span class="tx_normal">${index + 1}.</span>
1126
1185
  ${BgWidget.validImageBox({
1127
1186
  gvc: gvc,
1128
1187
  image: opt.image,
@@ -1500,52 +1559,53 @@ export class ShoppingDiscountSetting {
1500
1559
  )}`,
1501
1560
  ...(() => {
1502
1561
  if (voucherData.reBackType === 'rebate') {
1503
-
1504
- return [[
1505
- `<div class="tx_700">購物金有效天數</div>`,
1506
- BgWidget.multiCheckboxContainer(
1507
- gvc,
1508
- [
1509
- {
1510
- key: 'noEnd',
1511
- name: '無期限',
1512
- },
1513
- {
1514
- key: 'withEnd',
1515
- name: '有效期限',
1516
- innerHtml: html` <div
1517
- class="d-flex mt-0 mt-md-3 ${document.body.clientWidth < 768
1518
- ? 'flex-column'
1519
- : ''}"
1520
- style="gap: 12px"
1521
- >
1522
- <div class="d-flex align-items-center" style="gap:10px;">
1523
- ${BgWidget.editeInput({
1524
- gvc: gvc,
1525
- title: '',
1526
- type: 'number',
1527
- style: inputStyle,
1528
- default: `${voucherData.rebateEndDay ?? ''}`,
1529
- placeHolder: '0則為無期限',
1530
- callback: text => {
1531
- voucherData.rebateEndDay = text;
1532
- gvc.notifyDataChange(id)
1533
- },
1534
- })}
1535
- <span class="tx_normal me-2">天</span>
1536
- </div>
1537
- </div>`,
1562
+ return [
1563
+ [
1564
+ `<div class="tx_700">購物金有效天數</div>`,
1565
+ BgWidget.multiCheckboxContainer(
1566
+ gvc,
1567
+ [
1568
+ {
1569
+ key: 'noEnd',
1570
+ name: '無期限',
1571
+ },
1572
+ {
1573
+ key: 'withEnd',
1574
+ name: '有效期限',
1575
+ innerHtml: html` <div
1576
+ class="d-flex mt-0 mt-md-3 ${document.body.clientWidth < 768
1577
+ ? 'flex-column'
1578
+ : ''}"
1579
+ style="gap: 12px"
1580
+ >
1581
+ <div class="d-flex align-items-center" style="gap:10px;">
1582
+ ${BgWidget.editeInput({
1583
+ gvc: gvc,
1584
+ title: '',
1585
+ type: 'number',
1586
+ style: inputStyle,
1587
+ default: `${voucherData.rebateEndDay ?? ''}`,
1588
+ placeHolder: '0則為無期限',
1589
+ callback: text => {
1590
+ voucherData.rebateEndDay = text;
1591
+ gvc.notifyDataChange(id);
1592
+ },
1593
+ })}
1594
+ <span class="tx_normal me-2">天</span>
1595
+ </div>
1596
+ </div>`,
1597
+ },
1598
+ ],
1599
+ [parseInt(voucherData.rebateEndDay ?? '0', 10) ? `withEnd` : `noEnd`],
1600
+ text => {
1601
+ if (text[0] === 'noEnd') {
1602
+ voucherData.rebateEndDay = '0';
1603
+ }
1538
1604
  },
1539
- ],
1540
- [parseInt(voucherData.rebateEndDay ?? '0',10) ? `withEnd` : `noEnd`],
1541
- text => {
1542
- if (text[0] === 'noEnd') {
1543
- voucherData.rebateEndDay='0'
1544
- }
1545
- },
1546
- { single: true }
1547
- )
1548
- ].join('<div class="my-2"></div>')];
1605
+ { single: true }
1606
+ ),
1607
+ ].join('<div class="my-2"></div>'),
1608
+ ];
1549
1609
  } else {
1550
1610
  return [];
1551
1611
  }