ts-glitter 20.4.6 → 20.4.8

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 (126) hide show
  1. package/lowcode/Entry.js +1 -1
  2. package/lowcode/Entry.ts +1 -1
  3. package/lowcode/backend-manager/bg-widget.js +19 -17
  4. package/lowcode/backend-manager/bg-widget.ts +19 -17
  5. package/lowcode/cms-plugin/stock-history.js +1 -0
  6. package/lowcode/cms-plugin/stock-history.ts +10 -0
  7. package/lowcode/cms-plugin/user/user-module.js +28 -28
  8. package/lowcode/cms-plugin/user/user-module.ts +29 -31
  9. package/lowcode/cms-plugin/user-list.js +55 -42
  10. package/lowcode/cms-plugin/user-list.ts +71 -47
  11. package/lowcode/glitter-base/route/progress.js +32 -0
  12. package/lowcode/glitter-base/route/progress.ts +36 -0
  13. package/lowcode/glitter-base/route/user.js +37 -1
  14. package/lowcode/glitter-base/route/user.ts +40 -1
  15. package/lowcode/glitterBundle/dialog/ShareDialog.ts +0 -1
  16. package/package.json +3 -1
  17. package/src/api-public/controllers/ai-chat.js.map +1 -1
  18. package/src/api-public/controllers/app-release.js.map +1 -1
  19. package/src/api-public/controllers/delivery.js.map +1 -1
  20. package/src/api-public/controllers/graph-api.js.map +1 -1
  21. package/src/api-public/controllers/index.js +9 -8
  22. package/src/api-public/controllers/index.js.map +1 -1
  23. package/src/api-public/controllers/index.ts +171 -169
  24. package/src/api-public/controllers/lambda.js.map +1 -1
  25. package/src/api-public/controllers/manager.js.map +1 -1
  26. package/src/api-public/controllers/post.js.map +1 -1
  27. package/src/api-public/controllers/progress.d.ts +3 -0
  28. package/src/api-public/controllers/progress.js +29 -0
  29. package/src/api-public/controllers/progress.js.map +1 -0
  30. package/src/api-public/controllers/progress.ts +25 -0
  31. package/src/api-public/controllers/sql_api.js.map +1 -1
  32. package/src/api-public/controllers/track.js.map +1 -1
  33. package/src/api-public/controllers/user.js +47 -1
  34. package/src/api-public/controllers/user.js.map +1 -1
  35. package/src/api-public/controllers/user.ts +44 -3
  36. package/src/api-public/services/checkout.d.ts +1 -0
  37. package/src/api-public/services/checkout.js +16 -6
  38. package/src/api-public/services/checkout.js.map +1 -1
  39. package/src/api-public/services/checkout.ts +28 -18
  40. package/src/api-public/services/customer-sessions.js.map +1 -1
  41. package/src/api-public/services/fake-data-model/fake-order.d.ts +6 -1
  42. package/src/api-public/services/fake-data-model/fake-order.js +159 -155
  43. package/src/api-public/services/fake-data-model/fake-order.js.map +1 -1
  44. package/src/api-public/services/fake-data-model/fake-order.ts +186 -179
  45. package/src/api-public/services/fake-data-model/fake-product.js +94 -94
  46. package/src/api-public/services/fake-data-model/fake-product.js.map +1 -1
  47. package/src/api-public/services/fake-data-model/fake-product.ts +109 -114
  48. package/src/api-public/services/fake-data-model/fake-user.d.ts +17 -1
  49. package/src/api-public/services/fake-data-model/fake-user.js +70 -384
  50. package/src/api-public/services/fake-data-model/fake-user.js.map +1 -1
  51. package/src/api-public/services/fake-data-model/fake-user.ts +111 -394
  52. package/src/api-public/services/initial-fake-data.js +50 -10
  53. package/src/api-public/services/initial-fake-data.js.map +1 -1
  54. package/src/api-public/services/initial-fake-data.ts +92 -22
  55. package/src/api-public/services/invoice.js.map +1 -1
  56. package/src/api-public/services/manager.js.map +1 -1
  57. package/src/api-public/services/notify.js +234 -213
  58. package/src/api-public/services/notify.js.map +1 -1
  59. package/src/api-public/services/notify.ts +520 -494
  60. package/src/api-public/services/phone-verify.js +1 -1
  61. package/src/api-public/services/phone-verify.js.map +1 -1
  62. package/src/api-public/services/phone-verify.ts +1 -1
  63. package/src/api-public/services/pos.js.map +1 -1
  64. package/src/api-public/services/post.js.map +1 -1
  65. package/src/api-public/services/rebate.d.ts +1 -0
  66. package/src/api-public/services/rebate.js +15 -8
  67. package/src/api-public/services/rebate.js.map +1 -1
  68. package/src/api-public/services/rebate.ts +24 -15
  69. package/src/api-public/services/recommend.js.map +1 -1
  70. package/src/api-public/services/schedule.js +7 -4
  71. package/src/api-public/services/schedule.js.map +1 -1
  72. package/src/api-public/services/schedule.ts +344 -335
  73. package/src/api-public/services/shopee.js.map +1 -1
  74. package/src/api-public/services/shopping.d.ts +1 -1
  75. package/src/api-public/services/shopping.js +28 -25
  76. package/src/api-public/services/shopping.js.map +1 -1
  77. package/src/api-public/services/shopping.ts +89 -76
  78. package/src/api-public/services/stock.js.map +1 -1
  79. package/src/api-public/services/user.d.ts +10 -1
  80. package/src/api-public/services/user.js +245 -42
  81. package/src/api-public/services/user.js.map +1 -1
  82. package/src/api-public/services/user.ts +325 -45
  83. package/src/api-public/services/voucher.js.map +1 -1
  84. package/src/api-public/services/workers.js.map +1 -1
  85. package/src/api-public/utils/ut-permission.d.ts +0 -1
  86. package/src/api-public/utils/ut-permission.js.map +1 -1
  87. package/src/config.d.ts +2 -1
  88. package/src/config.js +2 -1
  89. package/src/config.js.map +1 -1
  90. package/src/config.ts +142 -142
  91. package/src/controllers/app.js.map +1 -1
  92. package/src/controllers/backend-server.js.map +1 -1
  93. package/src/controllers/filemanager.js.map +1 -1
  94. package/src/controllers/index.js.map +1 -1
  95. package/src/controllers/user.js.map +1 -1
  96. package/src/domain-check.js.map +1 -1
  97. package/src/index.js.map +1 -1
  98. package/src/index.ts +3 -12
  99. package/src/modules/AWSLib.js +2 -3
  100. package/src/modules/AWSLib.js.map +1 -1
  101. package/src/modules/database.d.ts +1 -2
  102. package/src/modules/database.js.map +1 -1
  103. package/src/modules/firebase.js.map +1 -1
  104. package/src/modules/logger.js.map +1 -1
  105. package/src/modules/redis.d.ts +1 -1
  106. package/src/modules/redis.js.map +1 -1
  107. package/src/run.js +1 -2
  108. package/src/run.js.map +1 -1
  109. package/src/services/backend-service.js.map +1 -1
  110. package/src/services/create-instance.js +3 -4
  111. package/src/services/create-instance.js.map +1 -1
  112. package/src/services/global-event.js.map +1 -1
  113. package/src/services/ios-release.js.map +1 -1
  114. package/src/services/page.js.map +1 -1
  115. package/src/services/private_config.js.map +1 -1
  116. package/src/services/release.js.map +1 -1
  117. package/src/services/seo.js.map +1 -1
  118. package/src/services/tool.js +2 -3
  119. package/src/services/tool.js.map +1 -1
  120. package/src/services/user.js.map +1 -1
  121. package/src/services/web-socket.js.map +1 -1
  122. package/src/update-progress-track.d.ts +14 -0
  123. package/src/update-progress-track.js +28 -0
  124. package/src/update-progress-track.js.map +1 -0
  125. package/src/update-progress-track.ts +34 -0
  126. package/j4enepo67p.json +0 -1
