ts-glitter 20.6.8 → 20.6.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 (160) hide show
  1. package/lowcode/Entry.js +2 -2
  2. package/lowcode/Entry.ts +2 -2
  3. package/lowcode/backend-manager/bg-blog.js +617 -621
  4. package/lowcode/backend-manager/bg-blog.ts +2323 -2325
  5. package/lowcode/backend-manager/bg-line.js +5 -4
  6. package/lowcode/backend-manager/bg-line.ts +5 -4
  7. package/lowcode/backend-manager/bg-list-component.js +9 -0
  8. package/lowcode/backend-manager/bg-list-component.ts +15 -1
  9. package/lowcode/backend-manager/bg-notify.js +6 -4
  10. package/lowcode/backend-manager/bg-notify.ts +6 -4
  11. package/lowcode/backend-manager/bg-product.js +145 -0
  12. package/lowcode/backend-manager/bg-product.ts +153 -0
  13. package/lowcode/backend-manager/bg-sns.js +5 -3
  14. package/lowcode/backend-manager/bg-sns.ts +5 -3
  15. package/lowcode/backend-manager/bg-widget.js +92 -4
  16. package/lowcode/backend-manager/bg-widget.ts +122 -6
  17. package/lowcode/backend-manager/splitPage.js +0 -39
  18. package/lowcode/backend-manager/splitPage.ts +0 -40
  19. package/lowcode/cms-plugin/auto-fcm-advertise.js +17 -5
  20. package/lowcode/cms-plugin/auto-fcm-advertise.ts +19 -6
  21. package/lowcode/cms-plugin/auto-fcm-history.js +2732 -0
  22. package/lowcode/cms-plugin/auto-fcm-history.ts +2995 -0
  23. package/lowcode/cms-plugin/cms-router.js +5 -0
  24. package/lowcode/cms-plugin/cms-router.ts +6 -0
  25. package/lowcode/cms-plugin/filter-options.js +80 -27
  26. package/lowcode/cms-plugin/filter-options.ts +83 -27
  27. package/lowcode/cms-plugin/language-backend.js +50 -39
  28. package/lowcode/cms-plugin/language-backend.ts +109 -95
  29. package/lowcode/cms-plugin/menus-setting.js +175 -151
  30. package/lowcode/cms-plugin/menus-setting.ts +620 -591
  31. package/lowcode/cms-plugin/model/order.d.ts +1 -0
  32. package/lowcode/cms-plugin/module/data.js +7 -7
  33. package/lowcode/cms-plugin/module/data.ts +262 -233
  34. package/lowcode/cms-plugin/module/delivery-html.js +18 -10
  35. package/lowcode/cms-plugin/module/delivery-html.ts +26 -10
  36. package/lowcode/cms-plugin/module/order-setting.js +458 -328
  37. package/lowcode/cms-plugin/module/order-setting.ts +622 -351
  38. package/lowcode/cms-plugin/module/product-excel.js +1 -1
  39. package/lowcode/cms-plugin/module/product-excel.ts +2 -1
  40. package/lowcode/cms-plugin/order/order-module.js +90 -1
  41. package/lowcode/cms-plugin/order/order-module.ts +106 -1
  42. package/lowcode/cms-plugin/pos-pages/payment-page.js +11 -8
  43. package/lowcode/cms-plugin/pos-pages/payment-page.ts +28 -15
  44. package/lowcode/cms-plugin/pos-pages/products-page.js +0 -39
  45. package/lowcode/cms-plugin/pos-pages/products-page.ts +0 -40
  46. package/lowcode/cms-plugin/shopping-collections.ts +1 -3
  47. package/lowcode/cms-plugin/shopping-finance-setting.js +19 -80
  48. package/lowcode/cms-plugin/shopping-finance-setting.ts +19 -87
  49. package/lowcode/cms-plugin/shopping-order-manager.js +122 -38
  50. package/lowcode/cms-plugin/shopping-order-manager.ts +160 -58
  51. package/lowcode/cms-plugin/shopping-product-setting.js +364 -376
  52. package/lowcode/cms-plugin/shopping-product-setting.ts +406 -415
  53. package/lowcode/cms-plugin/shopping-setting-advance.js +57 -16
  54. package/lowcode/cms-plugin/shopping-setting-advance.ts +69 -18
  55. package/lowcode/cms-plugin/user/user-module.js +2 -43
  56. package/lowcode/cms-plugin/user/user-module.ts +2 -46
  57. package/lowcode/cms-plugin/user-list.js +4 -6
  58. package/lowcode/cms-plugin/user-list.ts +35 -38
  59. package/lowcode/css/editor.css +42 -3
  60. package/lowcode/glitter-base/global/language.js +6 -1
  61. package/lowcode/glitter-base/global/language.ts +10 -4
  62. package/lowcode/glitter-base/global/payment-config.js +19 -16
  63. package/lowcode/glitter-base/global/payment-config.ts +22 -16
  64. package/lowcode/glitter-base/global/shipment-config.js +6 -5
  65. package/lowcode/glitter-base/global/shipment-config.ts +12 -10
  66. package/lowcode/glitter-base/route/fcm.js +21 -1
  67. package/lowcode/glitter-base/route/fcm.ts +22 -2
  68. package/lowcode/glitter-base/route/shopping.js +8 -32
  69. package/lowcode/glitter-base/route/shopping.ts +10 -33
  70. package/lowcode/glitter-base/route/user.js +11 -2
  71. package/lowcode/glitter-base/route/user.ts +23 -12
  72. package/lowcode/jspage/function-page/setting_editor.js +9 -0
  73. package/lowcode/jspage/function-page/setting_editor.ts +9 -0
  74. package/lowcode/public-components/blogs/list.js +223 -195
  75. package/lowcode/public-components/blogs/list.ts +383 -352
  76. package/lowcode/public-components/product/product-list.js +8 -4
  77. package/lowcode/public-components/product/product-list.ts +9 -4
  78. package/lowcode/public-components/terms-related/index.js +1 -1
  79. package/lowcode/public-components/terms-related/index.ts +1 -1
  80. package/lowcode/public-components/user-manager/um-login.js +1 -1
  81. package/lowcode/public-components/user-manager/um-login.ts +2 -2
  82. package/lowcode/public-components/user-manager/um-order.js +41 -5
  83. package/lowcode/public-components/user-manager/um-order.ts +58 -20
  84. package/lowcode/public-components/user-manager/um-voucher.ts +2 -2
  85. package/nhi4veq3gk.json +1 -0
  86. package/package.json +1 -1
  87. package/src/Language.d.ts +2 -0
  88. package/src/Language.js +66 -65
  89. package/src/Language.js.map +1 -1
  90. package/src/Language.ts +719 -715
  91. package/src/api-public/config/shipment-config.js +3 -2
  92. package/src/api-public/config/shipment-config.js.map +1 -1
  93. package/src/api-public/config/shipment-config.ts +3 -2
  94. package/src/api-public/controllers/ai-chat.js.map +1 -1
  95. package/src/api-public/controllers/ai-chat.ts +1 -2
  96. package/src/api-public/controllers/fcm.js +23 -58
  97. package/src/api-public/controllers/fcm.js.map +1 -1
  98. package/src/api-public/controllers/fcm.ts +28 -56
  99. package/src/api-public/controllers/shop.js +7 -1
  100. package/src/api-public/controllers/shop.js.map +1 -1
  101. package/src/api-public/controllers/shop.ts +17 -10
  102. package/src/api-public/controllers/user.js +1 -0
  103. package/src/api-public/controllers/user.js.map +1 -1
  104. package/src/api-public/controllers/user.ts +2 -0
  105. package/src/api-public/services/auto-send-email.js +247 -187
  106. package/src/api-public/services/auto-send-email.js.map +1 -1
  107. package/src/api-public/services/auto-send-email.ts +568 -505
  108. package/src/api-public/services/delivery.js +1 -1
  109. package/src/api-public/services/delivery.js.map +1 -1
  110. package/src/api-public/services/delivery.ts +6 -5
  111. package/src/api-public/services/financial-service.js +1 -2
  112. package/src/api-public/services/financial-service.js.map +1 -1
  113. package/src/api-public/services/financial-service.ts +4 -6
  114. package/src/api-public/services/manager.d.ts +4 -3
  115. package/src/api-public/services/manager.js +8 -12
  116. package/src/api-public/services/manager.js.map +1 -1
  117. package/src/api-public/services/manager.ts +57 -59
  118. package/src/api-public/services/model/handlePaymentTransaction.d.ts +1 -1
  119. package/src/api-public/services/model/handlePaymentTransaction.js +23 -3
  120. package/src/api-public/services/model/handlePaymentTransaction.js.map +1 -1
  121. package/src/api-public/services/model/handlePaymentTransaction.ts +25 -36
  122. package/src/api-public/services/schedule.d.ts +1 -0
  123. package/src/api-public/services/schedule.js +27 -0
  124. package/src/api-public/services/schedule.js.map +1 -1
  125. package/src/api-public/services/schedule.ts +30 -0
  126. package/src/api-public/services/shopping.d.ts +22 -2
  127. package/src/api-public/services/shopping.js +362 -90
  128. package/src/api-public/services/shopping.js.map +1 -1
  129. package/src/api-public/services/shopping.ts +481 -134
  130. package/src/api-public/services/user.d.ts +1 -0
  131. package/src/api-public/services/user.js +32 -12
  132. package/src/api-public/services/user.js.map +1 -1
  133. package/src/api-public/services/user.ts +38 -19
  134. package/src/api-public/services/workers.js +3 -3
  135. package/src/api-public/services/workers.js.map +1 -1
  136. package/src/api-public/services/workers.ts +103 -103
  137. package/src/app-project/serverless/src/modules/database.js +1 -1
  138. package/src/app-project/serverless/src/modules/database.js.map +1 -1
  139. package/src/app-project/serverless/src/modules/database.ts +171 -171
  140. package/src/controllers/template.d.ts +1 -1
  141. package/src/controllers/template.js +16 -16
  142. package/src/controllers/template.js.map +1 -1
  143. package/src/controllers/template.ts +98 -84
  144. package/src/modules/database.js +3 -1
  145. package/src/modules/database.js.map +1 -1
  146. package/src/modules/database.ts +185 -181
  147. package/src/modules/firebase.d.ts +17 -0
  148. package/src/modules/firebase.js +126 -0
  149. package/src/modules/firebase.js.map +1 -1
  150. package/src/modules/firebase.ts +169 -0
  151. package/src/public-config-initial/auto-fcm.js +8 -2
  152. package/src/public-config-initial/auto-fcm.js.map +1 -1
  153. package/src/public-config-initial/auto-fcm.ts +15 -6
  154. package/src/services/app.d.ts +2 -1
  155. package/src/services/app.js.map +1 -1
  156. package/src/services/app.ts +2 -1
  157. package/src/services/template.d.ts +3 -2
  158. package/src/services/template.js +2 -1
  159. package/src/services/template.js.map +1 -1
  160. package/src/services/template.ts +13 -20
