ts-glitter 20.6.7 → 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 +36 -16
  132. package/src/api-public/services/user.js.map +1 -1
  133. package/src/api-public/services/user.ts +42 -23
  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
@@ -0,0 +1,2732 @@
1
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3
+ return new (P || (P = Promise))(function (resolve, reject) {
4
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
7
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
8
+ });
9
+ };
10
+ import { BgWidget } from '../backend-manager/bg-widget.js';
11
+ import { ApiUser } from '../glitter-base/route/user.js';
12
+ import { EditorElem } from '../glitterBundle/plugins/editor-elem.js';
13
+ import { ShareDialog } from '../glitterBundle/dialog/ShareDialog.js';
14
+ import { ApiPost } from '../glitter-base/route/post.js';
15
+ import { ApiFcm } from '../glitter-base/route/fcm.js';
16
+ import { FormWidget } from '../official_view_component/official/form.js';
17
+ import { Chat } from '../glitter-base/route/chat.js';
18
+ import { FilterOptions } from '../cms-plugin/filter-options.js';
19
+ import { ShoppingDiscountSetting } from '../cms-plugin/shopping-discount-setting.js';
20
+ import { ApiSmtp } from '../glitter-base/route/smtp.js';
21
+ import { BgListComponent } from '../backend-manager/bg-list-component.js';
22
+ import { Tool } from '../modules/tool.js';
23
+ const html = String.raw;
24
+ const inputStyle = 'font-size: 16px; height:40px; width:300px;';
25
+ export class BgNotify {
26
+ static email(gvc, type = 'list', callback = () => { }) {
27
+ const vm = {
28
+ type: 'list',
29
+ data: {
30
+ id: 61,
31
+ userID: 549313940,
32
+ account: 'jianzhi.wang@homee.ai',
33
+ userData: { name: '王建智', email: 'jianzhi.wang@homee.ai', phone: '0978028739' },
34
+ created_time: '2023-11-26T02:14:09.000Z',
35
+ role: 0,
36
+ company: null,
37
+ status: 1,
38
+ },
39
+ dataList: undefined,
40
+ query: '',
41
+ };
42
+ const glitter = gvc.glitter;
43
+ const filterID = glitter.getUUID();
44
+ const id = glitter.getUUID();
45
+ return gvc.bindView(() => {
46
+ return {
47
+ bind: id,
48
+ view: () => {
49
+ let vmi = undefined;
50
+ function getDatalist() {
51
+ let interval = 0;
52
+ return vm.dataList.map((dd) => {
53
+ return [
54
+ {
55
+ key: '註冊信箱',
56
+ value: `<span class="fs-7">${dd.email}</span>`,
57
+ },
58
+ {
59
+ key: '訂閱標籤',
60
+ value: `<span class="fs-7">${dd.tag}</span>`,
61
+ },
62
+ ];
63
+ });
64
+ }
65
+ return BgWidget.container(BgWidget.mainCard([
66
+ BgWidget.searchPlace(gvc.event(e => {
67
+ vm.query = e.value;
68
+ gvc.notifyDataChange(id);
69
+ }), vm.query || '', '搜尋信箱或標籤'),
70
+ BgWidget.tableV3({
71
+ gvc: gvc,
72
+ getData: vmk => {
73
+ vmi = vmk;
74
+ const limit = 20;
75
+ ApiUser.getSubScribe({
76
+ page: vmi.page - 1,
77
+ limit: limit,
78
+ search: vm.query || undefined,
79
+ filter: { account: 'no' },
80
+ }).then(data => {
81
+ vm.dataList = data.response.data;
82
+ vmi.pageSize = Math.ceil(data.response.total / limit);
83
+ vmi.originalData = vm.dataList;
84
+ vmi.tableData = getDatalist();
85
+ vmi.loading = false;
86
+ vmi.callback();
87
+ if (type === 'select') {
88
+ callback(vm.dataList.filter((dd) => {
89
+ return dd.checked;
90
+ }));
91
+ }
92
+ });
93
+ },
94
+ rowClick: (data, index) => {
95
+ vm.dataList[index].checked = !vm.dataList[index].checked;
96
+ vmi.data = getDatalist();
97
+ vmi.callback();
98
+ gvc.notifyDataChange(filterID);
99
+ callback(vm.dataList.filter((dd) => {
100
+ return dd.checked;
101
+ }));
102
+ },
103
+ filter: [
104
+ {
105
+ name: '批量移除',
106
+ event: checkedData => {
107
+ const dialog = new ShareDialog(glitter);
108
+ dialog.checkYesOrNot({
109
+ text: '是否確認刪除所選項目?',
110
+ callback: response => {
111
+ if (response) {
112
+ dialog.dataLoading({ visible: true });
113
+ ApiUser.deleteSubscribe({
114
+ email: checkedData.map((dd) => dd.email).join(`,`),
115
+ }).then(res => {
116
+ dialog.dataLoading({ visible: false });
117
+ if (res.result) {
118
+ vm.dataList = undefined;
119
+ gvc.notifyDataChange(id);
120
+ }
121
+ else {
122
+ dialog.errorMessage({ text: '刪除失敗' });
123
+ }
124
+ });
125
+ }
126
+ },
127
+ });
128
+ },
129
+ },
130
+ ],
131
+ }),
132
+ ].join('')));
133
+ },
134
+ };
135
+ });
136
+ }
137
+ static emailSetting(gvc) {
138
+ const glitter = gvc.glitter;
139
+ const vm = {
140
+ type: 'list',
141
+ data: undefined,
142
+ dataList: undefined,
143
+ query: undefined,
144
+ };
145
+ return gvc.bindView(() => {
146
+ const id = glitter.getUUID();
147
+ const filterID = glitter.getUUID();
148
+ return {
149
+ bind: id,
150
+ dataList: [{ obj: vm, key: 'type' }],
151
+ view: () => {
152
+ if (vm.type === 'list') {
153
+ return BgWidget.container(html `
154
+ <div class="title-container">
155
+ ${BgWidget.title('信件樣式')}
156
+ <div class="flex-fill"></div>
157
+ ${BgWidget.darkButton('新增', gvc.event(() => {
158
+ vm.data = undefined;
159
+ vm.type = 'add';
160
+ }))}
161
+ </div>
162
+ ${BgWidget.container(BgWidget.mainCard([
163
+ BgWidget.searchPlace(gvc.event(e => {
164
+ vm.query = e.value;
165
+ gvc.notifyDataChange(id);
166
+ }), vm.query || '', '搜尋所有信件內容'),
167
+ BgWidget.tableV3({
168
+ gvc: gvc,
169
+ getData: vmi => {
170
+ const limit = 20;
171
+ ApiPost.getManagerPost({
172
+ page: vmi.page - 1,
173
+ limit: limit,
174
+ search: vm.query ? [`title->${vm.query}`] : undefined,
175
+ type: 'notify-email-config',
176
+ }).then(data => {
177
+ function getDatalist() {
178
+ return data.response.data.map((dd) => {
179
+ return [
180
+ {
181
+ key: '標題',
182
+ value: html `<span class="fs-7">${dd.content.title}</span>`,
183
+ },
184
+ {
185
+ key: '最後更新時間',
186
+ value: dd.updated_time
187
+ ? gvc.glitter.ut.dateFormat(new Date(dd.updated_time), 'yyyy-MM-dd')
188
+ : '無',
189
+ },
190
+ ];
191
+ });
192
+ }
193
+ vm.dataList = data.response.data;
194
+ vmi.pageSize = Math.ceil(data.response.total / limit);
195
+ vmi.originalData = vm.dataList;
196
+ vmi.tableData = getDatalist();
197
+ vmi.loading = false;
198
+ vmi.callback();
199
+ });
200
+ },
201
+ rowClick: (data, index) => {
202
+ vm.data = vm.dataList[index].content;
203
+ vm.type = 'replace';
204
+ },
205
+ filter: [
206
+ {
207
+ name: '批量移除',
208
+ event: checkedData => {
209
+ const dialog = new ShareDialog(glitter);
210
+ dialog.checkYesOrNot({
211
+ text: '是否確認刪除所選項目?',
212
+ callback: response => {
213
+ if (response) {
214
+ dialog.dataLoading({ visible: true });
215
+ ApiPost.delete({
216
+ id: checkedData.map((dd) => dd.id).join(`,`),
217
+ }).then(res => {
218
+ dialog.dataLoading({ visible: false });
219
+ if (res.result) {
220
+ vm.dataList = undefined;
221
+ gvc.notifyDataChange(id);
222
+ }
223
+ else {
224
+ dialog.errorMessage({ text: '刪除失敗' });
225
+ }
226
+ });
227
+ }
228
+ },
229
+ });
230
+ },
231
+ },
232
+ ],
233
+ }),
234
+ ].join('')))}
235
+ ${BgWidget.mbContainer(120)}
236
+ `);
237
+ }
238
+ else if (vm.type == 'replace') {
239
+ return this.emailEditor({
240
+ vm: vm,
241
+ gvc: gvc,
242
+ type: 'replace',
243
+ });
244
+ }
245
+ return this.emailEditor({
246
+ vm: vm,
247
+ gvc: gvc,
248
+ type: 'add',
249
+ });
250
+ },
251
+ };
252
+ });
253
+ }
254
+ static emailHistory(gvc) {
255
+ const glitter = gvc.glitter;
256
+ const vm = {
257
+ id: glitter.getUUID(),
258
+ tableId: glitter.getUUID(),
259
+ type: 'list',
260
+ data: undefined,
261
+ dataList: undefined,
262
+ query: '',
263
+ queryType: 'email',
264
+ filter: {},
265
+ };
266
+ return gvc.bindView(() => {
267
+ const ListComp = new BgListComponent(gvc, vm, FilterOptions.emailFilterFrame);
268
+ vm.filter = ListComp.getFilterObject();
269
+ return {
270
+ bind: vm.id,
271
+ dataList: [{ obj: vm, key: 'type' }],
272
+ view: () => {
273
+ if (vm.type === 'list') {
274
+ return BgWidget.container(html `
275
+ <div class="title-container">
276
+ ${BgWidget.title('推播紀錄')}
277
+ <div class="flex-fill"></div>
278
+ </div>
279
+ ${BgWidget.container(BgWidget.mainCard([
280
+ (() => {
281
+ const id = glitter.getUUID();
282
+ return gvc.bindView({
283
+ bind: id,
284
+ view: () => {
285
+ const filterList = [
286
+ BgWidget.searchFilter(gvc.event(e => {
287
+ vm.query = `${e.value}`.trim();
288
+ gvc.notifyDataChange(vm.tableId);
289
+ gvc.notifyDataChange(id);
290
+ }), vm.query || '', '搜尋所有信件內容'),
291
+ BgWidget.funnelFilter({
292
+ gvc,
293
+ callback: () => {
294
+ return ListComp.showRightMenu(FilterOptions.emailFunnel);
295
+ },
296
+ }),
297
+ ];
298
+ const filterTags = ListComp.getFilterTags(FilterOptions.emailFunnel);
299
+ return BgListComponent.listBarRWD(filterList, filterTags);
300
+ },
301
+ });
302
+ })(),
303
+ gvc.bindView({
304
+ bind: vm.tableId,
305
+ view: () => {
306
+ return BgWidget.tableV3({
307
+ gvc: gvc,
308
+ getData: vmi => {
309
+ var _a, _b;
310
+ const limit = 20;
311
+ ApiFcm.history({
312
+ page: vmi.page - 1,
313
+ limit: limit,
314
+ search: (_a = vm.query) !== null && _a !== void 0 ? _a : '',
315
+ searchType: (_b = vm.queryType) !== null && _b !== void 0 ? _b : 'email',
316
+ sendTime: undefined,
317
+ status: vm.filter.status,
318
+ mailType: vm.filter.mailType,
319
+ }).then(data => {
320
+ if (data.result) {
321
+ function getDatalist() {
322
+ return data.response.data.map((dd) => {
323
+ return [
324
+ {
325
+ key: '寄件類型',
326
+ value: html `<span class="fs-7">${dd.content.typeName}</span>`,
327
+ },
328
+ {
329
+ key: '標題',
330
+ value: html `<span class="fs-7"
331
+ >${Tool.truncateString(`${dd.content.title}`, 25)}</span
332
+ >`,
333
+ },
334
+ {
335
+ key: '收件群組',
336
+ value: html `<span class="fs-7"
337
+ >${(() => {
338
+ if (!dd.content.sendGroup) {
339
+ return '沒有群組';
340
+ }
341
+ const lengthLimit = 25;
342
+ const tagList = [];
343
+ for (const group of dd.content.sendGroup) {
344
+ const tagLength = tagList.join('').length;
345
+ if (tagLength + group.length > lengthLimit) {
346
+ tagList.push(Tool.truncateString(group, tagLength));
347
+ break;
348
+ }
349
+ else {
350
+ tagList.push(group);
351
+ }
352
+ }
353
+ return tagList.join(html `<span
354
+ class="badge fs-7 mx-1 px-1"
355
+ style="color: #393939; background: #FFD5D0;"
356
+ >${dd.content.boolean === 'and' ? '且' : '或'}</span
357
+ >`);
358
+ })()}</span
359
+ >`,
360
+ },
361
+ {
362
+ key: '寄送時間',
363
+ value: dd.trigger_time
364
+ ? gvc.glitter.ut.dateFormat(new Date(dd.trigger_time), 'yyyy-MM-dd hh:mm')
365
+ : '無',
366
+ },
367
+ {
368
+ key: '寄送狀態',
369
+ value: (() => {
370
+ switch (dd.status) {
371
+ case 0:
372
+ return BgWidget.warningInsignia('尚未寄送');
373
+ case 1:
374
+ return BgWidget.infoInsignia('已寄出');
375
+ case 2:
376
+ return BgWidget.secondaryInsignia('取消寄送');
377
+ }
378
+ })(),
379
+ },
380
+ ];
381
+ });
382
+ }
383
+ vm.dataList = data.response.data;
384
+ vmi.pageSize = Math.ceil(data.response.total / limit);
385
+ vmi.originalData = vm.dataList;
386
+ vmi.tableData = getDatalist();
387
+ vmi.loading = false;
388
+ vmi.callback();
389
+ }
390
+ });
391
+ },
392
+ rowClick: (data, index) => {
393
+ },
394
+ filter: [],
395
+ });
396
+ },
397
+ }),
398
+ ].join('')))}
399
+ ${BgWidget.mbContainer(120)}
400
+ `);
401
+ }
402
+ return this.emailEditor({
403
+ vm: vm,
404
+ gvc: gvc,
405
+ type: 'replace',
406
+ readonly: true,
407
+ });
408
+ },
409
+ };
410
+ });
411
+ }
412
+ static emailEditor(obj) {
413
+ var _a;
414
+ const gvc = obj.gvc;
415
+ const vm = obj.vm;
416
+ const dialog = new ShareDialog(gvc.glitter);
417
+ const postData = (_a = vm.data) !== null && _a !== void 0 ? _a : {
418
+ content: '',
419
+ title: '',
420
+ type: 'notify-email-config',
421
+ name: '',
422
+ };
423
+ return BgWidget.container(html `
424
+ <div class="title-container">
425
+ ${BgWidget.goBack(gvc.event(() => {
426
+ vm.type = 'list';
427
+ }))}
428
+ ${BgWidget.title(obj.readonly ? '信件詳細內容' : '編輯信件樣式')}
429
+ <div class="flex-fill"></div>
430
+ ${obj.readonly
431
+ ? html `<div class="d-flex gap-2">
432
+ ${BgWidget.secondaryInsignia(vm.data.typeName)}
433
+ ${(() => {
434
+ switch (vm.data.status) {
435
+ case 0:
436
+ return BgWidget.warningInsignia('尚未寄送');
437
+ case 1:
438
+ return BgWidget.infoInsignia('已寄出');
439
+ case 2:
440
+ return BgWidget.secondaryInsignia('取消寄送');
441
+ }
442
+ })()}
443
+ </div>`
444
+ : ''}
445
+ </div>
446
+ ${BgWidget.mbContainer(18)}
447
+ ${BgWidget.container(obj.gvc.bindView(() => {
448
+ const bi = obj.gvc.glitter.getUUID();
449
+ return {
450
+ bind: bi,
451
+ view: () => {
452
+ var _a;
453
+ let htmlList = [];
454
+ if (obj.readonly) {
455
+ const sendGroupHTML = ((_a = vm.data.sendGroup) !== null && _a !== void 0 ? _a : []).map((str) => html `<div class="c_filter_tag">${str}</div>`);
456
+ const emailHTML = vm.data.email.map((str) => html `<div class="c_filter_tag">${str}</div>`);
457
+ htmlList = htmlList.concat([
458
+ BgWidget.mainCard(html `
459
+ <div class="tx_normal fw-normal">篩選條件</div>
460
+ <div class="c_filter_container">
461
+ ${sendGroupHTML.length === 0
462
+ ? '沒有群組'
463
+ : sendGroupHTML.join(html `<span class="badge fs-7 px-1" style="color: #393939; background: #FFD5D0;"
464
+ >${vm.data.boolean === 'and' ? '且' : '或'}</span
465
+ >`)}
466
+ </div>
467
+ `),
468
+ BgWidget.mainCard(html `
469
+ <div class="tx_normal fw-normal">電子信箱</div>
470
+ <div class="c_filter_container">${emailHTML.join('')}</div>
471
+ `),
472
+ BgWidget.mainCard(html `<div class="tx_700 mb-3">發送時間</div>
473
+ ${EditorElem.radio({
474
+ gvc: gvc,
475
+ title: '',
476
+ def: vm.data.sendTime === undefined ? 'now' : 'set',
477
+ array: [
478
+ {
479
+ title: '立即發送',
480
+ value: 'now',
481
+ },
482
+ {
483
+ title: '排定發送時間',
484
+ value: 'set',
485
+ innerHtml: html `<div
486
+ class="d-flex mt-3 ${document.body.clientWidth < 768 ? 'flex-column' : ''}"
487
+ style="gap: 12px"
488
+ >
489
+ ${EditorElem.editeInput({
490
+ gvc: gvc,
491
+ title: '',
492
+ type: 'date',
493
+ style: inputStyle,
494
+ default: vm.data.sendTime ? vm.data.sendTime.date : '',
495
+ placeHolder: '',
496
+ callback: () => { },
497
+ readonly: true,
498
+ })}
499
+ ${EditorElem.editeInput({
500
+ gvc: gvc,
501
+ title: '',
502
+ type: 'time',
503
+ style: inputStyle,
504
+ default: vm.data.sendTime ? vm.data.sendTime.time : '',
505
+ placeHolder: '',
506
+ callback: () => { },
507
+ readonly: true,
508
+ })}
509
+ </div>`,
510
+ },
511
+ ],
512
+ callback: () => { },
513
+ readonly: true,
514
+ })}`),
515
+ ]);
516
+ }
517
+ htmlList = htmlList.concat([
518
+ BgWidget.mainCard(BgWidget.editeInput({
519
+ gvc: gvc,
520
+ title: '寄件者名稱',
521
+ default: postData.name,
522
+ placeHolder: '請輸入寄件者名稱',
523
+ callback: text => {
524
+ postData.name = text;
525
+ },
526
+ readonly: obj.readonly,
527
+ })),
528
+ BgWidget.mainCard(BgWidget.editeInput({
529
+ gvc: gvc,
530
+ title: '信件主旨',
531
+ default: postData.title,
532
+ placeHolder: '請輸入信件主旨',
533
+ callback: text => {
534
+ if (text === 'default') {
535
+ const dialog = new ShareDialog(gvc.glitter);
536
+ dialog.infoMessage({ text: 'default 為系統預設值,請更改其他信件主旨' });
537
+ postData.title = '';
538
+ obj.gvc.notifyDataChange(bi);
539
+ return;
540
+ }
541
+ postData.title = text;
542
+ },
543
+ readonly: obj.readonly,
544
+ })),
545
+ BgWidget.mainCard(html `<div class="d-flex w-100 align-items-center justify-content-between p-0 mb-2">
546
+ <div class="tx_normal fw-normal me-2">信件內文</div>
547
+ <div class="d-flex align-items-center gap-2">
548
+ ${obj.readonly
549
+ ? ''
550
+ : BgWidget.customButton({
551
+ button: {
552
+ color: 'snow',
553
+ size: 'md',
554
+ },
555
+ text: {
556
+ name: '範例',
557
+ },
558
+ event: obj.gvc.event(() => {
559
+ if (postData.content.length > 0) {
560
+ dialog.checkYesOrNot({
561
+ callback: bool => {
562
+ if (bool) {
563
+ postData.content = defaultEmailText();
564
+ obj.gvc.notifyDataChange(bi);
565
+ }
566
+ },
567
+ text: '此操作會覆蓋當前的內文,<br />確定要執行嗎?',
568
+ });
569
+ }
570
+ else {
571
+ postData.content = defaultEmailText();
572
+ obj.gvc.notifyDataChange(bi);
573
+ }
574
+ }),
575
+ })}
576
+ ${BgWidget.aiChatButton({ gvc, select: 'writer' })}
577
+ </div>
578
+ </div>
579
+ ${obj.readonly
580
+ ? html `<div class="p-1">${postData.content}</div>`
581
+ : EditorElem.richText({
582
+ gvc: gvc,
583
+ def: postData.content,
584
+ callback: text => {
585
+ postData.content = text;
586
+ },
587
+ style: `overflow-y: auto;`,
588
+ })}`),
589
+ ]);
590
+ return htmlList.filter(str => str.length > 0).join(BgWidget.mbContainer(16));
591
+ },
592
+ divCreate: {},
593
+ };
594
+ }))}
595
+ ${BgWidget.mbContainer(240)}
596
+ <div class="update-bar-container">
597
+ ${!obj.readonly && obj.type === 'replace'
598
+ ? BgWidget.danger(obj.gvc.event(() => {
599
+ const dialog = new ShareDialog(gvc.glitter);
600
+ dialog.checkYesOrNot({
601
+ text: '是否確認刪除此信件樣式?',
602
+ callback: response => {
603
+ if (response) {
604
+ dialog.dataLoading({ visible: true });
605
+ ApiPost.delete({
606
+ id: postData.id,
607
+ }).then(res => {
608
+ dialog.dataLoading({ visible: false });
609
+ if (res.result) {
610
+ dialog.successMessage({ text: '刪除成功' });
611
+ vm.type = 'list';
612
+ }
613
+ else {
614
+ dialog.errorMessage({ text: '刪除失敗' });
615
+ }
616
+ });
617
+ }
618
+ },
619
+ });
620
+ }))
621
+ : ''}
622
+ ${obj.readonly && vm.data.status === 0
623
+ ? BgWidget.danger(gvc.event(() => {
624
+ const dialog = new ShareDialog(gvc.glitter);
625
+ dialog.checkYesOrNot({
626
+ callback: bool => {
627
+ if (bool) {
628
+ dialog.dataLoading({ text: '取消排定中...', visible: true });
629
+ ApiSmtp.cancel(vm.data.id).then(data => {
630
+ dialog.dataLoading({ visible: false });
631
+ if (data.result) {
632
+ dialog.successMessage({ text: '取消排定發送成功' });
633
+ setTimeout(() => {
634
+ vm.type = 'list';
635
+ }, 100);
636
+ }
637
+ else {
638
+ dialog.errorMessage({ text: '取消排定發送失敗' });
639
+ }
640
+ });
641
+ }
642
+ },
643
+ text: '確定取消排定發送的信件嗎?',
644
+ });
645
+ }), '取消排定發送')
646
+ : ''}
647
+ ${BgWidget.cancel(gvc.event(() => {
648
+ vm.type = 'list';
649
+ }), obj.readonly ? '關閉' : undefined)}
650
+ ${obj.readonly
651
+ ? ''
652
+ : BgWidget.save(gvc.event(() => {
653
+ const dialog = new ShareDialog(gvc.glitter);
654
+ if (obj.type === 'replace') {
655
+ dialog.dataLoading({ text: '變更信件', visible: true });
656
+ ApiPost.put({
657
+ postData: postData,
658
+ token: window.parent.saasConfig.config.token,
659
+ type: 'manager',
660
+ }).then(re => {
661
+ dialog.dataLoading({ visible: false });
662
+ if (re.result) {
663
+ vm.status = 'list';
664
+ dialog.successMessage({ text: '上傳成功' });
665
+ }
666
+ else {
667
+ dialog.errorMessage({ text: '上傳失敗' });
668
+ }
669
+ });
670
+ }
671
+ else {
672
+ dialog.dataLoading({ text: '新增信件', visible: true });
673
+ ApiPost.post({
674
+ postData: postData,
675
+ token: window.parent.saasConfig.config.token,
676
+ type: 'manager',
677
+ }).then(re => {
678
+ dialog.dataLoading({ visible: false });
679
+ if (re.result) {
680
+ vm.type = 'list';
681
+ dialog.successMessage({ text: '上傳成功' });
682
+ }
683
+ else {
684
+ dialog.errorMessage({ text: '上傳失敗' });
685
+ }
686
+ });
687
+ }
688
+ }))}
689
+ </div>
690
+ `);
691
+ }
692
+ static emailSender(gvc) {
693
+ const glitter = gvc.glitter;
694
+ const dialog = new ShareDialog(gvc.glitter);
695
+ const startDate = ShoppingDiscountSetting.getDateTime(1).date;
696
+ const startTime = ShoppingDiscountSetting.getDateTime(1).time;
697
+ const vm = {
698
+ id: glitter.getUUID(),
699
+ containerId: glitter.getUUID(),
700
+ emailId: glitter.getUUID(),
701
+ tagsId: glitter.getUUID(),
702
+ loading: true,
703
+ dataList: [],
704
+ };
705
+ const postData = {
706
+ type: 'notify-sns-config',
707
+ tag: '',
708
+ tagList: [],
709
+ userList: [],
710
+ boolean: 'or',
711
+ name: '',
712
+ title: '',
713
+ content: '',
714
+ sendTime: { date: startDate, time: startTime },
715
+ sendGroup: [],
716
+ };
717
+ function getOptions(tag) {
718
+ return __awaiter(this, void 0, void 0, function* () {
719
+ if (tag === 'level') {
720
+ return yield ApiUser.getPublicConfig('member_level_config', 'manager').then((res) => {
721
+ if (res.result && res.response.value && res.response.value.levels.length > 0) {
722
+ return res.response.value.levels.map((data) => {
723
+ return { key: data.id, value: data.tag_name };
724
+ });
725
+ }
726
+ return [];
727
+ });
728
+ }
729
+ if (tag === 'tags') {
730
+ return yield ApiUser.getPublicConfig('user_general_tags', 'manager').then((res) => {
731
+ if (res.result && res.response.value && res.response.value.list.length > 0) {
732
+ return res.response.value.list.map((data) => {
733
+ return { key: data, value: data };
734
+ });
735
+ }
736
+ return [];
737
+ });
738
+ }
739
+ if (tag === 'group') {
740
+ return yield ApiUser.getUserGroupList().then((res) => {
741
+ if (res.result) {
742
+ return res.response.data
743
+ .filter((data) => {
744
+ return data.type !== 'level';
745
+ })
746
+ .map((data) => {
747
+ return { key: data.type, value: data.title };
748
+ });
749
+ }
750
+ return [];
751
+ });
752
+ }
753
+ if (tag === 'birth') {
754
+ const userFunnel = yield FilterOptions.getUserFunnel();
755
+ const birthData = userFunnel.find(data => data.key === 'birth');
756
+ if (birthData && Array.isArray(birthData.data)) {
757
+ return birthData.data.map((item) => {
758
+ item.value = item.name;
759
+ return item;
760
+ });
761
+ }
762
+ }
763
+ return [];
764
+ });
765
+ }
766
+ function filterEvent(filter) {
767
+ if (filter.length === 0) {
768
+ postData.tagList = postData.tagList.filter(data => data.tag !== postData.tag);
769
+ }
770
+ else {
771
+ let valueString = '';
772
+ if (postData.tag === 'all') {
773
+ valueString = '';
774
+ }
775
+ else if (Array.isArray(filter)) {
776
+ valueString = vm.dataList
777
+ .filter(data => {
778
+ return filter.includes(data.key);
779
+ })
780
+ .map(data => {
781
+ return data.value;
782
+ })
783
+ .join(', ');
784
+ }
785
+ else {
786
+ const intFiltter = parseInt(`${filter}`, 10);
787
+ filter = intFiltter > 0 ? intFiltter : 0;
788
+ valueString = filter;
789
+ }
790
+ const index = postData.tagList.findIndex(data => data.tag === postData.tag);
791
+ if (index === -1) {
792
+ postData.tagList.push({ tag: postData.tag, filter: filter, valueString });
793
+ }
794
+ else {
795
+ postData.tagList[index] = { tag: postData.tag, filter: filter, valueString };
796
+ }
797
+ }
798
+ setUserList();
799
+ }
800
+ function filterEmails(emails, mode, n) {
801
+ if (mode === 'or') {
802
+ const uniqueIds = new Set();
803
+ return emails.filter(emailObj => {
804
+ if (!uniqueIds.has(emailObj.id)) {
805
+ uniqueIds.add(emailObj.id);
806
+ return true;
807
+ }
808
+ return false;
809
+ });
810
+ }
811
+ else if (mode === 'and' && n && n > 0) {
812
+ const frequencyMap = {};
813
+ emails.forEach(emailObj => {
814
+ if (frequencyMap[emailObj.id]) {
815
+ frequencyMap[emailObj.id].count += 1;
816
+ }
817
+ else {
818
+ frequencyMap[emailObj.id] = { count: 1, emailObj };
819
+ }
820
+ });
821
+ return Object.values(frequencyMap)
822
+ .filter(entry => entry.count >= n)
823
+ .map(entry => entry.emailObj);
824
+ }
825
+ return [];
826
+ }
827
+ function setUserList() {
828
+ let n = 0;
829
+ postData.userList = [];
830
+ dialog.dataLoading({ visible: true, text: '更新預計寄件人...' });
831
+ new Promise(resolve => {
832
+ const si = setInterval(() => {
833
+ if (postData.tagList.length === n) {
834
+ resolve();
835
+ clearInterval(si);
836
+ }
837
+ }, 200);
838
+ postData.tagList.map(tagData => {
839
+ if (tagData.tag === 'all') {
840
+ ApiUser.getUserList({
841
+ page: 0,
842
+ limit: 99999,
843
+ only_id: true
844
+ }).then(dd => {
845
+ dd.response.data.map((user) => {
846
+ if (user.userData.email && user.userData.email.length > 0) {
847
+ postData.userList.push({
848
+ id: user.userID,
849
+ email: user.userData.email,
850
+ });
851
+ }
852
+ });
853
+ n++;
854
+ });
855
+ }
856
+ if (tagData.tag === 'customers') {
857
+ ApiUser.getUserList({
858
+ page: 0,
859
+ limit: 99999,
860
+ id: tagData.filter.join(','),
861
+ }).then(dd => {
862
+ dd.response.data.map((user) => {
863
+ if (user.userData.email && user.userData.email.length > 0) {
864
+ postData.userList.push({
865
+ id: user.userID,
866
+ email: user.userData.email,
867
+ });
868
+ }
869
+ });
870
+ n++;
871
+ });
872
+ }
873
+ if (tagData.tag === 'level') {
874
+ let n1 = 0;
875
+ new Promise(resolve => {
876
+ const list = [];
877
+ tagData.filter.map((id) => {
878
+ ApiUser.getUserListOrders({
879
+ page: 0,
880
+ limit: 99999,
881
+ group: { type: 'level', tag: id },
882
+ }).then(data => {
883
+ data.response.data.map((user) => {
884
+ if (user.userData.email) {
885
+ list.push({
886
+ id: user.userID,
887
+ email: user.userData.email,
888
+ });
889
+ }
890
+ });
891
+ n1++;
892
+ });
893
+ const si = setInterval(() => {
894
+ if (tagData.filter.length === n1) {
895
+ resolve(filterEmails(list, 'or'));
896
+ clearInterval(si);
897
+ }
898
+ }, 200);
899
+ });
900
+ }).then(res => {
901
+ postData.userList = postData.userList.concat(res);
902
+ n++;
903
+ });
904
+ }
905
+ if (tagData.tag === 'group') {
906
+ let n2 = 0;
907
+ const list = [];
908
+ new Promise(resolve => {
909
+ tagData.filter.map((type) => {
910
+ ApiUser.getUserListOrders({
911
+ page: 0,
912
+ limit: 99999,
913
+ group: { type: type },
914
+ }).then(data => {
915
+ let dataArray = data.response.data;
916
+ if (data.response.extra) {
917
+ dataArray = dataArray.concat(data.response.extra.noRegisterUsers);
918
+ }
919
+ dataArray.map((user) => {
920
+ if (user && user.userData.email) {
921
+ list.push({
922
+ id: user.userID,
923
+ email: user.userData.email,
924
+ });
925
+ }
926
+ });
927
+ n2++;
928
+ });
929
+ const si = setInterval(() => {
930
+ if (tagData.filter.length === n2) {
931
+ resolve(filterEmails(list, 'or'));
932
+ clearInterval(si);
933
+ }
934
+ }, 200);
935
+ });
936
+ }).then(res => {
937
+ postData.userList = postData.userList.concat(res);
938
+ n++;
939
+ });
940
+ }
941
+ if (tagData.tag === 'birth') {
942
+ ApiUser.getUserListOrders({
943
+ page: 0,
944
+ limit: 99999,
945
+ filter: { birth: tagData.filter },
946
+ }).then(data => {
947
+ data.response.data.map((user) => {
948
+ if (user.userData.email) {
949
+ postData.userList.push({
950
+ id: user.userID,
951
+ email: user.userData.email,
952
+ });
953
+ }
954
+ });
955
+ n++;
956
+ });
957
+ }
958
+ if (tagData.tag === 'tags') {
959
+ ApiUser.getUserListOrders({
960
+ page: 0,
961
+ limit: 99999,
962
+ filter: { tags: tagData.filter },
963
+ }).then(data => {
964
+ data.response.data.map((user) => {
965
+ if (user.userData.email) {
966
+ postData.userList.push({
967
+ id: user.userID,
968
+ email: user.userData.email,
969
+ });
970
+ }
971
+ });
972
+ n++;
973
+ });
974
+ }
975
+ if (tagData.tag === 'expiry') {
976
+ }
977
+ if (tagData.tag === 'remain') {
978
+ ApiUser.getUserListOrders({
979
+ page: 0,
980
+ limit: 99999,
981
+ filter: { rebate: { key: 'moreThan', value: tagData.filter } },
982
+ }).then(data => {
983
+ data.response.data.map((user) => {
984
+ if (user.userData.email) {
985
+ postData.userList.push({
986
+ id: user.userID,
987
+ email: user.userData.email,
988
+ });
989
+ }
990
+ });
991
+ n++;
992
+ });
993
+ }
994
+ if (tagData.tag === 'uncheckout') {
995
+ }
996
+ });
997
+ }).then(() => {
998
+ postData.userList = filterEmails(postData.userList, postData.boolean, postData.boolean === 'and' ? postData.tagList.length : undefined);
999
+ dialog.dataLoading({ visible: false });
1000
+ gvc.notifyDataChange(vm.tagsId);
1001
+ });
1002
+ }
1003
+ function tagBadge(key, name, value) {
1004
+ const formatName = value && value.length > 0 ? `${name}:${value}` : name;
1005
+ return {
1006
+ name: formatName,
1007
+ html: html `<div class="c_filter_tag">
1008
+ ${formatName}
1009
+ <i
1010
+ class="fa-solid fa-xmark ms-1"
1011
+ style="cursor: pointer"
1012
+ onclick="${gvc.event(() => {
1013
+ postData.tagList = postData.tagList.filter(data => data.tag !== key);
1014
+ setUserList();
1015
+ gvc.notifyDataChange(vm.tagsId);
1016
+ })}"
1017
+ ></i>
1018
+ </div>`,
1019
+ };
1020
+ }
1021
+ function getTagsHTML() {
1022
+ const badgeList = [];
1023
+ postData.tagList.map(data => {
1024
+ const opt = FilterOptions.emailOptions.find(item => item.key === data.tag);
1025
+ if (opt) {
1026
+ if (!Array.isArray(data.filter)) {
1027
+ switch (data.tag) {
1028
+ case 'remain':
1029
+ data.valueString = `大於${data.filter}點`;
1030
+ break;
1031
+ }
1032
+ }
1033
+ badgeList.push(tagBadge(data.tag, opt.value, data.valueString));
1034
+ }
1035
+ });
1036
+ postData.sendGroup = badgeList.map(item => item.name);
1037
+ return [
1038
+ html `<div class="tx_normal fw-normal">標籤判斷</div>
1039
+ ${BgWidget.grayNote('當有多個篩選條件時,進階判斷顧客符合的交集')}
1040
+ <div style="margin: 8px 0;">
1041
+ ${BgWidget.switchTextButton(gvc, postData.boolean === 'and', { left: '或', right: '且' }, bool => {
1042
+ postData.boolean = bool ? 'and' : 'or';
1043
+ setUserList();
1044
+ gvc.notifyDataChange(vm.tagsId);
1045
+ })}
1046
+ </div>`,
1047
+ html `<div class="tx_normal fw-normal">預計寄件顧客人數</div>
1048
+ <div style="display:flex; align-items: center; gap: 18px; margin: 8px 0;">
1049
+ <div class="tx_normal">${postData.userList.length}人</div>
1050
+ ${BgWidget.grayButton('查看名單', gvc.event(() => {
1051
+ if (postData.userList.length === 0) {
1052
+ const dialog = new ShareDialog(gvc.glitter);
1053
+ dialog.infoMessage({ text: '目前無預計寄件的顧客' });
1054
+ return;
1055
+ }
1056
+ const userVM = {
1057
+ dataList: [],
1058
+ };
1059
+ BgWidget.selectDropDialog({
1060
+ gvc: gvc,
1061
+ title: '預計寄件顧客',
1062
+ tag: 'send_users_list',
1063
+ callback: () => { },
1064
+ default: [],
1065
+ api: () => {
1066
+ return new Promise(resolve => {
1067
+ ApiUser.getUserListOrders({
1068
+ page: 0,
1069
+ limit: 99999,
1070
+ id: postData.userList.map(user => { var _a; return (_a = user.id) !== null && _a !== void 0 ? _a : 0; }).join(','),
1071
+ }).then(dd => {
1072
+ if (dd.response.data) {
1073
+ userVM.dataList = dd.response.data.map((item) => {
1074
+ return {
1075
+ key: item.userID,
1076
+ value: item.userData.name,
1077
+ note: item.userData.email,
1078
+ };
1079
+ });
1080
+ if (postData.userList.length > userVM.dataList.length) {
1081
+ const noRegisterUser = postData.userList
1082
+ .filter(item => {
1083
+ return item.id < 0 && item.email;
1084
+ })
1085
+ .map(item => {
1086
+ return {
1087
+ key: `${item.id}`,
1088
+ value: '(未註冊的會員)',
1089
+ note: item.email,
1090
+ };
1091
+ });
1092
+ userVM.dataList = userVM.dataList.concat(noRegisterUser);
1093
+ }
1094
+ resolve(userVM.dataList);
1095
+ }
1096
+ });
1097
+ });
1098
+ },
1099
+ style: 'width: 100%;',
1100
+ readonly: true,
1101
+ });
1102
+ }), { textStyle: 'font-weight: 400;' })}
1103
+ </div> `,
1104
+ html `
1105
+ <div class="tx_normal fw-normal">篩選條件</div>
1106
+ <div class="c_filter_container">
1107
+ ${badgeList.length === 0
1108
+ ? '無'
1109
+ : badgeList
1110
+ .map(item => {
1111
+ return item.html;
1112
+ })
1113
+ .join(postData.boolean === 'and' ? '且' : '或')}
1114
+ </div>
1115
+ `,
1116
+ ].join(BgWidget.mbContainer(18));
1117
+ }
1118
+ return BgWidget.container(html `
1119
+ <div class="title-container">
1120
+ ${BgWidget.title('手動寄件')}
1121
+ <div class="flex-fill"></div>
1122
+ </div>
1123
+ ${BgWidget.mbContainer(18)}
1124
+ ${BgWidget.container(gvc.bindView(() => {
1125
+ return {
1126
+ bind: vm.containerId,
1127
+ view: () => {
1128
+ return [
1129
+ BgWidget.mainCard([
1130
+ html ` <div class="tx_700">選擇收件對象</div>`,
1131
+ html ` <div class="tx_normal fw-normal mt-3">根據</div>`,
1132
+ html `<div
1133
+ style="display: flex; ${document.body.clientWidth > 768
1134
+ ? 'gap: 18px;'
1135
+ : 'flex-direction: column;'}"
1136
+ >
1137
+ <div style="width: ${document.body.clientWidth > 768 ? '400px' : '100%'};">
1138
+ ${BgWidget.select({
1139
+ gvc: gvc,
1140
+ default: postData.tag,
1141
+ callback: key => {
1142
+ postData.tag = key;
1143
+ vm.loading = true;
1144
+ gvc.notifyDataChange(vm.id);
1145
+ },
1146
+ options: FilterOptions.emailOptions,
1147
+ style: 'margin: 8px 0;',
1148
+ })}
1149
+ </div>
1150
+ <div style="width: 100%; display: flex; align-items: center;">
1151
+ ${gvc.bindView({
1152
+ bind: vm.id,
1153
+ view: () => {
1154
+ const getDefault = (def) => {
1155
+ const data = postData.tagList.find(data => data.tag === postData.tag);
1156
+ return data ? data.filter : def;
1157
+ };
1158
+ const callback = (value) => {
1159
+ if (typeof value === 'string' || typeof value === 'number') {
1160
+ const intFiltter = parseInt(`${value}`, 10);
1161
+ value = intFiltter > 0 ? intFiltter : 0;
1162
+ if (isNaN(intFiltter) || intFiltter < 0) {
1163
+ const dialog = new ShareDialog(gvc.glitter);
1164
+ dialog.infoMessage({ text: '請輸入正整數或0' });
1165
+ return;
1166
+ }
1167
+ }
1168
+ filterEvent(value);
1169
+ };
1170
+ switch (postData.tag) {
1171
+ case 'all':
1172
+ dialog.dataLoading({ visible: true, text: '取得所有會員資料中...' });
1173
+ new Promise(resolve => {
1174
+ ApiUser.getUserList({
1175
+ page: 0,
1176
+ limit: 99999,
1177
+ only_id: true
1178
+ }).then(dd => {
1179
+ if (dd.response.data) {
1180
+ const ids = [];
1181
+ vm.dataList = dd.response.data
1182
+ .filter((item) => {
1183
+ return item.userData.email && item.userData.email.length > 0;
1184
+ })
1185
+ .map((item) => {
1186
+ var _a;
1187
+ ids.push(item.userID);
1188
+ return {
1189
+ key: item.userID,
1190
+ value: (_a = item.userData.name) !== null && _a !== void 0 ? _a : '(尚無姓名)',
1191
+ note: item.userData.email,
1192
+ };
1193
+ });
1194
+ resolve(ids);
1195
+ }
1196
+ });
1197
+ }).then(data => {
1198
+ dialog.dataLoading({ visible: false });
1199
+ callback(data);
1200
+ });
1201
+ return '';
1202
+ case 'level':
1203
+ case 'group':
1204
+ case 'birth':
1205
+ case 'tags':
1206
+ return BgWidget.selectDropList({
1207
+ gvc: gvc,
1208
+ callback: callback,
1209
+ default: getDefault([]),
1210
+ options: vm.loading ? [] : vm.dataList,
1211
+ placeholder: vm.loading ? '資料載入中...' : undefined,
1212
+ style: 'margin: 8px 0; width: 100%;',
1213
+ });
1214
+ case 'customers':
1215
+ return BgWidget.grayButton('點擊選取顧客', gvc.event(() => {
1216
+ BgWidget.selectDropDialog({
1217
+ gvc: gvc,
1218
+ title: '搜尋特定顧客',
1219
+ tag: 'set_send_users',
1220
+ updownOptions: FilterOptions.userOrderBy,
1221
+ callback: callback,
1222
+ default: getDefault([]),
1223
+ api: (data) => {
1224
+ return new Promise(resolve => {
1225
+ ApiUser.getUserList({
1226
+ page: 0,
1227
+ limit: 99999,
1228
+ only_id: true,
1229
+ search: data.query
1230
+ }).then(dd => {
1231
+ if (dd.response.data) {
1232
+ vm.dataList = dd.response.data
1233
+ .filter((item) => {
1234
+ return item.userData.email && item.userData.email.length > 0;
1235
+ })
1236
+ .map((item) => {
1237
+ var _a;
1238
+ return {
1239
+ key: item.userID,
1240
+ value: (_a = item.userData.name) !== null && _a !== void 0 ? _a : '(尚無姓名)',
1241
+ note: item.userData.email,
1242
+ };
1243
+ });
1244
+ resolve(vm.dataList);
1245
+ }
1246
+ });
1247
+ });
1248
+ },
1249
+ style: 'width: 100%;',
1250
+ });
1251
+ }), { textStyle: 'font-weight: 400;' });
1252
+ case 'expiry':
1253
+ return BgWidget.editeInput({
1254
+ gvc: gvc,
1255
+ title: '',
1256
+ default: getDefault('0'),
1257
+ placeHolder: '請輸入剩餘多少天',
1258
+ callback: callback,
1259
+ endText: '天',
1260
+ });
1261
+ case 'remain':
1262
+ return BgWidget.editeInput({
1263
+ gvc: gvc,
1264
+ title: '',
1265
+ default: getDefault('0'),
1266
+ placeHolder: '請輸入大於多少',
1267
+ callback: callback,
1268
+ startText: '大於',
1269
+ endText: '點',
1270
+ });
1271
+ case 'uncheckout':
1272
+ return BgWidget.editeInput({
1273
+ gvc: gvc,
1274
+ title: '',
1275
+ default: getDefault('0'),
1276
+ placeHolder: '請輸入超過幾天未結帳',
1277
+ callback: callback,
1278
+ endText: '天',
1279
+ });
1280
+ default:
1281
+ return '';
1282
+ }
1283
+ },
1284
+ divCreate: { class: 'w-100' },
1285
+ onCreate: () => {
1286
+ if (vm.loading) {
1287
+ getOptions(postData.tag).then(opts => {
1288
+ vm.dataList = opts;
1289
+ vm.loading = false;
1290
+ gvc.notifyDataChange(vm.id);
1291
+ });
1292
+ }
1293
+ },
1294
+ })}
1295
+ </div>
1296
+ </div>`,
1297
+ gvc.bindView({
1298
+ bind: vm.tagsId,
1299
+ view: () => getTagsHTML(),
1300
+ divCreate: { style: 'margin-top: 8px;' },
1301
+ }),
1302
+ ].join('')),
1303
+ BgWidget.mainCard([
1304
+ html ` <div class="tx_700">信件內容</div>`,
1305
+ html ` <div class="tx_normal fw-normal mt-3">信件樣式</div>`,
1306
+ (() => {
1307
+ const selectVM = {
1308
+ id: glitter.getUUID(),
1309
+ loading: true,
1310
+ dataList: [],
1311
+ };
1312
+ return gvc.bindView({
1313
+ bind: selectVM.id,
1314
+ view: () => {
1315
+ return BgWidget.select({
1316
+ gvc: gvc,
1317
+ default: postData.name,
1318
+ callback: key => {
1319
+ const data = selectVM.dataList.find(data => data.key === key && key !== 'def');
1320
+ postData.name = data ? data.name : '';
1321
+ postData.title = data ? data.value : '';
1322
+ postData.content = data ? data.content : '';
1323
+ gvc.notifyDataChange(vm.emailId);
1324
+ },
1325
+ options: selectVM.dataList,
1326
+ style: 'margin: 8px 0;',
1327
+ });
1328
+ },
1329
+ divCreate: {},
1330
+ onCreate: () => {
1331
+ if (selectVM.loading) {
1332
+ ApiPost.getManagerPost({
1333
+ page: 0,
1334
+ limit: 9999,
1335
+ type: 'notify-email-config',
1336
+ }).then(res => {
1337
+ if (res.result) {
1338
+ selectVM.dataList = res.response.data.map((data) => {
1339
+ data = data.content;
1340
+ return {
1341
+ key: `${data.id}`,
1342
+ name: data.name,
1343
+ value: data.title,
1344
+ content: data.content,
1345
+ };
1346
+ });
1347
+ selectVM.dataList.splice(0, 0, {
1348
+ key: 'default',
1349
+ name: '',
1350
+ value: '(空白樣式)',
1351
+ content: '',
1352
+ });
1353
+ }
1354
+ selectVM.loading = false;
1355
+ gvc.notifyDataChange(selectVM.id);
1356
+ });
1357
+ }
1358
+ },
1359
+ });
1360
+ })(),
1361
+ gvc.bindView({
1362
+ bind: vm.emailId,
1363
+ view: () => {
1364
+ return [
1365
+ BgWidget.editeInput({
1366
+ gvc: gvc,
1367
+ title: '寄件者名稱',
1368
+ default: postData.name,
1369
+ placeHolder: '請輸入寄件者名稱',
1370
+ callback: text => {
1371
+ postData.name = text;
1372
+ },
1373
+ }),
1374
+ BgWidget.editeInput({
1375
+ gvc: gvc,
1376
+ title: '信件主旨',
1377
+ default: postData.title,
1378
+ placeHolder: '請輸入信件主旨',
1379
+ callback: text => {
1380
+ postData.title = text;
1381
+ },
1382
+ }),
1383
+ html `<div class="d-flex w-100 align-items-center justify-content-between p-0 my-2">
1384
+ <div class="tx_normal fw-normal me-2">信件內文</div>
1385
+ <div class="d-flex align-items-center gap-2">
1386
+ ${BgWidget.customButton({
1387
+ button: {
1388
+ color: 'snow',
1389
+ size: 'md',
1390
+ },
1391
+ text: {
1392
+ name: '範例',
1393
+ },
1394
+ event: gvc.event(() => {
1395
+ if (postData.content.length > 0) {
1396
+ dialog.checkYesOrNot({
1397
+ callback: bool => {
1398
+ if (bool) {
1399
+ postData.content = defaultEmailText();
1400
+ gvc.notifyDataChange(vm.containerId);
1401
+ }
1402
+ },
1403
+ text: '此操作會覆蓋當前的內文,<br />確定要執行嗎?',
1404
+ });
1405
+ }
1406
+ else {
1407
+ postData.content = defaultEmailText();
1408
+ gvc.notifyDataChange(vm.containerId);
1409
+ }
1410
+ }),
1411
+ })}
1412
+ ${BgWidget.aiChatButton({ gvc, select: 'writer' })}
1413
+ </div>
1414
+ </div>
1415
+ ${EditorElem.richText({
1416
+ gvc: gvc,
1417
+ def: postData.content,
1418
+ callback: text => {
1419
+ postData.content = text;
1420
+ },
1421
+ style: `overflow-y: auto;`,
1422
+ })}`,
1423
+ ].join('');
1424
+ },
1425
+ }),
1426
+ ].join('')),
1427
+ BgWidget.mainCard(html `<div class="tx_700 mb-3">發送時間</div>
1428
+ ${EditorElem.radio({
1429
+ gvc: gvc,
1430
+ title: '',
1431
+ def: postData.sendTime === undefined ? 'now' : 'set',
1432
+ array: [
1433
+ {
1434
+ title: '立即發送',
1435
+ value: 'now',
1436
+ },
1437
+ {
1438
+ title: '排定發送時間',
1439
+ value: 'set',
1440
+ innerHtml: html `<div
1441
+ class="d-flex mt-3 ${document.body.clientWidth < 768 ? 'flex-column' : ''}"
1442
+ style="gap: 12px"
1443
+ >
1444
+ ${EditorElem.editeInput({
1445
+ gvc: gvc,
1446
+ title: '',
1447
+ type: 'date',
1448
+ style: inputStyle,
1449
+ default: startDate,
1450
+ placeHolder: '',
1451
+ callback: date => {
1452
+ var _a, _b;
1453
+ postData.sendTime = {
1454
+ date: date,
1455
+ time: (_b = (_a = postData.sendTime) === null || _a === void 0 ? void 0 : _a.time) !== null && _b !== void 0 ? _b : '',
1456
+ };
1457
+ },
1458
+ })}
1459
+ ${EditorElem.editeInput({
1460
+ gvc: gvc,
1461
+ title: '',
1462
+ type: 'time',
1463
+ style: inputStyle,
1464
+ default: startTime,
1465
+ placeHolder: '',
1466
+ callback: time => {
1467
+ var _a, _b;
1468
+ postData.sendTime = {
1469
+ date: (_b = (_a = postData.sendTime) === null || _a === void 0 ? void 0 : _a.date) !== null && _b !== void 0 ? _b : '',
1470
+ time: time,
1471
+ };
1472
+ },
1473
+ })}
1474
+ </div>`,
1475
+ },
1476
+ ],
1477
+ callback: text => {
1478
+ if (text === 'now') {
1479
+ postData.sendTime = undefined;
1480
+ }
1481
+ if (text === 'set') {
1482
+ postData.sendTime = { date: startDate, time: startTime };
1483
+ }
1484
+ },
1485
+ })}`),
1486
+ ].join(BgWidget.mbContainer(16));
1487
+ },
1488
+ divCreate: {},
1489
+ };
1490
+ }))}
1491
+ ${BgWidget.mbContainer(240)}
1492
+ <div class="update-bar-container">
1493
+ ${BgWidget.save(gvc.event(() => {
1494
+ function isLater(dateTimeObj) {
1495
+ const currentDateTime = new Date();
1496
+ const { date, time } = dateTimeObj;
1497
+ const dateTimeString = `${date}T${time}:00`;
1498
+ const providedDateTime = new Date(dateTimeString);
1499
+ return currentDateTime > providedDateTime;
1500
+ }
1501
+ if (postData.sendTime && isLater(postData.sendTime)) {
1502
+ dialog.errorMessage({ text: '排定發送的時間需大於現在時間' });
1503
+ return;
1504
+ }
1505
+ if (postData.userList.length == 0) {
1506
+ dialog.errorMessage({ text: '請選擇發送對象' });
1507
+ return;
1508
+ }
1509
+ dialog.dataLoading({
1510
+ text: postData.sendTime ? '信件排定中...' : '信件發送中...',
1511
+ visible: true,
1512
+ });
1513
+ ApiSmtp.send(Object.assign(Object.assign({}, postData), { email: postData.userList.map(user => user.email) })).then(data => {
1514
+ dialog.dataLoading({ visible: false });
1515
+ if (data.result) {
1516
+ dialog.successMessage({
1517
+ text: postData.sendTime ? '排定成功' : '發送成功',
1518
+ });
1519
+ }
1520
+ else {
1521
+ dialog.errorMessage({ text: '手動寄件失敗' });
1522
+ }
1523
+ });
1524
+ }), '送出')}
1525
+ </div>
1526
+ `);
1527
+ }
1528
+ static fcmEditor(obj) {
1529
+ var _a;
1530
+ const gvc = obj.gvc;
1531
+ const glitter = gvc.glitter;
1532
+ const vm = obj.vm;
1533
+ const postData = (_a = vm.data) !== null && _a !== void 0 ? _a : {
1534
+ content: '',
1535
+ title: '',
1536
+ link: '',
1537
+ type: 'notify-message-config',
1538
+ name: '',
1539
+ };
1540
+ return BgWidget.container(html `
1541
+ <div class="title-container">
1542
+ ${BgWidget.goBack(gvc.event(() => {
1543
+ vm.type = 'list';
1544
+ }))}
1545
+ ${BgWidget.title(`編輯推播通知`)}
1546
+ <div class="flex-fill"></div>
1547
+ </div>
1548
+ ${BgWidget.container(html `<div class="d-flex px-0" style="gap: 10px;">
1549
+ <div style="width: 100%">
1550
+ ${BgWidget.mainCard(obj.gvc.bindView(() => {
1551
+ const bi = obj.gvc.glitter.getUUID();
1552
+ return {
1553
+ bind: bi,
1554
+ view: () => {
1555
+ return [
1556
+ EditorElem.editeInput({
1557
+ gvc: gvc,
1558
+ title: '推播標題',
1559
+ default: postData.title,
1560
+ placeHolder: '請輸入推播標題',
1561
+ callback: text => {
1562
+ postData.title = text;
1563
+ },
1564
+ }),
1565
+ EditorElem.editeInput({
1566
+ gvc: gvc,
1567
+ title: '跳轉連結',
1568
+ default: postData.link,
1569
+ placeHolder: '請輸入要跳轉的連結',
1570
+ callback: text => {
1571
+ postData.link = text;
1572
+ },
1573
+ }),
1574
+ EditorElem.editeText({
1575
+ gvc: gvc,
1576
+ title: '推播主旨',
1577
+ default: postData.content,
1578
+ placeHolder: '請輸入推播內容',
1579
+ callback: text => {
1580
+ postData.content = text;
1581
+ },
1582
+ }),
1583
+ ].join('');
1584
+ },
1585
+ divCreate: {},
1586
+ };
1587
+ }))}
1588
+ </div>
1589
+ </div>
1590
+ ${obj.type === 'replace'
1591
+ ? html `
1592
+ <div class="d-flex w-100 mt-2">
1593
+ <div class="flex-fill"></div>
1594
+ ${BgWidget.redButton('刪除樣本', obj.gvc.event(() => {
1595
+ const dialog = new ShareDialog(obj.gvc.glitter);
1596
+ dialog.checkYesOrNot({
1597
+ text: '是否確認刪除樣本?',
1598
+ callback: response => {
1599
+ if (response) {
1600
+ dialog.dataLoading({ visible: true });
1601
+ ApiPost.delete({
1602
+ id: postData.id,
1603
+ }).then(res => {
1604
+ dialog.dataLoading({ visible: false });
1605
+ if (res.result) {
1606
+ vm.type = 'list';
1607
+ }
1608
+ else {
1609
+ dialog.errorMessage({ text: '刪除失敗' });
1610
+ }
1611
+ });
1612
+ }
1613
+ },
1614
+ });
1615
+ }))}
1616
+ </div>
1617
+ `
1618
+ : ``}
1619
+ <div class="update-bar-container">
1620
+ ${BgWidget.cancel(gvc.event(() => {
1621
+ vm.type = 'list';
1622
+ }))}
1623
+ ${BgWidget.save(gvc.event(() => {
1624
+ const dialog = new ShareDialog(gvc.glitter);
1625
+ if (obj.type === 'replace') {
1626
+ dialog.dataLoading({ text: '變更信件', visible: true });
1627
+ ApiPost.put({
1628
+ postData: postData,
1629
+ token: window.parent.saasConfig.config.token,
1630
+ type: 'manager',
1631
+ }).then(re => {
1632
+ dialog.dataLoading({ visible: false });
1633
+ if (re.result) {
1634
+ vm.status = 'list';
1635
+ dialog.successMessage({ text: '上傳成功' });
1636
+ }
1637
+ else {
1638
+ dialog.errorMessage({ text: '上傳失敗' });
1639
+ }
1640
+ });
1641
+ }
1642
+ else {
1643
+ dialog.dataLoading({ text: '新增信件', visible: true });
1644
+ ApiPost.post({
1645
+ postData: postData,
1646
+ token: window.parent.saasConfig.config.token,
1647
+ type: 'manager',
1648
+ }).then(re => {
1649
+ dialog.dataLoading({ visible: false });
1650
+ if (re.result) {
1651
+ vm.type = 'list';
1652
+ dialog.successMessage({ text: '上傳成功' });
1653
+ }
1654
+ else {
1655
+ dialog.errorMessage({ text: '上傳失敗' });
1656
+ }
1657
+ });
1658
+ }
1659
+ }))}
1660
+ </div>`)}
1661
+ `);
1662
+ }
1663
+ static fcmDevice(gvc, type = 'list', callback = () => { }) {
1664
+ const vm = {
1665
+ type: 'list',
1666
+ data: {
1667
+ id: 61,
1668
+ userID: 549313940,
1669
+ account: 'jianzhi.wang@homee.ai',
1670
+ userData: { name: '王建智', email: 'jianzhi.wang@homee.ai', phone: '0978028739' },
1671
+ created_time: '2023-11-26T02:14:09.000Z',
1672
+ role: 0,
1673
+ company: null,
1674
+ status: 1,
1675
+ },
1676
+ dataList: undefined,
1677
+ query: '',
1678
+ };
1679
+ const glitter = gvc.glitter;
1680
+ const filterID = glitter.getUUID();
1681
+ const id = glitter.getUUID();
1682
+ const dialog = new ShareDialog(gvc.glitter);
1683
+ return gvc.bindView(() => {
1684
+ return {
1685
+ bind: id,
1686
+ view: () => {
1687
+ let vmi = undefined;
1688
+ function getDatalist() {
1689
+ let interval = 0;
1690
+ return vm.dataList.map((dd) => {
1691
+ var _a;
1692
+ return [
1693
+ {
1694
+ key: '用戶ID',
1695
+ value: `<span class="fs-7">${(_a = dd.userID) !== null && _a !== void 0 ? _a : '尚未登入'}</span>`,
1696
+ },
1697
+ {
1698
+ key: '用戶名稱',
1699
+ value: `<span class="fs-7">${dd.userData ? dd.userData.name : '尚未登入'}</span>`,
1700
+ },
1701
+ {
1702
+ key: '訂閱Token',
1703
+ value: `<span class="fs-7">${Tool.truncateString(dd.deviceToken, 40)}</span>`,
1704
+ },
1705
+ ];
1706
+ });
1707
+ }
1708
+ return BgWidget.container(html `
1709
+ <div class="title-container ${type === 'select' ? `d-none` : ``}">
1710
+ ${BgWidget.title('已訂閱裝置')}
1711
+ <div class="flex-fill"></div>
1712
+ </div>
1713
+ ${BgWidget.container(BgWidget.mainCard([
1714
+ BgWidget.searchPlace(gvc.event(e => {
1715
+ vm.query = e.value;
1716
+ gvc.notifyDataChange(id);
1717
+ }), vm.query || '', '搜尋信箱或者標籤'),
1718
+ BgWidget.tableV3({
1719
+ gvc: gvc,
1720
+ getData: vmk => {
1721
+ vmi = vmk;
1722
+ const limit = 20;
1723
+ ApiUser.getFCM({
1724
+ page: vmi.page - 1,
1725
+ limit: limit,
1726
+ search: vm.query || undefined,
1727
+ }).then(data => {
1728
+ vm.dataList = data.response.data;
1729
+ vmi.pageSize = Math.ceil(data.response.total / limit);
1730
+ vmi.originalData = vm.dataList;
1731
+ vmi.tableData = getDatalist();
1732
+ vmi.loading = false;
1733
+ vmi.callback();
1734
+ if (type === 'select') {
1735
+ callback(vm.dataList.filter((dd) => {
1736
+ return dd.checked;
1737
+ }));
1738
+ }
1739
+ });
1740
+ },
1741
+ rowClick: (data, index) => {
1742
+ vm.dataList[index].checked = !vm.dataList[index].checked;
1743
+ vmi.data = getDatalist();
1744
+ vmi.callback();
1745
+ gvc.notifyDataChange(filterID);
1746
+ callback(vm.dataList.filter((dd) => {
1747
+ return dd.checked;
1748
+ }));
1749
+ },
1750
+ filter: [
1751
+ {
1752
+ name: '批量移除',
1753
+ event: checkedData => {
1754
+ dialog.checkYesOrNot({
1755
+ text: '是否確認刪除所選項目?',
1756
+ callback: response => {
1757
+ if (response) {
1758
+ dialog.dataLoading({ visible: true });
1759
+ ApiUser.deleteSubscribe({
1760
+ email: checkedData.map((dd) => dd.email).join(`,`),
1761
+ }).then(res => {
1762
+ dialog.dataLoading({ visible: false });
1763
+ if (res.result) {
1764
+ vm.dataList = undefined;
1765
+ gvc.notifyDataChange(id);
1766
+ }
1767
+ else {
1768
+ dialog.errorMessage({ text: '刪除失敗' });
1769
+ }
1770
+ });
1771
+ }
1772
+ },
1773
+ });
1774
+ },
1775
+ },
1776
+ ],
1777
+ }),
1778
+ ].join('')))}
1779
+ `);
1780
+ },
1781
+ divCreate: {
1782
+ class: type === 'select' ? `m-n4` : ``,
1783
+ },
1784
+ };
1785
+ });
1786
+ }
1787
+ static fcmSetting(gvc) {
1788
+ const glitter = gvc.glitter;
1789
+ const vm = {
1790
+ type: 'list',
1791
+ data: undefined,
1792
+ dataList: undefined,
1793
+ query: undefined,
1794
+ };
1795
+ return gvc.bindView(() => {
1796
+ const id = glitter.getUUID();
1797
+ const filterID = glitter.getUUID();
1798
+ return {
1799
+ bind: id,
1800
+ dataList: [{ obj: vm, key: 'type' }],
1801
+ view: () => {
1802
+ if (vm.type === 'list') {
1803
+ return BgWidget.container(html `
1804
+ <div class="title-container">
1805
+ ${BgWidget.title('推播訊息管理')}
1806
+ <div class="flex-fill"></div>
1807
+ ${BgWidget.darkButton('新增推播', gvc.event(() => {
1808
+ vm.data = undefined;
1809
+ vm.type = 'add';
1810
+ }))}
1811
+ </div>
1812
+ ${BgWidget.container(BgWidget.mainCard([
1813
+ BgWidget.searchPlace(gvc.event(e => {
1814
+ vm.query = e.value;
1815
+ gvc.notifyDataChange(id);
1816
+ }), vm.query || '', '搜尋所有信件內容'),
1817
+ BgWidget.tableV3({
1818
+ gvc: gvc,
1819
+ getData: vmi => {
1820
+ const limit = 20;
1821
+ ApiPost.getManagerPost({
1822
+ page: vmi.page - 1,
1823
+ limit: limit,
1824
+ search: vm.query ? [`title->${vm.query}`] : undefined,
1825
+ type: 'notify-message-config',
1826
+ }).then(data => {
1827
+ function getDatalist() {
1828
+ return data.response.data.map((dd) => {
1829
+ return [
1830
+ {
1831
+ key: '推播標題',
1832
+ value: `<span class="fs-7">${dd.content.title}</span>`,
1833
+ },
1834
+ {
1835
+ key: '推播內文',
1836
+ value: `<span class="fs-7">${Tool.truncateString(dd.content.content.replace(/<[^>]*>/g, ''), 30)}</span>`,
1837
+ },
1838
+ {
1839
+ key: '發送推播',
1840
+ value: html `<button
1841
+ class="btn btn-primary-c px-4"
1842
+ style="width:20px !important;height: 30px;"
1843
+ onclick="${gvc.event((e, event) => {
1844
+ event.stopPropagation();
1845
+ gvc.glitter.innerDialog(gvc => {
1846
+ let dataList = [];
1847
+ return html `
1848
+ <div style="max-height: calc(100vh - 100px);overflow-y: auto;">
1849
+ ${BgWidget.container(BgWidget.card([
1850
+ html `
1851
+ <div class="title-container">
1852
+ ${BgWidget.goBack(gvc.event(() => {
1853
+ gvc.closeDialog();
1854
+ }))}
1855
+ ${BgWidget.title(`選擇群發對象`)}
1856
+ <div class="flex-fill"></div>
1857
+ <button
1858
+ class="btn bt_c39 me-2"
1859
+ style="height:38px;font-size: 14px;"
1860
+ onclick="${gvc.event(() => {
1861
+ const dialog = new ShareDialog(gvc.glitter);
1862
+ dialog.dataLoading({
1863
+ text: '發送中...',
1864
+ visible: true,
1865
+ });
1866
+ ApiFcm.send({
1867
+ device_token: ['all'],
1868
+ title: dd.content.title,
1869
+ content: dd.content.content,
1870
+ link: dd.content.link,
1871
+ }).then(() => {
1872
+ dialog.dataLoading({ visible: false });
1873
+ dialog.successMessage({ text: `發送成功` });
1874
+ });
1875
+ })}"
1876
+ >
1877
+ 發送給所有用戶
1878
+ </button>
1879
+ <button
1880
+ class="btn bt_c39"
1881
+ style="height:38px;font-size: 14px;"
1882
+ onclick="${gvc.event(() => {
1883
+ const dialog = new ShareDialog(gvc.glitter);
1884
+ if (dataList.length > 0) {
1885
+ dialog.dataLoading({
1886
+ text: '發送中...',
1887
+ visible: true,
1888
+ });
1889
+ ApiFcm.send({
1890
+ device_token: dataList.map((dd) => {
1891
+ return dd.deviceToken;
1892
+ }),
1893
+ title: dd.content.title,
1894
+ content: dd.content.content,
1895
+ link: dd.content.link,
1896
+ }).then(() => {
1897
+ dialog.dataLoading({ visible: false });
1898
+ dialog.successMessage({ text: '發送成功' });
1899
+ });
1900
+ }
1901
+ else {
1902
+ dialog.errorMessage({ text: '請選擇發送對象' });
1903
+ }
1904
+ })}"
1905
+ >
1906
+ 確認並發送
1907
+ </button>
1908
+ </div>
1909
+ ` +
1910
+ BgNotify.fcmDevice(gvc, 'select', data => {
1911
+ dataList = data;
1912
+ }),
1913
+ ].join('')))}
1914
+ <div></div>
1915
+ </div>
1916
+ `;
1917
+ }, 'email');
1918
+ })}"
1919
+ >
1920
+ <i class="fa-sharp fa-regular fa-paper-plane-top"></i>
1921
+ </button>`,
1922
+ },
1923
+ ];
1924
+ });
1925
+ }
1926
+ vm.dataList = data.response.data;
1927
+ vmi.pageSize = Math.ceil(data.response.total / limit);
1928
+ vmi.originalData = vm.dataList;
1929
+ vmi.tableData = getDatalist();
1930
+ vmi.loading = false;
1931
+ vmi.callback();
1932
+ });
1933
+ },
1934
+ rowClick: (data, index) => {
1935
+ vm.data = vm.dataList[index].content;
1936
+ vm.type = 'replace';
1937
+ },
1938
+ filter: [
1939
+ {
1940
+ name: '批量移除',
1941
+ event: checkedData => {
1942
+ const dialog = new ShareDialog(glitter);
1943
+ dialog.checkYesOrNot({
1944
+ text: '是否確認刪除所選項目?',
1945
+ callback: response => {
1946
+ if (response) {
1947
+ dialog.dataLoading({ visible: true });
1948
+ ApiPost.delete({
1949
+ id: checkedData.map((dd) => dd.id).join(`,`),
1950
+ }).then(res => {
1951
+ dialog.dataLoading({ visible: false });
1952
+ if (res.result) {
1953
+ vm.dataList = undefined;
1954
+ gvc.notifyDataChange(id);
1955
+ }
1956
+ else {
1957
+ dialog.errorMessage({ text: '刪除失敗' });
1958
+ }
1959
+ });
1960
+ }
1961
+ },
1962
+ });
1963
+ },
1964
+ },
1965
+ ],
1966
+ }),
1967
+ ].join('')))}
1968
+ `);
1969
+ }
1970
+ else if (vm.type == 'replace') {
1971
+ return this.fcmEditor({
1972
+ vm: vm,
1973
+ gvc: gvc,
1974
+ type: 'replace',
1975
+ });
1976
+ }
1977
+ else {
1978
+ return this.fcmEditor({
1979
+ vm: vm,
1980
+ gvc: gvc,
1981
+ type: 'add',
1982
+ });
1983
+ }
1984
+ },
1985
+ };
1986
+ });
1987
+ }
1988
+ static rebackMessage(gvc, type = 'list', callback = () => { }) {
1989
+ const vm = {
1990
+ type: 'list',
1991
+ data: {
1992
+ id: 61,
1993
+ userID: 549313940,
1994
+ account: 'jianzhi.wang@homee.ai',
1995
+ userData: { name: '王建智', email: 'jianzhi.wang@homee.ai', phone: '0978028739' },
1996
+ created_time: '2023-11-26T02:14:09.000Z',
1997
+ role: 0,
1998
+ company: null,
1999
+ status: 1,
2000
+ },
2001
+ dataList: undefined,
2002
+ query: '',
2003
+ };
2004
+ const glitter = gvc.glitter;
2005
+ const filterID = glitter.getUUID();
2006
+ const id = glitter.getUUID();
2007
+ return gvc.bindView(() => {
2008
+ return {
2009
+ bind: id,
2010
+ view: () => {
2011
+ let vmi = undefined;
2012
+ function getDatalist() {
2013
+ let interval = 0;
2014
+ return vm.dataList.map((dd) => {
2015
+ var _a;
2016
+ return [
2017
+ {
2018
+ key: '名稱',
2019
+ value: `<span class="fs-7">${dd.content.name}</span>`,
2020
+ },
2021
+ {
2022
+ key: '信箱',
2023
+ value: `<span class="fs-7">${dd.content.email}</span>`,
2024
+ },
2025
+ {
2026
+ key: '標題',
2027
+ value: `<span class="fs-7">${dd.content.title}</span>`,
2028
+ },
2029
+ {
2030
+ key: '內文',
2031
+ value: `<span class="fs-7">${Tool.truncateString((_a = dd.content.content) !== null && _a !== void 0 ? _a : '', 30)}</span>`,
2032
+ },
2033
+ ];
2034
+ });
2035
+ }
2036
+ if (vm.type === 'replace') {
2037
+ return BgWidget.container(html `
2038
+ <div class="title-container">
2039
+ ${BgWidget.goBack(gvc.event(() => {
2040
+ vm.type = 'list';
2041
+ gvc.notifyDataChange(id);
2042
+ }))}
2043
+ ${BgWidget.title(`用戶回饋內容`)}
2044
+ <div class="flex-fill"></div>
2045
+ </div>
2046
+ ${BgWidget.card(` ${FormWidget.editorView({
2047
+ gvc: gvc,
2048
+ array: [
2049
+ {
2050
+ key: 'name',
2051
+ type: 'name',
2052
+ title: '姓名',
2053
+ require: 'true',
2054
+ readonly: 'read',
2055
+ style_data: {
2056
+ input: {
2057
+ class: '',
2058
+ style: '',
2059
+ },
2060
+ label: {
2061
+ class: 'form-label fs-base ',
2062
+ style: '',
2063
+ },
2064
+ container: {
2065
+ tag: 'aboutus-container',
2066
+ class: '',
2067
+ style: '',
2068
+ stylist: [],
2069
+ dataType: 'static',
2070
+ style_from: 'tag',
2071
+ classDataType: 'static',
2072
+ },
2073
+ },
2074
+ },
2075
+ {
2076
+ key: 'email',
2077
+ type: 'email',
2078
+ title: '信箱',
2079
+ require: 'true',
2080
+ readonly: 'read',
2081
+ style_data: {
2082
+ input: {
2083
+ class: '',
2084
+ style: '',
2085
+ },
2086
+ label: {
2087
+ class: 'form-label fs-base ',
2088
+ style: '',
2089
+ },
2090
+ container: {
2091
+ tag: 'aboutus-container',
2092
+ class: '',
2093
+ style: '',
2094
+ stylist: [],
2095
+ style_from: 'tag',
2096
+ },
2097
+ },
2098
+ },
2099
+ {
2100
+ key: 'title',
2101
+ type: 'text',
2102
+ title: '標題',
2103
+ require: 'true',
2104
+ readonly: 'read',
2105
+ style_data: {
2106
+ input: {
2107
+ class: '',
2108
+ style: '',
2109
+ },
2110
+ label: {
2111
+ class: 'form-label fs-base ',
2112
+ style: '',
2113
+ },
2114
+ container: {
2115
+ tag: 'aboutus-container',
2116
+ class: '',
2117
+ style: '',
2118
+ stylist: [],
2119
+ dataType: 'static',
2120
+ style_from: 'tag',
2121
+ classDataType: 'static',
2122
+ },
2123
+ },
2124
+ },
2125
+ {
2126
+ key: 'content',
2127
+ type: 'textArea',
2128
+ title: '訊息',
2129
+ require: 'true',
2130
+ readonly: 'read',
2131
+ style_data: {
2132
+ input: {
2133
+ class: '',
2134
+ style: '',
2135
+ },
2136
+ label: {
2137
+ class: 'form-label fs-base ',
2138
+ style: '',
2139
+ },
2140
+ container: {
2141
+ class: '',
2142
+ style: '',
2143
+ },
2144
+ },
2145
+ },
2146
+ ],
2147
+ refresh: () => { },
2148
+ formData: vm.data.content,
2149
+ })}`)}
2150
+ `);
2151
+ }
2152
+ return BgWidget.container(html `
2153
+ <div class="title-container ${type === 'select' ? `d-none` : ``}">
2154
+ ${BgWidget.title('回饋信件')}
2155
+ <div class="flex-fill"></div>
2156
+ </div>
2157
+ ${BgWidget.mainCard([
2158
+ BgWidget.searchPlace(gvc.event((e, event) => {
2159
+ vm.query = e.value;
2160
+ gvc.notifyDataChange(id);
2161
+ }), vm.query || '', '搜尋標題'),
2162
+ BgWidget.tableV3({
2163
+ gvc: gvc,
2164
+ getData: vmi => {
2165
+ const limit = 20;
2166
+ ApiPost.getUserPost({
2167
+ page: vmi.page - 1,
2168
+ limit: limit,
2169
+ search: vm.query || undefined,
2170
+ type: 'userQuestion',
2171
+ }).then(data => {
2172
+ vm.dataList = data.response.data;
2173
+ vmi.pageSize = Math.ceil(data.response.total / limit);
2174
+ vmi.originalData = vm.dataList;
2175
+ vmi.tableData = getDatalist();
2176
+ vmi.loading = false;
2177
+ vmi.callback();
2178
+ if (type === 'select') {
2179
+ callback(vm.dataList.filter((dd) => {
2180
+ return dd.checked;
2181
+ }));
2182
+ }
2183
+ });
2184
+ },
2185
+ rowClick: (data, index) => {
2186
+ vm.type = 'replace';
2187
+ vm.data = vm.dataList[index];
2188
+ gvc.notifyDataChange(id);
2189
+ },
2190
+ filter: [
2191
+ {
2192
+ name: '批量刪除',
2193
+ event: () => {
2194
+ const dialog = new ShareDialog(gvc.glitter);
2195
+ dialog.checkYesOrNot({
2196
+ text: '是否確認刪除所選項目?',
2197
+ callback: response => {
2198
+ if (response) {
2199
+ dialog.dataLoading({ visible: true });
2200
+ ApiPost.deleteUserPost({
2201
+ id: vm.dataList
2202
+ .filter((dd) => {
2203
+ return dd.checked;
2204
+ })
2205
+ .map((dd) => {
2206
+ return dd.id;
2207
+ })
2208
+ .join(`,`),
2209
+ }).then(res => {
2210
+ dialog.dataLoading({ visible: false });
2211
+ if (res.result) {
2212
+ vm.dataList = undefined;
2213
+ gvc.notifyDataChange(id);
2214
+ }
2215
+ else {
2216
+ dialog.errorMessage({ text: '刪除失敗' });
2217
+ }
2218
+ });
2219
+ }
2220
+ },
2221
+ });
2222
+ },
2223
+ },
2224
+ ],
2225
+ }),
2226
+ ].join(''))}
2227
+ `);
2228
+ },
2229
+ divCreate: {
2230
+ class: type === 'select' ? `m-n4` : ``,
2231
+ },
2232
+ };
2233
+ });
2234
+ }
2235
+ static customerMessage(gvc, type = 'list', callback = () => { }) {
2236
+ const vm = {
2237
+ type: 'list',
2238
+ data: {
2239
+ id: 61,
2240
+ userID: 549313940,
2241
+ account: 'jianzhi.wang@homee.ai',
2242
+ userData: { name: '王建智', email: 'jianzhi.wang@homee.ai', phone: '0978028739' },
2243
+ created_time: '2023-11-26T02:14:09.000Z',
2244
+ role: 0,
2245
+ company: null,
2246
+ status: 1,
2247
+ },
2248
+ dataList: undefined,
2249
+ query: '',
2250
+ };
2251
+ const glitter = gvc.glitter;
2252
+ const filterID = glitter.getUUID();
2253
+ const id = glitter.getUUID();
2254
+ const dialog = new ShareDialog(gvc.glitter);
2255
+ return gvc.bindView(() => {
2256
+ return {
2257
+ bind: id,
2258
+ view: () => {
2259
+ let vmi = undefined;
2260
+ function getDatalist() {
2261
+ let interval = 0;
2262
+ return vm.dataList.map((dd) => {
2263
+ return [
2264
+ {
2265
+ key: (() => {
2266
+ clearInterval(interval);
2267
+ if (!vm.dataList.find((dd) => {
2268
+ return !dd.checked;
2269
+ })) {
2270
+ interval = setTimeout(() => {
2271
+ ApiUser.getFCM({
2272
+ page: vmi.page - 1,
2273
+ limit: 100000,
2274
+ search: vm.query || undefined,
2275
+ }).then(data => {
2276
+ callback(data.response.data);
2277
+ });
2278
+ }, 10);
2279
+ }
2280
+ return EditorElem.checkBoxOnly({
2281
+ gvc: gvc,
2282
+ def: !vm.dataList.find((dd) => {
2283
+ return !dd.checked;
2284
+ }),
2285
+ callback: result => {
2286
+ vm.dataList.map((dd) => {
2287
+ dd.checked = result;
2288
+ });
2289
+ vmi.data = getDatalist();
2290
+ vmi.callback();
2291
+ gvc.notifyDataChange(filterID);
2292
+ callback(vm.dataList.filter((dd) => {
2293
+ return dd.checked;
2294
+ }));
2295
+ },
2296
+ });
2297
+ })(),
2298
+ value: EditorElem.checkBoxOnly({
2299
+ gvc: gvc,
2300
+ def: dd.checked,
2301
+ callback: result => {
2302
+ dd.checked = result;
2303
+ vmi.data = getDatalist();
2304
+ vmi.callback();
2305
+ gvc.notifyDataChange(filterID);
2306
+ callback(vm.dataList.filter((dd) => {
2307
+ return dd.checked;
2308
+ }));
2309
+ },
2310
+ style: 'height:25px;',
2311
+ }),
2312
+ },
2313
+ {
2314
+ key: '名稱',
2315
+ value: `<span class="fs-7">${dd.user_data ? dd.user_data.userData.name : `訪客`}</span>`,
2316
+ },
2317
+ {
2318
+ key: '信箱',
2319
+ value: `<span class="fs-7">${dd.user_data ? dd.user_data.userData.email : `...`}</span>`,
2320
+ },
2321
+ {
2322
+ key: '訊息內容',
2323
+ value: `<span class="fs-7">${dd.topMessage ? dd.topMessage.text : ``}</span>`,
2324
+ },
2325
+ ];
2326
+ });
2327
+ }
2328
+ if (vm.type === 'replace') {
2329
+ return BgWidget.container(html `
2330
+ <div class="title-container">
2331
+ ${BgWidget.goBack(gvc.event(() => {
2332
+ vm.type = 'list';
2333
+ gvc.notifyDataChange(id);
2334
+ }))}
2335
+ ${BgWidget.title(`客服訊息`)}
2336
+ <div class="flex-fill"></div>
2337
+ </div>
2338
+ ${BgWidget.card(` ${FormWidget.editorView({
2339
+ gvc: gvc,
2340
+ array: [
2341
+ {
2342
+ key: 'name',
2343
+ type: 'name',
2344
+ title: '姓名',
2345
+ require: 'true',
2346
+ readonly: 'read',
2347
+ style_data: {
2348
+ input: {
2349
+ class: '',
2350
+ style: '',
2351
+ },
2352
+ label: {
2353
+ class: 'form-label fs-base ',
2354
+ style: '',
2355
+ },
2356
+ container: {
2357
+ tag: 'aboutus-container',
2358
+ class: '',
2359
+ style: '',
2360
+ stylist: [],
2361
+ dataType: 'static',
2362
+ style_from: 'tag',
2363
+ classDataType: 'static',
2364
+ },
2365
+ },
2366
+ },
2367
+ {
2368
+ key: 'email',
2369
+ type: 'email',
2370
+ title: '信箱',
2371
+ require: 'true',
2372
+ readonly: 'read',
2373
+ style_data: {
2374
+ input: {
2375
+ class: '',
2376
+ style: '',
2377
+ },
2378
+ label: {
2379
+ class: 'form-label fs-base ',
2380
+ style: '',
2381
+ },
2382
+ container: {
2383
+ tag: 'aboutus-container',
2384
+ class: '',
2385
+ style: '',
2386
+ stylist: [],
2387
+ style_from: 'tag',
2388
+ },
2389
+ },
2390
+ },
2391
+ {
2392
+ key: 'title',
2393
+ type: 'text',
2394
+ title: '標題',
2395
+ require: 'true',
2396
+ readonly: 'read',
2397
+ style_data: {
2398
+ input: {
2399
+ class: '',
2400
+ style: '',
2401
+ },
2402
+ label: {
2403
+ class: 'form-label fs-base ',
2404
+ style: '',
2405
+ },
2406
+ container: {
2407
+ tag: 'aboutus-container',
2408
+ class: '',
2409
+ style: '',
2410
+ stylist: [],
2411
+ dataType: 'static',
2412
+ style_from: 'tag',
2413
+ classDataType: 'static',
2414
+ },
2415
+ },
2416
+ },
2417
+ {
2418
+ key: 'content',
2419
+ type: 'textArea',
2420
+ title: '訊息',
2421
+ require: 'true',
2422
+ readonly: 'read',
2423
+ style_data: {
2424
+ input: {
2425
+ class: '',
2426
+ style: '',
2427
+ },
2428
+ label: {
2429
+ class: 'form-label fs-base ',
2430
+ style: '',
2431
+ },
2432
+ container: {
2433
+ class: '',
2434
+ style: '',
2435
+ },
2436
+ },
2437
+ },
2438
+ ],
2439
+ refresh: () => { },
2440
+ formData: vm.data.content,
2441
+ })}`)}
2442
+ `);
2443
+ }
2444
+ return BgWidget.container(html `
2445
+ <div class="title-container ${type === 'select' ? `d-none` : ``}">
2446
+ ${BgWidget.title('客服訊息')}
2447
+ <div class="flex-fill"></div>
2448
+ <button
2449
+ class="btn hoverBtn me-2 px-3"
2450
+ style="height:35px !important;font-size: 14px;color:black;border:1px solid black;"
2451
+ onclick="${gvc.event(() => {
2452
+ EditorElem.openEditorDialog(gvc, gvc => {
2453
+ const saasConfig = window.saasConfig;
2454
+ const id = gvc.glitter.getUUID();
2455
+ let keyData = {};
2456
+ return [
2457
+ gvc.bindView(() => {
2458
+ ApiUser.getPublicConfig(`robot_auto_reply`, 'manager').then((data) => {
2459
+ if (data.response.value) {
2460
+ keyData = data.response.value;
2461
+ gvc.notifyDataChange(id);
2462
+ }
2463
+ });
2464
+ return {
2465
+ bind: id,
2466
+ view: () => {
2467
+ return new Promise((resolve, reject) => {
2468
+ resolve(FormWidget.editorView({
2469
+ gvc: gvc,
2470
+ array: [
2471
+ {
2472
+ title: '機器人問答',
2473
+ key: 'question',
2474
+ readonly: 'write',
2475
+ type: 'array',
2476
+ require: 'true',
2477
+ style_data: {
2478
+ label: {
2479
+ class: 'form-label fs-base ',
2480
+ style: '',
2481
+ },
2482
+ input: { class: '', style: '' },
2483
+ container: {
2484
+ class: '',
2485
+ style: '',
2486
+ },
2487
+ },
2488
+ referTitile: 'ask',
2489
+ plusBtn: '添加自動問答',
2490
+ formList: [
2491
+ {
2492
+ title: '問題',
2493
+ key: 'ask',
2494
+ readonly: 'write',
2495
+ type: 'text',
2496
+ require: 'true',
2497
+ style_data: {
2498
+ label: {
2499
+ class: 'form-label fs-base ',
2500
+ style: '',
2501
+ },
2502
+ input: {
2503
+ class: '',
2504
+ style: '',
2505
+ },
2506
+ container: {
2507
+ class: '',
2508
+ style: '',
2509
+ },
2510
+ },
2511
+ },
2512
+ {
2513
+ title: '回應',
2514
+ key: 'response',
2515
+ readonly: 'write',
2516
+ type: 'textArea',
2517
+ require: 'true',
2518
+ style_data: {
2519
+ label: {
2520
+ class: 'form-label fs-base ',
2521
+ style: '',
2522
+ },
2523
+ input: {
2524
+ class: '',
2525
+ style: '',
2526
+ },
2527
+ container: {
2528
+ class: '',
2529
+ style: '',
2530
+ },
2531
+ },
2532
+ },
2533
+ ],
2534
+ },
2535
+ ],
2536
+ refresh: () => {
2537
+ gvc.notifyDataChange(id);
2538
+ },
2539
+ formData: keyData,
2540
+ }));
2541
+ });
2542
+ },
2543
+ divCreate: {
2544
+ class: 'p-2',
2545
+ },
2546
+ };
2547
+ }),
2548
+ html `<div class="d-flex">
2549
+ <div class="flex-fill"></div>
2550
+ <div
2551
+ class=" btn-primary-c btn my-2 me-2"
2552
+ style="margin-left: 10px;height:35px;"
2553
+ onclick="${gvc.event(() => {
2554
+ dialog.dataLoading({ visible: true });
2555
+ ApiUser.setPublicConfig({
2556
+ key: `robot_auto_reply`,
2557
+ value: keyData,
2558
+ user_id: 'manager',
2559
+ }).then((data) => {
2560
+ dialog.dataLoading({ visible: false });
2561
+ dialog.successMessage({ text: '設定成功' });
2562
+ });
2563
+ })}"
2564
+ >
2565
+ 儲存設定
2566
+ </div>
2567
+ </div>`,
2568
+ ].join('');
2569
+ }, () => { }, 500, '自訂表單');
2570
+ })}"
2571
+ >
2572
+ <i class="fa-regular fa-gear me-2 "></i>
2573
+ 機器人問答
2574
+ </button>
2575
+ </div>
2576
+ ${BgWidget.table({
2577
+ gvc: gvc,
2578
+ getData: vmk => {
2579
+ vmi = vmk;
2580
+ Chat.getChatRoom({
2581
+ page: vmi.page - 1,
2582
+ limit: 20,
2583
+ user_id: 'manager',
2584
+ }).then(data => {
2585
+ vmi.pageSize = Math.ceil(data.response.total / 20);
2586
+ vm.dataList = data.response.data;
2587
+ vmi.data = getDatalist();
2588
+ vmi.loading = false;
2589
+ vmi.callback();
2590
+ if (type === 'select') {
2591
+ callback(vm.dataList.filter((dd) => {
2592
+ return dd.checked;
2593
+ }));
2594
+ }
2595
+ });
2596
+ },
2597
+ rowClick: (data, index) => {
2598
+ gvc.glitter.innerDialog(() => {
2599
+ return EditorElem.iframeComponent({
2600
+ page: 'chat_page',
2601
+ width: 400,
2602
+ height: 680,
2603
+ par: [
2604
+ {
2605
+ key: 'is_manager',
2606
+ value: 'true',
2607
+ },
2608
+ {
2609
+ key: 'chat_who',
2610
+ value: vm.dataList[index].who,
2611
+ },
2612
+ ],
2613
+ });
2614
+ }, '');
2615
+ },
2616
+ filter: html `
2617
+ <div style="height:50px;" class="w-100 border-bottom ">
2618
+ <input
2619
+ class="form-control h-100 "
2620
+ style="border: none;"
2621
+ placeholder="搜尋用戶名稱"
2622
+ onchange="${gvc.event((e, event) => {
2623
+ vm.query = e.value;
2624
+ gvc.notifyDataChange(id);
2625
+ })}"
2626
+ value="${vm.query || ''}"
2627
+ />
2628
+ </div>
2629
+ ${gvc.bindView(() => {
2630
+ return {
2631
+ bind: filterID,
2632
+ view: () => {
2633
+ if (!vm.dataList ||
2634
+ !vm.dataList.find((dd) => {
2635
+ return dd.checked;
2636
+ })) {
2637
+ return ``;
2638
+ }
2639
+ else {
2640
+ const dialog = new ShareDialog(gvc.glitter);
2641
+ const selCount = vm.dataList.filter((dd) => dd.checked).length;
2642
+ return BgWidget.selNavbar({
2643
+ count: selCount,
2644
+ buttonList: [
2645
+ BgWidget.selEventButton('批量移除', gvc.event(() => {
2646
+ dialog.checkYesOrNot({
2647
+ text: '是否確認刪除所選項目?',
2648
+ callback: response => {
2649
+ if (response) {
2650
+ dialog.dataLoading({ visible: true });
2651
+ Chat.deleteChatRoom({
2652
+ id: vm.dataList
2653
+ .filter((dd) => {
2654
+ return dd.checked;
2655
+ })
2656
+ .map((dd) => {
2657
+ return dd.id;
2658
+ })
2659
+ .join(`,`),
2660
+ }).then(res => {
2661
+ dialog.dataLoading({ visible: false });
2662
+ if (res.result) {
2663
+ vm.dataList = undefined;
2664
+ gvc.notifyDataChange(id);
2665
+ }
2666
+ else {
2667
+ dialog.errorMessage({ text: '刪除失敗' });
2668
+ }
2669
+ });
2670
+ }
2671
+ },
2672
+ });
2673
+ })),
2674
+ ],
2675
+ });
2676
+ }
2677
+ },
2678
+ divCreate: () => {
2679
+ return {
2680
+ class: `d-flex align-items-center p-2 py-3 ${!vm.dataList ||
2681
+ !vm.dataList.find((dd) => {
2682
+ return dd.checked;
2683
+ }) ||
2684
+ type === 'select'
2685
+ ? `d-none`
2686
+ : ``}`,
2687
+ style: ``,
2688
+ };
2689
+ },
2690
+ };
2691
+ })}
2692
+ `,
2693
+ })}
2694
+ `);
2695
+ },
2696
+ divCreate: {
2697
+ class: type === 'select' ? `m-n4` : ``,
2698
+ },
2699
+ };
2700
+ });
2701
+ }
2702
+ }
2703
+ function defaultEmailText() {
2704
+ return `親愛的 [使用者名稱],
2705
+
2706
+ 歡迎來到 [你的公司或社群名稱]!我們很高興你選擇了我們,並成為我們社群的一員。
2707
+
2708
+ 在這裡,我們致力於提供 [描述你的服務或社群的價值]。我們的團隊一直在努力讓你有一個令人愉快和有價值的體驗。
2709
+
2710
+ 以下是一些建議的下一步:
2711
+
2712
+ 1. **完善個人資料:** 請登入您的帳戶,完善您的個人資料,這有助於我們更好地瞭解您的需求。
2713
+
2714
+ 2. **參與社群:** 加入我們的社交媒體,訂閱我們的通訊,參與我們的討論,您將有機會與其他社群成員建立聯繫。
2715
+
2716
+ 3. **探索我們的服務:** 探索我們的網站/應用程式,瞭解我們提供的所有功能和服務。
2717
+
2718
+ 如果您在使用過程中遇到任何問題,或者有任何反饋,請隨時與我們聯繫。我們的支援團隊隨時準備協助您。
2719
+
2720
+ 再次感謝您加入 [你的公司或社群名稱],我們期待與您建立長期的合作關係!
2721
+
2722
+ 祝您有美好的一天!
2723
+
2724
+ 最誠摯的問候,
2725
+
2726
+ [你的名稱]
2727
+ [你的職務]
2728
+ [你的公司或社群名稱]
2729
+ [聯絡電子郵件]
2730
+ [聯絡電話]`.replace(/\n/g, `<br>`);
2731
+ }
2732
+ window.glitter.setModule(import.meta.url, BgNotify);