package/lowcode/Entry.js CHANGED
@@ -144,7 +144,7 @@ export class Entry {
144
144
  }
145
145
  window.renderClock = (_b = window.renderClock) !== null && _b !== void 0 ? _b : createClock();
146
146
  console.log(`Entry-time:`, window.renderClock.stop());
147
- glitter.share.editerVersion = 'V_20.4.6';
147
+ glitter.share.editerVersion = 'V_20.4.8';
148
148
  glitter.share.start = new Date();
149
149
  const vm = { appConfig: [] };
150
150
  window.saasConfig = {
package/lowcode/Entry.ts CHANGED
@@ -146,7 +146,7 @@ export class Entry {
146
146
  }
147
147
  (window as any).renderClock = (window as any).renderClock ?? createClock();
148
148
  console.log(`Entry-time:`, (window as any).renderClock.stop());
149
- glitter.share.editerVersion = 'V_20.4.6';
149
+ glitter.share.editerVersion = 'V_20.4.8';
150
150
  glitter.share.start = new Date();
151
151
  const vm = { appConfig: [] };
152
152
  (window as any).saasConfig = {
@@ -1661,7 +1661,6 @@ ${(_c = obj.default) !== null && _c !== void 0 ? _c : ''}</textarea
1661
1661
  pageSize: 0,
1662
1662
  tableData: [],
1663
1663
  originalData: [],
1664
- allResultData: [],
1665
1664
  callback: () => {
1666
1665
  vm.loading = false;
1667
1666
  gvc.notifyDataChange(ids.container);
@@ -1746,21 +1745,24 @@ ${(_c = obj.default) !== null && _c !== void 0 ? _c : ''}</textarea
1746
1745
  initCheckData();
1747
1746
  const selectAllObject = {
1748
1747
  gvc,
1749
- event: () => {
1750
- if (vm.limit > 0) {
1751
- vm.checkedArray = vm.allResultData.map((item, i) => {
1752
- const index = i % vm.limit;
1753
- const page = Math.ceil(i / vm.limit) + (Boolean(index) ? 0 : 1);
1754
- item.dataPin = `${page}-${index}`;
1755
- item.checked = true;
1756
- return item;
1757
- });
1758
- vm.originalData.forEach((item) => {
1759
- item.checked = true;
1760
- });
1761
- renderRowCheckbox(true);
1748
+ event: () => __awaiter(this, void 0, void 0, function* () {
1749
+ if (vm.limit > 0 && vm.allResult) {
1750
+ const allResultArray = yield vm.allResult();
1751
+ if (Array.isArray(allResultArray) && allResultArray.length > 0) {
1752
+ vm.checkedArray = allResultArray.map((item, i) => {
1753
+ const index = i % vm.limit;
1754
+ const page = Math.ceil(i / vm.limit) + (Boolean(index) ? 0 : 1);
1755
+ item.dataPin = `${page}-${index}`;
1756
+ item.checked = true;
1757
+ return item;
1758
+ });
1759
+ vm.originalData.forEach((item) => {
1760
+ item.checked = true;
1761
+ });
1762
+ renderRowCheckbox(true);
1763
+ }
1762
1764
  }
1763
- },
1765
+ }),
1764
1766
  };
1765
1767
  const cancelAllObject = {
1766
1768
  gvc,
@@ -1813,7 +1815,7 @@ ${(_c = obj.default) !== null && _c !== void 0 ? _c : ''}</textarea
1813
1815
  text: '',
1814
1816
  }),
1815
1817
  ],
1816
- allSelectCallback: vm.allResultData.length > 0 ? selectAllObject : undefined,
1818
+ allSelectCallback: vm.allResult ? selectAllObject : undefined,
1817
1819
  cancelCallback: cancelAllObject,
1818
1820
  });