@@ -4,7 +4,7 @@ import { GVC } from '../glitterBundle/GVController.js';
4
4
  import { ApiShop } from '../glitter-base/route/shopping.js';
5
5
  import { ApiPost } from '../glitter-base/route/post.js';
6
6
  import { ApiUser } from '../glitter-base/route/user.js';
7
- import { BgProduct, OptionsItem } from '../backend-manager/bg-product.js';
7
+ import { BgProduct } from '../backend-manager/bg-product.js';
8
8
  import { FilterOptions } from './filter-options.js';
9
9
  import { BgListComponent } from '../backend-manager/bg-list-component.js';
10
10
  import { Tool } from '../modules/tool.js';
@@ -110,439 +110,430 @@ export class ShoppingProductSetting {
110
110
  (window.parent as any).glitter.share.checkData = () => true;
111
111
  vm.tableId = gvc.glitter.getUUID();
112
112
  vm.dataList = [];
113
- const vmlist = {
114
- id: glitter.getUUID(),
115
- loading: true,
116
- collections: [] as OptionsItem[],
117
- };
113
+
118
114
  return gvc.bindView({
119
- bind: vmlist.id,
115
+ bind: glitter.getUUID(),
120
116
  view: () => {
121
- if (vmlist.loading) {
122
- return '';
123
- } else {
124
- if (FilterOptions.productFunnel.findIndex(item => item.key === 'collection') === -1) {
125
- FilterOptions.productFunnel.push({
126
- key: 'collection',
127
- type: 'multi_checkbox',
128
- name: '商品分類',
129
- data: vmlist.collections.map(item => {
130
- return {
131
- key: `${item.key}`,
132
- name: item.value,
117
+ return BgWidget.container(html`
118
+ <div class="title-container">
119
+ ${BgWidget.title(
120
+ (() => {
121
+ const titleMap = {
122
+ addProduct: '加購品',
123
+ giveaway: '贈品',
124
+ product: '商品列表',
125
+ hidden: '隱形賣場商品',
133
126
  };
134
- }),
135
- });
136
- }
137
- return BgWidget.container(html`
138
- <div class="title-container">
139
- ${BgWidget.title(
140
- (() => {
141
- const titleMap = {
142
- addProduct: '加購品',
143
- giveaway: '贈品',
144
- product: '商品列表',
145
- hidden: '隱形賣場商品',
146
- };
147
-
148
- return titleMap[type] || '';
149
- })()
150
- )}
151
- <div class="flex-fill"></div>
152
- <div style="display: flex; gap: 10px;">
153
- ${[
154
- BgWidget.grayButton(
155
- '匯入',
156
- gvc.event(() => {
157
- ProductExcel.importDialog(gvc, () => gvc.notifyDataChange(vm.id));
158
- })
159
- ),
160
- BgWidget.grayButton(
161
- '匯出',
162
- gvc.event(() => {
163
- ProductExcel.exportDialog(gvc, type, vm.apiJSON, vm.checkedData);
164
- })
165
- ),
166
- BgWidget.darkButton(
167
- '新增',
168
- gvc.event(() => {
169
- // 設置默認語言
170
- ShoppingProductSetting.select_language = (
171
- window.parent as any
172
- )?.store_info?.language_setting?.def;
173
-
174
- // 獲取支援的產品類別
175
- const supportProducts = ShoppingProductSetting.getSupportProductCategory();
176
-
177
- // 如果只有一種或沒有產品類別,直接設置並返回
178
- if (supportProducts.length <= 1) {
179
- ShoppingProductSetting.select_product_type = (supportProducts[0]?.key || '') as any;
180
- vm.type = 'add';
181
- return;
182
- }
183
127
 
184
- // 設置默認選中的產品類型
185
- ShoppingProductSetting.select_product_type = supportProducts[0].key as any;
186
-
187
- // 顯示選擇商品類型的對話框
188
- BgWidget.settingDialog({
189
- gvc: gvc,
190
- title: '選擇商品類型',
191
- innerHTML: (gvc: GVC) => {
192
- return html`
193
- <div class="d-flex align-items-center">
194
- ${BgWidget.select({
195
- gvc: gvc,
196
- callback: data => {
197
- ShoppingProductSetting.select_product_type = data as any;
198
- },
199
- options: supportProducts,
200
- default: ShoppingProductSetting.select_product_type,
201
- })}
202
- </div>
203
- `;
204
- },
205
- footer_html: (gvc: GVC) => {
206
- return BgWidget.save(
207
- gvc.event(() => {
208
- vm.type = 'add';
209
- gvc.closeDialog();
210
- }),
211
- '下一步'
212
- );
213
- },
214
- width: 300,
215
- });
216
- }),
217
- {
218
- class: `guide5-3`,
128
+ return titleMap[type] || '';
129
+ })()
130
+ )}
131
+ <div class="flex-fill"></div>
132
+ <div style="display: flex; gap: 10px;">
133
+ ${[
134
+ BgWidget.grayButton(
135
+ '匯入',
136
+ gvc.event(() => {
137
+ ProductExcel.importDialog(gvc, () => gvc.notifyDataChange(vm.id));
138
+ })
139
+ ),
140
+ BgWidget.grayButton(
141
+ '匯出',
142
+ gvc.event(() => {
143
+ ProductExcel.exportDialog(gvc, type, vm.apiJSON, vm.checkedData);
144
+ })
145
+ ),
146
+ BgWidget.darkButton(
147
+ '新增',
148
+ gvc.event(() => {
149
+ // 設置默認語言
150
+ ShoppingProductSetting.select_language = (
151
+ window.parent as any
152
+ )?.store_info?.language_setting?.def;
153
+
154
+ // 獲取支援的產品類別
155
+ const supportProducts = ShoppingProductSetting.getSupportProductCategory();
156
+
157
+ // 如果只有一種或沒有產品類別,直接設置並返回
158
+ if (supportProducts.length <= 1) {
159
+ ShoppingProductSetting.select_product_type = (supportProducts[0]?.key || '') as any;
160
+ vm.type = 'add';
161
+ return;
219
162
  }
220
- ),
221
- ].join('')}
222
- </div>
223
- </div>
224
- ${BgWidget.container(
225
- BgWidget.mainCard(
226
- [
227
- (() => {
228
- const id = gvc.glitter.getUUID();
229
- return gvc.bindView({
230
- bind: id,
231
- view: () => {
232
- const filterList = [
233
- BgWidget.selectFilter({
234
- gvc,
235
- callback: (value: any) => {
236
- vm.queryType = value;
237
- gvc.notifyDataChange(vm.tableId);
238
- gvc.notifyDataChange(id);
239
- },
240
- default: vm.queryType || 'title',
241
- options: FilterOptions.productSelect,
242
- style: 'min-width: 160px;',
243
- }),
244
- BgWidget.searchFilter(
245
- gvc.event(e => {
246
- vm.query = `${e.value}`.trim();
247
- gvc.notifyDataChange(vm.tableId);
248
- gvc.notifyDataChange(id);
249
- }),
250
- vm.query || '',
251
- '搜尋'
252
- ),
253
- BgWidget.funnelFilter({
254
- gvc,
255
- callback: () => ListComp.showRightMenu(FilterOptions.productFunnel),
256
- }),
257
- BgWidget.updownFilter({
258
- gvc,
259
- callback: (value: any) => {
260
- vm.orderString = value;
261
- gvc.notifyDataChange(vm.tableId);
262
- gvc.notifyDataChange(id);
263
- },
264
- default: vm.orderString || 'default',
265
- options: FilterOptions.productListOrderBy,
266
- }),
267
- ];
268
163
 
269
- const filterTags = ListComp.getFilterTags(FilterOptions.productFunnel);
270
- return BgListComponent.listBarRWD(filterList, filterTags);
164
+ // 設置默認選中的產品類型
165
+ ShoppingProductSetting.select_product_type = supportProducts[0].key as any;
166
+
167
+ // 顯示選擇商品類型的對話框
168
+ BgWidget.settingDialog({
169
+ gvc: gvc,
170
+ title: '選擇商品類型',
171
+ innerHTML: (gvc: GVC) => {
172
+ return html`
173
+ <div class="d-flex align-items-center">
174
+ ${BgWidget.select({
175
+ gvc: gvc,
176
+ callback: data => {
177
+ ShoppingProductSetting.select_product_type = data as any;
178
+ },
179
+ options: supportProducts,
180
+ default: ShoppingProductSetting.select_product_type,
181
+ })}
182
+ </div>
183
+ `;
184
+ },
185
+ footer_html: (gvc: GVC) => {
186
+ return BgWidget.save(
187
+ gvc.event(() => {
188
+ vm.type = 'add';
189
+ gvc.closeDialog();
190
+ }),
191
+ '下一步'
192
+ );
271
193
  },
194
+ width: 300,
272
195
  });
273
- })(),
274
- gvc.bindView({
275
- bind: vm.tableId,
276
- view: () => {
277
- const limit = 20;
278
- return BgWidget.tableV3({
279
- gvc: gvc,
280
- getData: vmi => {
281
- function loop() {
282
- vm.apiJSON = {
283
- page: vmi.page - 1,
284
- limit: limit,
285
- search: vm.query || undefined,
286
- searchType: vm.queryType || undefined,
287
- orderBy: vm.orderString || undefined,
288
- status: (() => {
289
- if (vm.filter.status && vm.filter.status.length > 0) {
290
- return vm.filter.status.join(',');
291
- }
292
- return undefined;
293
- })(),
294
- channel: (() => {
295
- if (vm.filter.channel && vm.filter.channel.length > 0) {
296
- return vm.filter.channel.join(',');
297
- }
298
- return undefined;
299
- })(),
300
- filter_visible: `${type !== 'hidden'}`,
301
- collection: vm.filter.collection,
302
- accurate_search_collection: true,
303
- productType: type === 'hidden' ? 'product' : type,
304
- };
305
- ApiShop.getProduct(vm.apiJSON).then(data => {
306
- function getDatalist() {
307
- return data.response.data.map((dd: any) => {
308
- return [
309
- {
310
- key: '商品',
311
- value: html` <div class="d-flex align-items-center">
312
- ${BgWidget.validImageBox({
313
- gvc: gvc,
314
- image: dd.content.preview_image[0],
315
- width: 40,
316
- class: 'rounded border me-2',
317
- })}
318
- <div class="d-flex flex-column" style="">
319
- ${dd.content.shopee_id
320
- ? `<div style="margin-bottom: -10px;"><div class="insignia" style="background: orangered;color: white;">蝦皮</div></div>
321
- `
322
- : ``}
323
- <div>${Tool.truncateString(dd.content.title)}</div>
324
- </div>
325
- </div>`,
326
- },
327
- {
328
- key: '售價',
329
- value: (() => {
330
- const numArray = (dd.content.variants ?? [])
331
- .map((dd: any) => {
332
- return parseInt(`${dd.sale_price}`, 10);
333
- })
334
- .filter((dd: any) => {
335
- return !isNaN(dd);
336
- });
337
- if (numArray.length == 0) {
338
- return '尚未設定';
339
- }
340
- return `$ ${Math.min(...numArray).toLocaleString()}`;
341
- })(),
342
- },
343
- {
344
- key: '庫存',
345
- value: (() => {
346
- let sum = 0;
347
- let countStock = 0;
348
- dd.content.variants.forEach((variant: any) => {
349
- if (variant.show_understocking == 'true') {
350
- countStock++;
351
- sum += variant.stock;
352
- }
196
+ }),
197
+ {
198
+ class: `guide5-3`,
199
+ }
200
+ ),
201
+ ].join('')}
202
+ </div>
203
+ </div>
204
+ ${BgWidget.container(
205
+ BgWidget.mainCard(
206
+ [
207
+ (() => {
208
+ const id = gvc.glitter.getUUID();
209
+ return gvc.bindView({
210
+ bind: id,
211
+ view: async () => {
212
+ const productFunnel = await FilterOptions.getProductFunnel();
213
+
214
+ const filterList = [
215
+ BgWidget.selectFilter({
216
+ gvc,
217
+ callback: (value: any) => {
218
+ vm.queryType = value;
219
+ gvc.notifyDataChange(vm.tableId);
220
+ gvc.notifyDataChange(id);
221
+ },
222
+ default: vm.queryType || 'title',
223
+ options: FilterOptions.productSelect,
224
+ style: 'min-width: 160px;',
225
+ }),
226
+ BgWidget.searchFilter(
227
+ gvc.event(e => {
228
+ vm.query = `${e.value}`.trim();
229
+ gvc.notifyDataChange(vm.tableId);
230
+ gvc.notifyDataChange(id);
231
+ }),
232
+ vm.query || '',
233
+ '搜尋'
234
+ ),
235
+ BgWidget.funnelFilter({
236
+ gvc,
237
+ callback: () => ListComp.showRightMenu(productFunnel),
238
+ }),
239
+ BgWidget.updownFilter({
240
+ gvc,
241
+ callback: (value: any) => {
242
+ vm.orderString = value;
243
+ gvc.notifyDataChange(vm.tableId);
244
+ gvc.notifyDataChange(id);
245
+ },
246
+ default: vm.orderString || 'default',
247
+ options: FilterOptions.productListOrderBy,
248
+ }),
249
+ ];
250
+
251
+ const filterTags = ListComp.getFilterTags(productFunnel);
252
+ return BgListComponent.listBarRWD(filterList, filterTags);
253
+ },
254
+ });
255
+ })(),
256
+ gvc.bindView({
257
+ bind: vm.tableId,
258
+ view: () => {
259
+ const limit = 20;
260
+ return BgWidget.tableV3({
261
+ gvc: gvc,
262
+ getData: vmi => {
263
+ function loop() {
264
+ vm.apiJSON = {
265
+ page: vmi.page - 1,
266
+ limit: limit,
267
+ search: vm.query || undefined,
268
+ searchType: vm.queryType || undefined,
269
+ orderBy: vm.orderString || undefined,
270
+ status: (() => {
271
+ if (vm.filter.status && vm.filter.status.length > 0) {
272
+ return vm.filter.status.join(',');
273
+ }
274
+ return undefined;
275
+ })(),
276
+ channel: (() => {
277
+ if (vm.filter.channel && vm.filter.channel.length > 0) {
278
+ return vm.filter.channel.join(',');
279
+ }
280
+ return undefined;
281
+ })(),
282
+ filter_visible: `${type !== 'hidden'}`,
283
+ collection: vm.filter.collection,
284
+ accurate_search_collection: true,
285
+ productType: type === 'hidden' ? 'product' : type,
286
+ general_tag: (() => {
287
+ if (vm.filter.general_tag && vm.filter.general_tag.length > 0) {
288
+ return vm.filter.general_tag.join(',');
289
+ }
290
+ return undefined;
291
+ })(),
292
+ manager_tag: (() => {
293
+ if (vm.filter.manager_tag && vm.filter.manager_tag.length > 0) {
294
+ return vm.filter.manager_tag.join(',');
295
+ }
296
+ return undefined;
297
+ })(),
298
+ };
299
+ ApiShop.getProduct(vm.apiJSON).then(data => {
300
+ function getDatalist() {
301
+ return data.response.data.map((dd: any) => {
302
+ return [
303
+ {
304
+ key: '商品',
305
+ value: html` <div class="d-flex align-items-center">
306
+ ${BgWidget.validImageBox({
307
+ gvc: gvc,
308
+ image: dd.content.preview_image[0],
309
+ width: 40,
310
+ class: 'rounded border me-2',
311
+ })}
312
+ <div class="d-flex flex-column" style="">
313
+ ${dd.content.shopee_id
314
+ ? html`<div style="margin-bottom: -10px;">
315
+ <div
316
+ class="insignia"
317
+ style="background: orangered;color: white;"
318
+ >
319
+ 蝦皮
320
+ </div>
321
+ </div> `
322
+ : ''}
323
+ <div>${Tool.truncateString(dd.content.title)}</div>
324
+ </div>
325
+ </div>`,
326
+ },
327
+ {
328
+ key: '售價',
329
+ value: (() => {
330
+ const numArray = (dd.content.variants ?? [])
331
+ .map((dd: any) => {
332
+ return parseInt(`${dd.sale_price}`, 10);
333
+ })
334
+ .filter((dd: any) => {
335
+ return !isNaN(dd);
353
336
  });
354
- // const sum = dd.content.variants.reduce((acc: any, curr: any) => acc + curr.stock, 0);
355
- if (countStock == 0) {
356
- return html` 無追蹤庫存 `;
337
+ if (numArray.length == 0) {
338
+ return '尚未設定';
339
+ }
340
+ return `$ ${Math.min(...numArray).toLocaleString()}`;
341
+ })(),
342
+ },
343
+ {
344
+ key: '庫存',
345
+ value: (() => {
346
+ let sum = 0;
347
+ let countStock = 0;
348
+ dd.content.variants.forEach((variant: any) => {
349
+ if (variant.show_understocking == 'true') {
350
+ countStock++;
351
+ sum += variant.stock;
357
352
  }
358
- return html`${countStock}個子類
359
- ${sum > 1
360
- ? `有${sum}件庫存`
361
- : html` <span style="color:#8E0E2B">有${sum} 件庫存</span>`}`;
362
- })(),
363
- },
364
- {
365
- key: '已售出',
366
- value: (dd.total_sales ?? '0').toLocaleString(),
367
- },
368
- {
369
- key: '狀態',
370
- value: gvc.bindView(() => {
371
- const id = gvc.glitter.getUUID();
372
- return {
373
- bind: id,
374
- view: () => {
375
- return ShoppingProductSetting.getOnboardStatus(dd.content);
376
- },
377
- divCreate: {
378
- style: 'min-width: 60px;',
379
- option: [
380
- {
381
- key: 'onclick',
382
- value: gvc.event((e, event) => {
383
- event.stopPropagation();
384
- }),
385
- },
386
- ],
387
- },
388
- };
389
- }),
390
- },
391
- ].map(dd => {
392
- dd.value = html` <div style="line-height:40px;">${dd.value}</div>`;
393
- return dd;
394
- });
353
+ });
354
+ // const sum = dd.content.variants.reduce((acc: any, curr: any) => acc + curr.stock, 0);
355
+ if (countStock == 0) {
356
+ return html` 無追蹤庫存 `;
357
+ }
358
+ return html`${countStock}個子類
359
+ ${sum > 1
360
+ ? `有${sum}件庫存`
361
+ : html` <span style="color:#8E0E2B">有${sum} 件庫存</span>`}`;
362
+ })(),
363
+ },
364
+ {
365
+ key: '已售出',
366
+ value: (dd.total_sales ?? '0').toLocaleString(),
367
+ },
368
+ {
369
+ key: '狀態',
370
+ value: gvc.bindView(() => {
371
+ const id = gvc.glitter.getUUID();
372
+ return {
373
+ bind: id,
374
+ view: () => {
375
+ return ShoppingProductSetting.getOnboardStatus(dd.content);
376
+ },
377
+ divCreate: {
378
+ style: 'min-width: 60px;',
379
+ option: [
380
+ {
381
+ key: 'onclick',
382
+ value: gvc.event((e, event) => {
383
+ event.stopPropagation();
384
+ }),
385
+ },
386
+ ],
387
+ },
388
+ };
389
+ }),
390
+ },
391
+ ].map(dd => {
392
+ dd.value = html` <div style="line-height:40px;">${dd.value}</div>`;
393
+ return dd;
395
394
  });
396
- }
395
+ });
396
+ }
397
+
398
+ vm.dataList = data.response.data;
399
+ vmi.pageSize = Math.ceil(data.response.total / limit);
400
+ vmi.originalData = vm.dataList;
401
+ vmi.tableData = getDatalist();
402
+ vmi.loading = false;
403
+ if (
404
+ ShoppingProductSetting.select_page_index !== vmi.page - 1 &&
405
+ ShoppingProductSetting.select_page_index <= vmi.pageSize
406
+ ) {
407
+ vmi.page = ShoppingProductSetting.select_page_index + 1;
408
+ loop();
409
+ } else {
410
+ ShoppingProductSetting.select_page_index = vmi.page - 1;
411
+ vmi.callback();
412
+ }
413
+ });
414
+ }
397
415
 
398
- vm.dataList = data.response.data;
399
- vmi.pageSize = Math.ceil(data.response.total / limit);
400
- vmi.originalData = vm.dataList;
401
- vmi.tableData = getDatalist();
402
- vmi.loading = false;
403
- if (
404
- ShoppingProductSetting.select_page_index !== vmi.page - 1 &&
405
- ShoppingProductSetting.select_page_index <= vmi.pageSize
406
- ) {
407
- vmi.page = ShoppingProductSetting.select_page_index + 1;
408
- loop();
409
- } else {
410
- ShoppingProductSetting.select_page_index = vmi.page - 1;
411
- vmi.callback();
412
- }
413
- });
414
- }
416
+ loop();
417
+ },
418
+ rowClick: (data, index) => {
419
+ vm.replaceData = vm.dataList[index].content;
420
+ ShoppingProductSetting.select_language = (
421
+ window.parent as any
422
+ ).store_info.language_setting.def;
423
+ vm.type = 'replace';
424
+ },
425
+ tabClick: vmi => {
426
+ ShoppingProductSetting.select_page_index = vmi.page - 1;
427
+ },
428
+ filter: [
429
+ {
430
+ name: '上架',
431
+ event: checkedData => {
432
+ const selCount = checkedData.length;
433
+ dialog.dataLoading({ visible: true });
434
+ new Promise<void>(resolve => {
435
+ let n = 0;
436
+ checkedData.map((dd: any) => {
437
+ dd.content.active_schedule = this.getActiveDatetime();
438
+ dd.content.status = 'active';
439
+
440
+ async function run() {
441
+ return ApiPost.put({
442
+ postData: dd.content,
443
+ token: (window.parent as any).config.token,
444
+ type: 'manager',
445
+ }).then(res => {
446
+ res.result ? n++ : run();
447
+ });
448
+ }
415
449
 
416
- loop();
417
- },
418
- rowClick: (data, index) => {
419
- vm.replaceData = vm.dataList[index].content;
420
- ShoppingProductSetting.select_language = (
421
- window.parent as any
422
- ).store_info.language_setting.def;
423
- vm.type = 'replace';
424
- },
425
- tabClick: vmi => {
426
- ShoppingProductSetting.select_page_index = vmi.page - 1;
427
- },
428
- filter: [
429
- {
430
- name: '上架',
431
- event: checkedData => {
432
- const selCount = checkedData.length;
433
- dialog.dataLoading({ visible: true });
434
- new Promise<void>(resolve => {
435
- let n = 0;
436
- checkedData.map((dd: any) => {
437
- dd.content.active_schedule = this.getActiveDatetime();
438
- dd.content.status = 'active';
439
-
440
- async function run() {
441
- return ApiPost.put({
442
- postData: dd.content,
443
- token: (window.parent as any).config.token,
444
- type: 'manager',
445
- }).then(res => {
446
- res.result ? n++ : run();
447
- });
448
- }
449
-
450
- run();
451
- });
452
- setInterval(() => {
453
- n === selCount && setTimeout(() => resolve(), 200);
454
- }, 500);
455
- }).then(() => {
456
- dialog.dataLoading({ visible: false });
457
- gvc.notifyDataChange(vm.id);
450
+ run();
458
451
  });
459
- },
460
- option: true,
452
+ setInterval(() => {
453
+ n === selCount && setTimeout(() => resolve(), 200);
454
+ }, 500);
455
+ }).then(() => {
456
+ dialog.dataLoading({ visible: false });
457
+ gvc.notifyDataChange(vm.id);
458
+ });
461
459
  },
462
- {
463
- name: '下架',
464
- event: checkedData => {
465
- const selCount = checkedData.length;
466
- dialog.dataLoading({ visible: true });
467
- new Promise<void>(resolve => {
468
- let n = 0;
469
- checkedData.map((dd: any) => {
470
- dd.content.active_schedule = this.getInactiveDatetime();
471
- dd.content.status = 'active';
472
-
473
- async function run() {
474
- return ApiPost.put({
475
- postData: dd.content,
476
- token: (window.parent as any).config.token,
477
- type: 'manager',
478
- }).then(res => {
479
- res.result ? n++ : run();
480
- });
481
- }
482
-
483
- run();
484
- });
485
- setInterval(() => {
486
- n === selCount && setTimeout(() => resolve(), 200);
487
- }, 500);
488
- }).then(() => {
489
- dialog.dataLoading({ visible: false });
490
- gvc.notifyDataChange(vm.id);
460
+ option: true,
461
+ },
462
+ {
463
+ name: '下架',
464
+ event: checkedData => {
465
+ const selCount = checkedData.length;
466
+ dialog.dataLoading({ visible: true });
467
+ new Promise<void>(resolve => {
468
+ let n = 0;
469
+ checkedData.map((dd: any) => {
470
+ dd.content.active_schedule = this.getInactiveDatetime();
471
+ dd.content.status = 'active';
472
+
473
+ async function run() {
474
+ return ApiPost.put({
475
+ postData: dd.content,
476
+ token: (window.parent as any).config.token,
477
+ type: 'manager',
478
+ }).then(res => {
479
+ res.result ? n++ : run();
480
+ });
481
+ }
482
+
483
+ run();
491
484
  });
492
- },
493
- option: true,
485
+ setInterval(() => {
486
+ n === selCount && setTimeout(() => resolve(), 200);
487
+ }, 500);
488
+ }).then(() => {
489
+ dialog.dataLoading({ visible: false });
490
+ gvc.notifyDataChange(vm.id);
491
+ });
494
492
  },
495
- {
496
- name: '刪除',
497
- event: checkedData => {
498
- dialog.checkYesOrNot({
499
- text: '是否確認刪除所選項目?',
500
- callback: response => {
501
- if (response) {
502
- dialog.dataLoading({ visible: true });
503
- ApiShop.delete({
504
- id: checkedData
505
- .map((dd: any) => {
506
- return dd.id;
507
- })
508
- .join(`,`),
509
- }).then(res => {
510
- dialog.dataLoading({ visible: false });
511
- if (res.result) {
512
- vm.dataList = undefined;
513
- gvc.notifyDataChange(vm.id);
514
- } else {
515
- dialog.errorMessage({
516
- text: '刪除失敗',
517
- });
518
- }
519
- });
520
- }
521
- },
522
- });
523
- },
493
+ option: true,
494
+ },
495
+ {
496
+ name: '刪除',
497
+ event: checkedData => {
498
+ dialog.checkYesOrNot({
499
+ text: '是否確認刪除所選項目?',
500
+ callback: response => {
501
+ if (response) {
502
+ dialog.dataLoading({ visible: true });
503
+ ApiShop.delete({
504
+ id: checkedData
505
+ .map((dd: any) => {
506
+ return dd.id;
507
+ })
508
+ .join(`,`),
509
+ }).then(res => {
510
+ dialog.dataLoading({ visible: false });
511
+ if (res.result) {
512
+ vm.dataList = undefined;
513
+ gvc.notifyDataChange(vm.id);
514
+ } else {
515
+ dialog.errorMessage({
516
+ text: '刪除失敗',
517
+ });
518
+ }
519
+ });
520
+ }
521
+ },
522
+ });
524
523
  },
525
- ],
526
- filterCallback: (dataArray: any) => {
527
- vm.checkedData = dataArray;
528
524
  },
529
- });
530
- },
531
- }),
532
- ].join('')
533
- )
534
- )}
535
- ${BgWidget.minHeightContainer(240)}
536
- `);
537
- }
538
- },
539
- onCreate: () => {
540
- if (vmlist.loading) {
541
- BgProduct.getCollectionAllOpts(vmlist.collections, () => {
542
- vmlist.loading = false;
543
- gvc.notifyDataChange(vmlist.id);
544
- });
545
- }
525
+ ],
526
+ filterCallback: (dataArray: any) => {
527
+ vm.checkedData = dataArray;
528
+ },
529
+ });
530
+ },
531
+ }),
532
+ ].join('')
533
+ )
534
+ )}
535
+ ${BgWidget.minHeightContainer(240)}
536
+ `);
546
537
  },
547
538
  });
548
539
  case 'replace':