1819
1821
  }
@@ -1844,7 +1846,7 @@ ${(_c = obj.default) !== null && _c !== void 0 ? _c : ''}</textarea
1844
1846
  }),
1845
1847
  count: vm.checkedArray.length,
1846
1848
  buttonList: [...inList, ...outList],
1847
- allSelectCallback: vm.allResultData.length > 0 ? selectAllObject : undefined,
1849
+ allSelectCallback: vm.allResult ? selectAllObject : undefined,
1848
1850
  cancelCallback: cancelAllObject,
1849
1851
  });
1850
1852
  }
@@ -45,7 +45,7 @@ type TableV3 = {
45
45
  originalData: any;
46
46
  callback: () => void;
47
47
  checkedArray: any[];
48
- allResultData: any[];
48
+ allResult?: () => Promise<any[]>;
49
49
  limit: number;
50
50
  };
51
51
 
@@ -1981,7 +1981,6 @@ ${obj.default ?? ''}</textarea
1981
1981
  pageSize: 0,
1982
1982
  tableData: [],
1983
1983
  originalData: [],
1984
- allResultData: [],
1985
1984
  callback: () => {
1986
1985
  vm.loading = false;
1987
1986
  gvc.notifyDataChange(ids.container);
@@ -2086,19 +2085,22 @@ ${obj.default ?? ''}</textarea
2086
2085
  // 全選物件
2087
2086
  const selectAllObject = {
2088
2087
  gvc,
2089
- event: () => {
2090
- if (vm.limit > 0) {
2091
- vm.checkedArray = vm.allResultData.map((item, i) => {
2092
- const index = i % vm.limit;
2093
- const page = Math.ceil(i / vm.limit) + (Boolean(index) ? 0 : 1);
2094
- item.dataPin = `${page}-${index}`;
2095
- item.checked = true;
2096
- return item;
2097
- });
2098
- vm.originalData.forEach((item: any) => {
2099
- item.checked = true;
2100
- });
2101
- renderRowCheckbox(true);
2088
+ event: async () => {
2089
+ if (vm.limit > 0 && vm.allResult) {
2090
+ const allResultArray = await vm.allResult();
2091
+ if (Array.isArray(allResultArray) && allResultArray.length > 0) {
2092
+ vm.checkedArray = allResultArray.map((item, i) => {
2093
+ const index = i % vm.limit;
2094
+ const page = Math.ceil(i / vm.limit) + (Boolean(index) ? 0 : 1);
2095
+ item.dataPin = `${page}-${index}`;
2096
+ item.checked = true;
2097
+ return item;
2098
+ });
2099
+ vm.originalData.forEach((item: any) => {
2100
+ item.checked = true;
2101
+ });
2102
+ renderRowCheckbox(true);
2103
+ }
2102
2104
  }
2103
2105
  },
2104
2106
  };
@@ -2162,7 +2164,7 @@ ${obj.default ?? ''}</textarea
2162
2164
  text: '',
2163
2165
  }),
2164
2166
  ],
2165
- allSelectCallback: vm.allResultData.length > 0 ? selectAllObject : undefined,
2167
+ allSelectCallback: vm.allResult ? selectAllObject : undefined,
2166
2168
  cancelCallback: cancelAllObject,
2167
2169
  });
2168
2170
  }
@@ -2201,7 +2203,7 @@ ${obj.default ?? ''}</textarea
2201
2203
  }),
2202
2204
  count: vm.checkedArray.length,
2203
2205
  buttonList: [...inList, ...outList],
2204
- allSelectCallback: vm.allResultData.length > 0 ? selectAllObject : undefined,
2206
+ allSelectCallback: vm.allResult ? selectAllObject : undefined,
2205
2207
  cancelCallback: cancelAllObject,
2206
2208
  });
2207
2209
  }
@@ -1043,6 +1043,7 @@ export class StockHistory {
1043
1043
  title: '搜尋商品',
1044
1044
  default: dvm.variantIds,
1045
1045
  callback: resultData => {
1046
+ alert(JSON.stringify(resultData));
1046
1047
  dvm.variantIds = resultData;
1047
1048
  gvc.notifyDataChange(dvm.tableId);
1048
1049
  },
@@ -12,6 +12,7 @@ import { StockVendors, VendorData } from './stock-vendors.js';
12
12
  import { CheckInput } from '../modules/checkInput.js';
13
13
  import { Tool } from '../modules/tool.js';
14
14
  import { BgProduct, OptionsItem } from '../backend-manager/bg-product.js';
15
+ import { al } from '@faker-js/faker/dist/airline-CBNP41sR.js';
15
16
 
16
17
  const html = String.raw;
17
18
 
@@ -1125,11 +1126,20 @@ export class StockHistory {
1125
1126
  class="w-100 d-flex align-items-center justify-content-center cursor_pointer"
1126
1127
  style="color: #36B; font-size: 16px; font-weight: 400;"
1127
1128
  onclick="${gvc.event(() => {
1129
+ // BgProduct.productsDialog({
1130
+ // gvc: gvc,
1131
+ // default: [],
1132
+ // with_variants:true,
1133
+ // callback: async value => {
1134
+ // alert(JSON.stringify(value))
1135
+ // },
1136
+ // })
1128
1137
  BgWidget.variantDialog({
1129
1138
  gvc,
1130
1139
  title: '搜尋商品',
1131
1140
  default: dvm.variantIds,
1132
1141
  callback: resultData => {
1142
+ alert(JSON.stringify(resultData));
1133
1143
  dvm.variantIds = resultData;
1134
1144
  gvc.notifyDataChange(dvm.tableId);
1135
1145
  },
@@ -69,6 +69,7 @@ export class UserModule {
69
69
  static addTags(obj) {
70
70
  const gvc = obj.gvc;
71
71
  const dataArray = obj.dataArray;
72
+ const dialog = new ShareDialog(gvc.glitter);
72
73
  const vmt = {
73
74
  id: gvc.glitter.getUUID(),
74
75
  loading: true,
@@ -128,15 +129,16 @@ export class UserModule {
128
129
  清除全部
129
130
  </div>`,
130
131
  BgWidget.cancel(gvc2.event(() => gvc2.closeDialog())),
131
- BgWidget.save(gvc2.event(() => __awaiter(this, void 0, void 0, function* () {
132
- dataArray.forEach((item) => {
133
- item.userData.tags = item.userData.tags
134
- ? [...new Set([...item.userData.tags, ...vmt.postData])]
135
- : vmt.postData;
132
+ BgWidget.save(gvc2.event(() => {
133
+ const ids = dataArray.map((data) => data.userID).filter(Boolean);
134
+ ApiUser.batchAddTag({ userId: ids, tags: vmt.postData }).then(() => {
135
+ dialog.successMessage({ text: '「新增標籤」更新完成' });
136
+ gvc.notifyDataChange(obj.vm.id);
136
137
  });
137
- obj.saveEvent(dataArray);
138
138
  gvc2.closeDialog();
139
- }))),
139
+ dialog.successMessage({ text: '準備開始更新資料,請稍後' });
140
+ gvc.notifyDataChange(obj.vm.progressId);
141
+ })),
140
142
  ].join('');
141
143
  },
142
144
  });
@@ -144,19 +146,13 @@ export class UserModule {
144
146
  static removeTags(obj) {
145
147
  const gvc = obj.gvc;
146
148
  const dataArray = obj.dataArray;
149
+ const dialog = new ShareDialog(gvc.glitter);
147
150
  const vmt = {
148
151
  id: gvc.glitter.getUUID(),
149
152
  loading: true,
150
153
  dataList: [],
151
154
  postData: JSON.parse(JSON.stringify([])),
152
- tagJoinList: {},
153
155
  };
154
- dataArray.forEach((item) => {
155
- const tags = item.userData.tags || [];
156
- tags.forEach((tag) => {
157
- vmt.tagJoinList[tag] = true;
158
- });
159
- });
160
156
  BgWidget.settingDialog({
161
157
  gvc,
162
158
  title: '批量刪除標籤',
@@ -180,7 +176,7 @@ export class UserModule {
180
176
  ApiUser.getPublicConfig('user_general_tags', 'manager').then((dd) => {
181
177
  var _b, _c;
182
178
  if (dd.result && ((_c = (_b = dd.response) === null || _b === void 0 ? void 0 : _b.value) === null || _c === void 0 ? void 0 : _c.list)) {
183
- vmt.dataList = dd.response.value.list.filter((item) => vmt.tagJoinList[item]);
179
+ vmt.dataList = dd.response.value.list;
184
180
  vmt.loading = false;
185
181
  gvc2.notifyDataChange(vmt.id);
186
182
  }
@@ -205,16 +201,16 @@ export class UserModule {
205
201
  清除全部
206
202
  </div>`,
207
203
  BgWidget.cancel(gvc2.event(() => gvc2.closeDialog())),
208
- BgWidget.save(gvc2.event(() => __awaiter(this, void 0, void 0, function* () {
209
- const postMap = new Map(vmt.postData.map(tag => [tag, true]));
210
- dataArray.forEach((item) => {
211
- item.userData.tags = item.userData.tags
212
- ? item.userData.tags.filter((tag) => !postMap.get(tag))
213
- : [];
204
+ BgWidget.save(gvc2.event(() => {
205
+ const ids = dataArray.map((data) => data.userID).filter(Boolean);
206
+ ApiUser.batchRemoveTag({ userId: ids, tags: vmt.postData }).then(() => {
207
+ dialog.successMessage({ text: '「移除標籤」更新完成' });
208
+ gvc.notifyDataChange(obj.vm.id);
214
209
  });
215
- obj.saveEvent(dataArray);
216
210
  gvc2.closeDialog();
217
- }))),
211
+ dialog.successMessage({ text: '準備開始更新資料,請稍後' });
212
+ gvc.notifyDataChange(obj.vm.progressId);
213
+ })),
218
214
  ].join('');
219
215
  },
220
216
  });
@@ -222,6 +218,7 @@ export class UserModule {
222
218
  static manualSetLevel(obj) {
223
219
  const gvc = obj.gvc;
224
220
  const dataArray = obj.dataArray;
221
+ const dialog = new ShareDialog(gvc.glitter);
225
222
  const levelVM = {
226
223
  id: gvc.glitter.getUUID(),
227
224
  loading: true,
@@ -239,11 +236,12 @@ export class UserModule {
239
236
  return BgWidget.spinner();
240
237
  }
241
238
  else {
239
+ levelVM.level = levelVM.options[0].key;
242
240
  return html `
243
241
  ${BgWidget.grayNote('此功能針對特殊會員,手動調整後將無法自動升級')}
244
242
  ${BgWidget.select({
245
243
  gvc: gvc2,
246
- default: levelVM.options[0].key,
244
+ default: levelVM.level,
247
245
  callback: key => {
248
246
  levelVM.level = key;
249
247
  },
@@ -276,12 +274,14 @@ export class UserModule {
276
274
  return [
277
275
  BgWidget.cancel(gvc2.event(() => gvc2.closeDialog())),
278
276
  BgWidget.save(gvc2.event(() => __awaiter(this, void 0, void 0, function* () {
279
- dataArray.forEach((item) => {
280
- item.userData.level_status = 'manual';
281
- item.userData.level_default = levelVM.level;
277
+ const ids = dataArray.map((data) => data.userID).filter(Boolean);
278
+ ApiUser.batchManualLevel({ userId: ids, level: levelVM.level }).then(() => {
279
+ dialog.successMessage({ text: '「手動修改會員標籤」更新完成' });
280
+ gvc.notifyDataChange(obj.vm.id);
282
281
  });
283
- obj.saveEvent(dataArray);
284
282
  gvc2.closeDialog();
283
+ dialog.successMessage({ text: '準備開始更新資料,請稍後' });
284
+ gvc.notifyDataChange(obj.vm.progressId);
285
285
  }))),
286
286
  ].join('');
287
287
  },
@@ -63,9 +63,10 @@ export class UserModule {
63
63
  return vmt.dataList.map((item: any) => this.printOption(gvc, vmt, { key: item, value: item })).join('');
64
64
  }
65
65
 
66
- static addTags(obj: { gvc: GVC; dataArray: any; saveEvent: (dataArray: any) => void }) {
66
+ static addTags(obj: { gvc: GVC; vm: any; dataArray: any }) {
67
67
  const gvc = obj.gvc;
68
68
  const dataArray = obj.dataArray;
69
+ const dialog = new ShareDialog(gvc.glitter);
69
70
  const vmt = {
70
71
  id: gvc.glitter.getUUID(),
71
72
  loading: true,
@@ -130,14 +131,15 @@ export class UserModule {
130
131
  </div>`,
131
132
  BgWidget.cancel(gvc2.event(() => gvc2.closeDialog())),
132
133
  BgWidget.save(
133
- gvc2.event(async () => {
134
- dataArray.forEach((item: any) => {
135
- item.userData.tags = item.userData.tags
136
- ? [...new Set([...item.userData.tags, ...vmt.postData])]
137
- : vmt.postData;
134
+ gvc2.event(() => {
135
+ const ids = dataArray.map((data: any) => data.userID).filter(Boolean);
136
+ ApiUser.batchAddTag({ userId: ids, tags: vmt.postData }).then(() => {
137
+ dialog.successMessage({ text: '「新增標籤」更新完成' });
138
+ gvc.notifyDataChange(obj.vm.id);
138
139
  });
139
- obj.saveEvent(dataArray);
140
140
  gvc2.closeDialog();
141
+ dialog.successMessage({ text: '準備開始更新資料,請稍後' });
142
+ gvc.notifyDataChange(obj.vm.progressId);
141
143
  })
142
144
  ),
143
145
  ].join('');
@@ -145,24 +147,17 @@ export class UserModule {
145
147
  });
146
148
  }
147
149
 
148
- static removeTags(obj: { gvc: GVC; dataArray: any; saveEvent: (dataArray: any) => void }) {
150
+ static removeTags(obj: { gvc: GVC; vm: any; dataArray: any }) {
149
151
  const gvc = obj.gvc;
150
152
  const dataArray = obj.dataArray;
153
+ const dialog = new ShareDialog(gvc.glitter);
151
154
  const vmt = {
152
155
  id: gvc.glitter.getUUID(),
153
156
  loading: true,
154
157
  dataList: [] as string[],
155
158
  postData: JSON.parse(JSON.stringify([])) as string[],
156
- tagJoinList: {} as Record<string, boolean>,
157
159
  };
158
160
 
159
- dataArray.forEach((item: any) => {
160
- const tags = item.userData.tags || [];
161
- tags.forEach((tag: string) => {
162
- vmt.tagJoinList[tag] = true;
163
- });
164
- });
165
-
166
161
  BgWidget.settingDialog({
167
162
  gvc,
168
163
  title: '批量刪除標籤',
@@ -184,7 +179,7 @@ export class UserModule {
184
179
  if (vmt.loading) {
185
180
  ApiUser.getPublicConfig('user_general_tags', 'manager').then((dd: any) => {
186
181
  if (dd.result && dd.response?.value?.list) {
187
- vmt.dataList = dd.response.value.list.filter((item: string) => vmt.tagJoinList[item]);
182
+ vmt.dataList = dd.response.value.list;
188
183
  vmt.loading = false;
189
184
  gvc2.notifyDataChange(vmt.id);
190
185
  } else {
@@ -209,16 +204,15 @@ export class UserModule {
209
204
  </div>`,
210
205
  BgWidget.cancel(gvc2.event(() => gvc2.closeDialog())),
211
206
  BgWidget.save(
212
- gvc2.event(async () => {
213
- const postMap: Map<string, boolean> = new Map(vmt.postData.map(tag => [tag, true]));
214
-
215
- dataArray.forEach((item: any) => {
216
- item.userData.tags = item.userData.tags
217
- ? item.userData.tags.filter((tag: string) => !postMap.get(tag))
218
- : [];
207
+ gvc2.event(() => {
208
+ const ids = dataArray.map((data: any) => data.userID).filter(Boolean);
209
+ ApiUser.batchRemoveTag({ userId: ids, tags: vmt.postData }).then(() => {
210
+ dialog.successMessage({ text: '「移除標籤」更新完成' });
211
+ gvc.notifyDataChange(obj.vm.id);
219
212
  });
220
- obj.saveEvent(dataArray);
221
213
  gvc2.closeDialog();
214
+ dialog.successMessage({ text: '準備開始更新資料,請稍後' });
215
+ gvc.notifyDataChange(obj.vm.progressId);
222
216
  })
223
217
  ),
224
218
  ].join('');
@@ -226,9 +220,10 @@ export class UserModule {
226
220
  });
227
221
  }
228
222
 
229
- static manualSetLevel(obj: { gvc: GVC; dataArray: any; saveEvent: (dataArray: any) => void }) {
223
+ static manualSetLevel(obj: { gvc: GVC; vm: any; dataArray: any }) {
230
224
  const gvc = obj.gvc;
231
225
  const dataArray = obj.dataArray;
226
+ const dialog = new ShareDialog(gvc.glitter);
232
227
  const levelVM = {
233
228
  id: gvc.glitter.getUUID(),
234
229
  loading: true,
@@ -246,11 +241,12 @@ export class UserModule {
246
241
  if (levelVM.loading) {
247
242
  return BgWidget.spinner();
248
243
  } else {
244
+ levelVM.level = levelVM.options[0].key;
249
245
  return html`
250
246
  ${BgWidget.grayNote('此功能針對特殊會員,手動調整後將無法自動升級')}
251
247
  ${BgWidget.select({
252
248
  gvc: gvc2,
253
- default: levelVM.options[0].key,
249
+ default: levelVM.level,
254
250
  callback: key => {
255
251
  levelVM.level = key;
256
252
  },
@@ -283,12 +279,14 @@ export class UserModule {
283
279
  BgWidget.cancel(gvc2.event(() => gvc2.closeDialog())),
284
280
  BgWidget.save(
285
281
  gvc2.event(async () => {
286
- dataArray.forEach((item: any) => {
287
- item.userData.level_status = 'manual';
288
- item.userData.level_default = levelVM.level;
282
+ const ids = dataArray.map((data: any) => data.userID).filter(Boolean);
283
+ ApiUser.batchManualLevel({ userId: ids, level: levelVM.level }).then(() => {
284
+ dialog.successMessage({ text: '「手動修改會員標籤」更新完成' });
285
+ gvc.notifyDataChange(obj.vm.id);
289
286
  });
290
- obj.saveEvent(dataArray);
291
287
  gvc2.closeDialog();
288
+ dialog.successMessage({ text: '準備開始更新資料,請稍後' });
289
+ gvc.notifyDataChange(obj.vm.progressId);
292
290
  })
293
291
  ),
294
292
  ].join('');
@@ -15,6 +15,7 @@ import { ShareDialog } from '../glitterBundle/dialog/ShareDialog.js';
15
15
  import { FormWidget } from '../official_view_component/official/form.js';
16
16
  import { ApiWallet } from '../glitter-base/route/wallet.js';
17
17
  import { ApiShop } from '../glitter-base/route/shopping.js';
18
+ import { ApiProgress } from '../glitter-base/route/progress.js';
18
19
  import { ShoppingOrderManager } from './shopping-order-manager.js';
19
20
  import { FilterOptions } from './filter-options.js';
20
21
  import { ShoppingRebate } from './shopping-rebate.js';
@@ -44,6 +45,7 @@ export class UserList {
44
45
  filterId: glitter.getUUID(),
45
46
  tableId: glitter.getUUID(),
46
47
  barId: glitter.getUUID(),
48
+ progressId: glitter.getUUID(),
47
49
  initial_data: {},
48
50
  group: obj && obj.group ? obj.group : undefined,
49
51
  plan: GlobalUser.getPlan().id,
@@ -171,6 +173,46 @@ export class UserList {
171
173
  }
172
174
  return BgWidget.title('顧客列表');
173
175
  })()}
176
+ ${gvc.bindView((() => {
177
+ let dataList = [];
178
+ return {
179
+ bind: vm.progressId,
180
+ view: () => {
181
+ if (dataList.length == 0) {
182
+ return '';
183
+ }
184
+ const progressMap = {
185
+ batchGetUser: '資料處理中',
186
+ batchAddtag: '新增標籤中',
187
+ batchRemovetag: '移除標籤中',
188
+ batchManualLevel: '手動修改會員等級中',
189
+ };
190
+ return dataList
191
+ .map((item) => {
192
+ const { taskTag, progress } = item;
193
+ if (Number(progress) === 100) {
194
+ return '';
195
+ }
196
+ const toFixProgress = Number(progress).toFixed(1);
197
+ return BgWidget.notifyInsignia(`${progressMap[taskTag]}: ${toFixProgress}%`);
198
+ })
199
+ .join('');
200
+ },
201
+ divCreate: {
202
+ class: 'ms-2',
203
+ },
204
+ onCreate: () => {
205
+ setTimeout(() => {
206
+ ApiProgress.getAllProgress().then(t => {
207
+ dataList = t.result && Array.isArray(t.response) ? t.response : [];
208
+ if (dataList.length > 0) {
209
+ gvc.notifyDataChange(vm.progressId);
210
+ }
211
+ });
212
+ }, 2500);
213
+ },
214
+ };
215
+ })())}
174
216
  <div class="flex-fill"></div>
175
217
  <div class="d-flex align-items-center" style="gap: 10px;">
176
218
  ${BgWidget.grayButton('匯入', gvc.event(() => UserExcel.importDialog(gvc, () => gvc.notifyDataChange(vm.id))))}
@@ -299,28 +341,6 @@ export class UserList {
299
341
  if (vm.loading) {
300
342
  return '';
301
343
  }
302
- function batchUpdateUser(checkedData) {
303
- return __awaiter(this, void 0, void 0, function* () {
304
- try {
305
- dialog.dataLoading({ visible: true });
306
- const results = yield UserModule.batchProcess(checkedData, 100);
307
- const failedUpdates = results.filter((r) => !r.result);
308
- if (failedUpdates.length > 0) {
309
- UserModule.failedUpdateDialog(gvc, failedUpdates, checkedData.length);
310
- }
311
- else {
312
- dialog.successMessage({ text: '更新成功' });
313
- }
314
- dialog.dataLoading({ visible: false });
315
- gvc.notifyDataChange(vm.id);
316
- }
317
- catch (error) {
318
- console.error('更新失敗:', error);
319
- dialog.dataLoading({ visible: false });
320
- dialog.errorMessage({ text: '更新失敗,請稍後再試' });
321
- }
322
- });
323
- }
324
344
  return BgWidget.tableV3({
325
345
  gvc: gvc,
326
346
  getData: vd => {
@@ -336,21 +356,25 @@ export class UserList {
336
356
  filter: vm.filter,
337
357
  filter_type: vm.filter_type,
338
358
  group: vm.group,
339
- all_result: true,
340
359
  };
341
360
  ApiUser.getUserListOrders(vm.apiJSON).then(data => {
342
- var _a;
343
361
  vm.dataList = data.response.data;
362
+ vmi.limit = limit;
344
363
  vmi.pageSize = Math.ceil(data.response.total / limit);
345
364
  vmi.originalData = vm.dataList;
346
- vmi.allResultData = (_a = data.response.allUsers) !== null && _a !== void 0 ? _a : [];
347
- vmi.limit = limit;
348
365
  vmi.tableData = getUserlist();
349
- vmi.loading = false;
366
+ vmi.allResult = () => __awaiter(this, void 0, void 0, function* () {
367
+ dialog.dataLoading({ visible: true });
368
+ return ApiUser.getUserListOrders(Object.assign(Object.assign({}, vm.apiJSON), { all_result: true })).then(data => {
369
+ dialog.dataLoading({ visible: false });
370
+ return data.response.allUsers;
371
+ });
372
+ });
350
373
  if (vmi.pageSize != 0 && vmi.page > vmi.pageSize) {
351
374
  UserList.vm.page = 1;
352
375
  gvc.notifyDataChange(vm.id);
353
376
  }
377
+ vmi.loading = false;
354
378
  vmi.callback();
355
379
  });
356
380
  },
@@ -363,33 +387,21 @@ export class UserList {
363
387
  name: '新增標籤',
364
388
  option: true,
365
389
  event: (dataArray) => {
366
- UserModule.addTags({
367
- gvc,
368
- dataArray,
369
- saveEvent: result => batchUpdateUser(result),
370
- });
390
+ UserModule.addTags({ gvc, vm, dataArray });
371
391
  },
372
392
  },
373
393
  {
374
394
  name: '移除標籤',
375
395
  option: true,
376
396
  event: (dataArray) => {
377
- UserModule.removeTags({
378
- gvc,
379
- dataArray,
380
- saveEvent: result => batchUpdateUser(result),
381
- });
397
+ UserModule.removeTags({ gvc, vm, dataArray });
382
398
  },
383
399
  },
384
400
  {
385
401
  name: '手動調整等級',
386
402
  option: true,
387
403
  event: (dataArray) => {
388
- UserModule.manualSetLevel({
389
- gvc,
390
- dataArray,
391
- saveEvent: result => batchUpdateUser(result),
392
- });
404
+ UserModule.manualSetLevel({ gvc, vm, dataArray });
393
405
  },
394
406
  },
395
407
  {
@@ -462,6 +474,7 @@ export class UserList {
462
474
  filterId: glitter.getUUID(),
463
475
  tableId: glitter.getUUID(),
464
476
  barId: glitter.getUUID(),
477
+ progressId: glitter.getUUID(),
465
478
  group: obj && obj.group ? obj.group : undefined,
466
479
  plan: 0,
467
480
  headerConfig: [],