ts-glitter 21.1.8 → 21.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (78) hide show
  1. package/lowcode/Entry.js +14 -1
  2. package/lowcode/Entry.ts +13 -1
  3. package/lowcode/backend-manager/bg-line.js +18 -10
  4. package/lowcode/backend-manager/bg-line.ts +19 -10
  5. package/lowcode/backend-manager/bg-list-component.js +1 -2
  6. package/lowcode/backend-manager/bg-list-component.ts +1 -1
  7. package/lowcode/backend-manager/bg-notify.js +17 -10
  8. package/lowcode/backend-manager/bg-notify.ts +19 -11
  9. package/lowcode/backend-manager/bg-recommend.js +15 -9
  10. package/lowcode/backend-manager/bg-recommend.ts +16 -9
  11. package/lowcode/backend-manager/bg-sns.js +16 -9
  12. package/lowcode/backend-manager/bg-sns.ts +18 -11
  13. package/lowcode/backend-manager/bg-widget.js +325 -261
  14. package/lowcode/backend-manager/bg-widget.ts +117 -45
  15. package/lowcode/cms-plugin/auto-fcm-history.js +15 -6
  16. package/lowcode/cms-plugin/auto-fcm-history.ts +18 -11
  17. package/lowcode/cms-plugin/auto-reply.js +17 -1
  18. package/lowcode/cms-plugin/auto-reply.ts +16 -1
  19. package/lowcode/cms-plugin/exhibition-list.js +11 -2
  20. package/lowcode/cms-plugin/exhibition-list.ts +12 -2
  21. package/lowcode/cms-plugin/live_capture.js +2 -2
  22. package/lowcode/cms-plugin/live_capture.ts +2 -2
  23. package/lowcode/cms-plugin/model/order.d.ts +1 -0
  24. package/lowcode/cms-plugin/module/order-excel.js +15 -1
  25. package/lowcode/cms-plugin/module/order-excel.ts +22 -2
  26. package/lowcode/cms-plugin/module/table-storage.js +11 -0
  27. package/lowcode/cms-plugin/module/table-storage.ts +12 -0
  28. package/lowcode/cms-plugin/permission-setting.js +16 -9
  29. package/lowcode/cms-plugin/permission-setting.ts +18 -10
  30. package/lowcode/cms-plugin/reconciliation-area.js +12 -3
  31. package/lowcode/cms-plugin/reconciliation-area.ts +13 -3
  32. package/lowcode/cms-plugin/shopping-allowance-manager.js +12 -3
  33. package/lowcode/cms-plugin/shopping-allowance-manager.ts +13 -3
  34. package/lowcode/cms-plugin/shopping-invoice-manager.js +12 -3
  35. package/lowcode/cms-plugin/shopping-invoice-manager.ts +13 -4
  36. package/lowcode/cms-plugin/shopping-order-manager.js +12 -3
  37. package/lowcode/cms-plugin/shopping-order-manager.ts +13 -4
  38. package/lowcode/cms-plugin/shopping-product-setting.js +16 -10
  39. package/lowcode/cms-plugin/shopping-product-setting.ts +17 -10
  40. package/lowcode/cms-plugin/shopping-product-stock.js +17 -11
  41. package/lowcode/cms-plugin/shopping-product-stock.ts +18 -11
  42. package/lowcode/cms-plugin/shopping-setting-basic.js +129 -38
  43. package/lowcode/cms-plugin/shopping-setting-basic.ts +134 -38
  44. package/lowcode/cms-plugin/stock-history.js +14 -7
  45. package/lowcode/cms-plugin/stock-history.ts +15 -7
  46. package/lowcode/cms-plugin/stock-stores.js +13 -6
  47. package/lowcode/cms-plugin/stock-stores.ts +14 -6
  48. package/lowcode/cms-plugin/stock-vendors.js +13 -6
  49. package/lowcode/cms-plugin/stock-vendors.ts +14 -6
  50. package/lowcode/cms-plugin/user-list.js +24 -7
  51. package/lowcode/cms-plugin/user-list.ts +25 -7
  52. package/lowcode/css/editor.css +9 -4
  53. package/lowcode/public-components/product/pd-class.js +11 -2
  54. package/lowcode/public-components/product/pd-class.ts +16 -3
  55. package/lowcode/public-components/public/ad.js +42 -10
  56. package/lowcode/public-components/public/ad.ts +28 -1
  57. package/lowcode/public-models/product.ts +1 -0
  58. package/lowcode/view-model/saas-view-model.js +394 -379
  59. package/lowcode/view-model/saas-view-model.ts +1451 -1405
  60. package/package.json +1 -1
  61. package/src/api-public/controllers/user.js +4 -4
  62. package/src/api-public/controllers/user.js.map +1 -1
  63. package/src/api-public/controllers/user.ts +4 -4
  64. package/src/api-public/services/checkout-event.js +7 -17
  65. package/src/api-public/services/checkout-event.js.map +1 -1
  66. package/src/api-public/services/fb-api.d.ts +4 -3
  67. package/src/api-public/services/fb-api.js +71 -27
  68. package/src/api-public/services/fb-api.js.map +1 -1
  69. package/src/api-public/services/fb-api.ts +182 -127
  70. package/src/api-public/services/user.d.ts +6 -5
  71. package/src/api-public/services/user.js +19 -27
  72. package/src/api-public/services/user.js.map +1 -1
  73. package/src/api-public/services/user.ts +14 -10
  74. package/src/seo-config.js +1 -0
  75. package/src/seo-config.js.map +1 -1
  76. package/src/seo-config.ts +1 -0
  77. package/src/services/app.js +7 -17
  78. package/src/services/app.js.map +1 -1
@@ -1,925 +1,949 @@
1
- import {ApiUser} from '../glitter-base/route/user.js';
2
- import {GlobalUser} from '../glitter-base/global/global-user.js';
3
- import {GVC} from '../glitterBundle/GVController.js';
4
- import {ApiPageConfig} from '../api/pageConfig.js';
5
- import {EditorElem} from '../glitterBundle/plugins/editor-elem.js';
6
- import {ShareDialog} from '../glitterBundle/dialog/ShareDialog.js';
7
- import {BaseApi} from '../glitterBundle/api/base.js';
8
- import {BgWidget} from '../backend-manager/bg-widget.js';
9
- import {AiPointsApi} from '../glitter-base/route/ai-points-api.js';
10
- import {SmsPointsApi} from '../glitter-base/route/sms-points-api.js';
1
+ import { ApiUser } from '../glitter-base/route/user.js';
2
+ import { GlobalUser } from '../glitter-base/global/global-user.js';
3
+ import { GVC } from '../glitterBundle/GVController.js';
4
+ import { ApiPageConfig } from '../api/pageConfig.js';
5
+ import { EditorElem } from '../glitterBundle/plugins/editor-elem.js';
6
+ import { ShareDialog } from '../glitterBundle/dialog/ShareDialog.js';
7
+ import { BaseApi } from '../glitterBundle/api/base.js';
8
+ import { BgWidget } from '../backend-manager/bg-widget.js';
9
+ import { AiPointsApi } from '../glitter-base/route/ai-points-api.js';
10
+ import { SmsPointsApi } from '../glitter-base/route/sms-points-api.js';
11
11
 
12
12
  const html = String.raw;
13
13
 
14
14
  export class SaasViewModel {
15
- public static app_manager(gvc: GVC) {
16
- return gvc.bindView(() => {
17
- const id = gvc.glitter.getUUID();
18
- const dialog = new ShareDialog(gvc.glitter);
19
- return {
20
- bind: id,
21
- view: () => {
22
- return new Promise(async (resolve) => {
23
- const userData = (await ApiUser.getSaasUserData(GlobalUser.saas_token, 'me')).response;
24
- if(!userData.phone){
25
- SaasViewModel.accountSetting(gvc);
26
- }
27
- resolve(html`
28
- <div
29
- class="btn btn-outline-secondary dropdown-toggle border-0 px-2 position-relative"
30
- data-bs-toggle="dropdown"
31
- aria-haspopup="true"
32
- aria-expanded="false"
33
- onclick="${gvc.event((e, event) => {
34
- event.stopPropagation();
35
- event.preventDefault();
36
- })}"
37
- disabled="true"
38
- >
39
- <div class="d-flex align-items-center ">
40
- <img
41
- src="https://assets.imgix.net/~text?bg=7ED379&txtclr=ffffff&w=100&h=100&txtsize=40&txt=${userData.userData.name}&txtfont=Helvetica&txtalign=middle,center"
42
- class="rounded-circle"
43
- width="48"
44
- alt="Avatar"
45
- style="width:40px;height:40px;"
46
- />
47
- <div class="d-none d-sm-block ps-2">
48
- <div class="fs-xs lh-1 opacity-60 fw-500">Hello,</div>
49
- <div class="fs-sm fw-500">${userData.userData.name}</div>
50
- </div>
51
- </div>
52
- </div>
53
- <div class="dropdown-menu position-absolute"
54
- style="top:50px; ${document.body.clientWidth > 768 ? 'right: 0 !important;' : 'left: -110px;'}">
55
- <a
56
- class="dropdown-item cursor_pointer d-flex align-items-center"
57
- onclick="${gvc.event(() => {
58
- gvc.glitter.setUrlParameter('tab', 'ai-point');
59
- gvc.recreateView();
60
- })}"
61
- ><img
62
- src="https://d3jnmi1tfjgtti.cloudfront.net/file/234285319/size1440_s*px$_sas0s9s0s1sesas0_1697354801736-Glitterlogo.png"
63
- class="me-2"
64
- style="width:24px;height: 24px;"
65
- />剩餘『${gvc.bindView(() => {
66
- const id = gvc.glitter.getUUID();
67
- const vm = {
68
- loading: true,
69
- sum: 0,
70
- };
71
- AiPointsApi.getSum({}).then((res) => {
72
- vm.sum = parseInt(res.response.sum, 10);
73
- vm.loading = false;
74
-
75
- gvc.notifyDataChange(id);
76
- });
77
- return {
78
- bind: id,
79
- view: () => {
80
- if (vm.loading) {
81
- return `<div class="h-100 d-flex align-items-center"><div class="spinner-border" style="height:20px;width: 20px;"></div></div>`;
82
- } else {
83
- return `${vm.sum.toLocaleString()}`;
84
- }
85
- },
86
- divCreate: {
87
- class: `mx-1`,
88
- },
89
- };
90
- })}』點</a
91
- >
92
- <a
93
- class="dropdown-item cursor_pointer d-flex align-items-center"
94
- onclick="${gvc.event(() => {
95
- gvc.glitter.setUrlParameter('tab', 'sms-points');
96
- gvc.recreateView();
97
- })}"
98
- >
99
- <div class="me-2 d-flex align-items-center justify-content-center fs-6"
100
- style="width:24px;height: 24px;"><i class="fa-solid fa-comment-sms"></i></div>
101
- 剩餘『${gvc.bindView(() => {
102
- const id = gvc.glitter.getUUID();
103
- const vm = {
104
- loading: true,
105
- sum: 0,
106
- };
107
- SmsPointsApi.getSum({}).then((res) => {
108
- vm.sum = parseInt(res.response.sum, 10);
109
- vm.loading = false;
15
+ public static app_manager(gvc: GVC) {
16
+ return gvc.bindView(() => {
17
+ const id = gvc.glitter.getUUID();
18
+ const dialog = new ShareDialog(gvc.glitter);
19
+ return {
20
+ bind: id,
21
+ view: () => {
22
+ return new Promise(async resolve => {
23
+ const userData = (await ApiUser.getSaasUserData(GlobalUser.saas_token, 'me')).response;
24
+ if (!userData.phone) {
25
+ SaasViewModel.accountSetting(gvc);
26
+ }
27
+ resolve(
28
+ html` <div
29
+ class="btn btn-outline-secondary dropdown-toggle border-0 px-2 position-relative"
30
+ data-bs-toggle="dropdown"
31
+ aria-haspopup="true"
32
+ aria-expanded="false"
33
+ onclick="${gvc.event((e, event) => {
34
+ event.stopPropagation();
35
+ event.preventDefault();
36
+ })}"
37
+ disabled="true"
38
+ >
39
+ <div class="d-flex align-items-center ">
40
+ <img
41
+ src="https://assets.imgix.net/~text?bg=7ED379&txtclr=ffffff&w=100&h=100&txtsize=40&txt=${userData
42
+ .userData.name}&txtfont=Helvetica&txtalign=middle,center"
43
+ class="rounded-circle"
44
+ width="48"
45
+ alt="Avatar"
46
+ style="width:40px;height:40px;"
47
+ />
48
+ <div class="d-none d-sm-block ps-2">
49
+ <div class="fs-xs lh-1 opacity-60 fw-500">Hello,</div>
50
+ <div class="fs-sm fw-500">${userData.userData.name}</div>
51
+ </div>
52
+ </div>
53
+ </div>
54
+ <div
55
+ class="dropdown-menu position-absolute"
56
+ style="top:50px; ${document.body.clientWidth > 768 ? 'right: 0 !important;' : 'left: -110px;'}"
57
+ >
58
+ <a
59
+ class="dropdown-item cursor_pointer d-flex align-items-center"
60
+ onclick="${gvc.event(() => {
61
+ gvc.glitter.setUrlParameter('tab', 'ai-point');
62
+ gvc.recreateView();
63
+ })}"
64
+ ><img
65
+ src="https://d3jnmi1tfjgtti.cloudfront.net/file/234285319/size1440_s*px$_sas0s9s0s1sesas0_1697354801736-Glitterlogo.png"
66
+ class="me-2"
67
+ style="width:24px;height: 24px;"
68
+ />剩餘『${gvc.bindView(() => {
69
+ const id = gvc.glitter.getUUID();
70
+ const vm = {
71
+ loading: true,
72
+ sum: 0,
73
+ };
74
+ AiPointsApi.getSum({}).then(res => {
75
+ vm.sum = parseInt(res.response.sum, 10);
76
+ vm.loading = false;
110
77
 
111
- gvc.notifyDataChange(id);
112
- });
113
- return {
114
- bind: id,
115
- view: () => {
116
- if (vm.loading) {
117
- return html`
118
- <div class="h-100 d-flex align-items-center">
119
- <div class="spinner-border"
120
- style="height:20px;width: 20px;"></div>
121
- </div>`;
122
- } else {
123
- return `${vm.sum.toLocaleString()}`;
124
- }
125
- },
126
- divCreate: {
127
- class: `mx-1`,
128
- },
129
- };
130
- })}』點</a
131
- >
132
- <a
133
- class="dropdown-item cursor_pointer d-flex align-items-center"
134
- onclick="${gvc.event(() => {
135
- SaasViewModel.openShopList(gvc);
136
- })}"
137
- >
138
- <div class="me-2 d-flex align-items-center justify-content-center fs-6"
139
- style="width:24px;height: 24px;"><i class="fa-duotone fa-solid fa-shop "
140
- style=""></i></div>
141
- 商店列表</a
142
- >
143
- <a
144
- class="dropdown-item cursor_pointer d-flex align-items-center"
145
- onclick="${gvc.event(() => {
146
- SaasViewModel.accountSetting(gvc);
147
- })}"
148
- >
149
- <div class="me-2 d-flex align-items-center justify-content-center fs-6"
150
- style="width:24px;height: 24px;"><i
151
- class="fa-sharp-duotone fa-solid fa-gear"></i></div>
152
- 帳號設定</a
153
- >
154
- <a
155
- class="dropdown-item cursor_pointer d-flex align-items-center"
156
- onclick="${gvc.event(() => {
157
- SaasViewModel.notifySetting(gvc);
158
- })}"
159
- >
160
- <div class="me-2 d-flex align-items-center justify-content-center fs-6"
161
- style="width:24px;height: 24px;"><i class="fa-regular fa-bell-ring"></i></div>
162
- 通知設定</a
163
- >
164
- <div class="dropdown-divider"></div>
165
- <a
166
- class="dropdown-item cursor_pointer"
167
- onclick="${gvc.event(() => {
168
- dialog.checkYesOrNot({
169
- callback: (bool) => {
170
- if (bool) {
171
- GlobalUser.saas_token = '';
172
- window.history.replaceState({},document.title,gvc.glitter.root_path+'login')
173
- gvc.glitter.share.reload('login','shopnex')
174
- }
175
- },
176
- text: '確定要登出嗎?',
177
- });
178
- })}"
179
- >登出</a
180
- >
181
- </div>`);
182
- });
183
- },
184
- divCreate: {
185
- class: `btn-group dropdown border-start`,
186
- style: `${document.body.clientWidth < 800 ? 'min-width:72px;' : 'min-width:133px;'}`,
187
- },
188
- };
189
- });
190
- }
78
+ gvc.notifyDataChange(id);
79
+ });
80
+ return {
81
+ bind: id,
82
+ view: () => {
83
+ if (vm.loading) {
84
+ return `<div class="h-100 d-flex align-items-center"><div class="spinner-border" style="height:20px;width: 20px;"></div></div>`;
85
+ } else {
86
+ return `${vm.sum.toLocaleString()}`;
87
+ }
88
+ },
89
+ divCreate: {
90
+ class: `mx-1`,
91
+ },
92
+ };
93
+ })}』點</a
94
+ >
95
+ <a
96
+ class="dropdown-item cursor_pointer d-flex align-items-center"
97
+ onclick="${gvc.event(() => {
98
+ gvc.glitter.setUrlParameter('tab', 'sms-points');
99
+ gvc.recreateView();
100
+ })}"
101
+ >
102
+ <div
103
+ class="me-2 d-flex align-items-center justify-content-center fs-6"
104
+ style="width:24px;height: 24px;"
105
+ >
106
+ <i class="fa-solid fa-comment-sms"></i>
107
+ </div>
108
+ 剩餘『${gvc.bindView(() => {
109
+ const id = gvc.glitter.getUUID();
110
+ const vm = {
111
+ loading: true,
112
+ sum: 0,
113
+ };
114
+ SmsPointsApi.getSum({}).then(res => {
115
+ vm.sum = parseInt(res.response.sum, 10);
116
+ vm.loading = false;
191
117
 
192
- public static async accountSetting(gvc: GVC) {
193
- const dialog = new ShareDialog(gvc.glitter);
194
- dialog.dataLoading({visible: true});
195
- const original = (await ApiUser.getSaasUserData(GlobalUser.saas_token, 'me')).response;
196
- const userData = JSON.parse(JSON.stringify(original));
197
- dialog.dataLoading({visible: false});
118
+ gvc.notifyDataChange(id);
119
+ });
120
+ return {
121
+ bind: id,
122
+ view: () => {
123
+ if (vm.loading) {
124
+ return html` <div class="h-100 d-flex align-items-center">
125
+ <div class="spinner-border" style="height:20px;width: 20px;"></div>
126
+ </div>`;
127
+ } else {
128
+ return `${vm.sum.toLocaleString()}`;
129
+ }
130
+ },
131
+ divCreate: {
132
+ class: `mx-1`,
133
+ },
134
+ };
135
+ })}』點</a
136
+ >
137
+ <a
138
+ class="dropdown-item cursor_pointer d-flex align-items-center"
139
+ onclick="${gvc.event(() => {
140
+ SaasViewModel.openShopList(gvc);
141
+ })}"
142
+ >
143
+ <div
144
+ class="me-2 d-flex align-items-center justify-content-center fs-6"
145
+ style="width:24px;height: 24px;"
146
+ >
147
+ <i class="fa-duotone fa-solid fa-shop " style=""></i>
148
+ </div>
149
+ 商店列表</a
150
+ >
151
+ <a
152
+ class="dropdown-item cursor_pointer d-flex align-items-center"
153
+ onclick="${gvc.event(() => {
154
+ SaasViewModel.accountSetting(gvc);
155
+ })}"
156
+ >
157
+ <div
158
+ class="me-2 d-flex align-items-center justify-content-center fs-6"
159
+ style="width:24px;height: 24px;"
160
+ >
161
+ <i class="fa-sharp-duotone fa-solid fa-gear"></i>
162
+ </div>
163
+ 帳號設定</a
164
+ >
165
+ <a
166
+ class="dropdown-item cursor_pointer d-flex align-items-center"
167
+ onclick="${gvc.event(() => {
168
+ SaasViewModel.notifySetting(gvc);
169
+ })}"
170
+ >
171
+ <div
172
+ class="me-2 d-flex align-items-center justify-content-center fs-6"
173
+ style="width:24px;height: 24px;"
174
+ >
175
+ <i class="fa-regular fa-bell-ring"></i>
176
+ </div>
177
+ 通知設定</a
178
+ >
179
+ <div class="dropdown-divider"></div>
180
+ <a
181
+ class="dropdown-item cursor_pointer"
182
+ onclick="${gvc.event(() => {
183
+ dialog.checkYesOrNot({
184
+ callback: bool => {
185
+ if (bool) {
186
+ GlobalUser.saas_token = '';
187
+ window.history.replaceState({}, document.title, gvc.glitter.root_path + 'login');
188
+ gvc.glitter.share.reload('login', 'shopnex');
189
+ }
190
+ },
191
+ text: '確定要登出嗎?',
192
+ });
193
+ })}"
194
+ >登出</a
195
+ >
196
+ </div>`
197
+ );
198
+ });
199
+ },
200
+ divCreate: {
201
+ class: `btn-group dropdown border-start`,
202
+ style: `${document.body.clientWidth < 800 ? 'min-width:72px;' : 'min-width:133px;'}`,
203
+ },
204
+ };
205
+ });
206
+ }
198
207
 
199
- let get_verify_timer = 0;
208
+ public static async accountSetting(gvc: GVC) {
209
+ const dialog = new ShareDialog(gvc.glitter);
210
+ dialog.dataLoading({ visible: true });
211
+ const original = (await ApiUser.getSaasUserData(GlobalUser.saas_token, 'me')).response;
212
+ const userData = JSON.parse(JSON.stringify(original));
213
+ dialog.dataLoading({ visible: false });
200
214
 
201
- function recreate() {
202
- gvc.recreateView();
203
- }
215
+ let get_verify_timer = 0;
204
216
 
205
- const root_gvc = gvc;
206
- BgWidget.settingDialog({
207
- gvc: gvc,
208
- title: '帳號設定',
209
- innerHTML: (gvc: GVC) => {
210
- return html`
211
- <div class="mt-n2">
212
- ${[
213
- BgWidget.editeInput({
214
- gvc: gvc,
215
- title: '公司或單位名稱',
216
- default: userData.userData.name,
217
- callback: (text) => {
218
- userData.userData.name = text;
219
- },
220
- placeHolder: '請輸入公司或單位名稱',
221
- }),
222
- BgWidget.editeInput({
223
- gvc: gvc,
224
- title: html`
225
- <div class="d-flex flex-column" style="gap:3px;">電子信箱
226
- ${BgWidget.grayNote('商店的所有訂單與用戶通知,將會發送至此信箱')}
227
- </div>`,
228
- default: userData.userData.email,
229
- callback: (text) => {
230
- userData.userData.email = text;
231
- gvc.recreateView();
232
- },
233
- placeHolder: '請輸入電子信箱',
234
- }),
235
- (() => {
236
- if (userData.userData.email !== original.userData.email) {
237
- return [
238
- BgWidget.editeInput({
239
- gvc: gvc,
240
- title: gvc.bindView(() => {
241
- const id = gvc.glitter.getUUID();
242
- return {
243
- bind: id,
244
- view: () => {
245
- return `信箱驗證碼
246
- ${BgWidget.blueNote(
247
- get_verify_timer ? `${get_verify_timer}秒後可再次發送驗證碼` : '點我取得驗證碼',
248
- gvc.event(() => {
249
- if (!get_verify_timer) {
250
- const dialog = new ShareDialog(gvc.glitter);
251
- dialog.dataLoading({visible: true});
252
- ApiUser.emailVerify(userData.userData.email, (window as any).glitterBase).then(async (r) => {
253
- dialog.dataLoading({visible: false});
254
- get_verify_timer = 60;
255
- gvc.notifyDataChange(id);
256
- });
257
- }
258
- })
259
- )}`;
260
- },
261
- divCreate: {
262
- class: `d-flex flex-column`,
263
- style: `gap:3px;`,
264
- },
265
- onCreate: () => {
266
- if (get_verify_timer > 0) {
267
- get_verify_timer--;
268
- setTimeout(() => {
269
- gvc.notifyDataChange(id);
270
- }, 1000);
271
- }
272
- },
273
- };
274
- }),
275
- default: userData.userData.verify_code,
276
- callback: (text) => {
277
- userData.userData.verify_code = text;
278
- },
279
- placeHolder: '請輸入驗證碼',
280
- }),
281
- ];
282
- } else {
283
- return [];
284
- }
285
- })(),
286
- `<div class="d-flex align-items-center justify-content-end">${BgWidget.blueNote('重設密碼', gvc.event(() => {
287
- gvc.closeDialog();
288
- let update_vm = {
289
- verify_code: '',
290
- pwd: ''
291
- }
292
- let repeat_pwd=''
293
- BgWidget.settingDialog({
294
- gvc: root_gvc,
295
- title: '重設密碼',
296
- innerHTML: (gvc) => {
297
- return [
298
- BgWidget.editeInput({
299
- gvc: gvc,
300
- title: '密碼',
301
- default: update_vm.pwd,
302
- callback: (text) => {
303
- update_vm.pwd = text;
304
- },
305
- type: 'password',
306
- placeHolder: '請輸入密碼',
307
- }),
308
- BgWidget.editeInput({
309
- gvc: gvc,
310
- title: '確認密碼',
311
- default: repeat_pwd,
312
- callback: (text) => {
313
- repeat_pwd = text;
314
- },
315
- type: 'password',
316
- placeHolder: '再次確認密碼',
317
- }),
318
- BgWidget.editeInput({
319
- gvc: gvc,
320
- title: gvc.bindView(() => {
321
- const id = gvc.glitter.getUUID();
322
- return {
323
- bind: id,
324
- view: () => {
325
- return html`重設密碼驗證碼
326
- ${BgWidget.blueNote(
327
- get_verify_timer ? `驗證碼已發送至『${original.userData.email}』` : '點我取得驗證碼',
328
- gvc.event(() => {
329
- if (!get_verify_timer) {
330
- const dialog = new ShareDialog(gvc.glitter);
331
- dialog.dataLoading({visible: true});
332
- ApiUser.emailVerify(original.userData.email, (window as any).glitterBase).then(async (r) => {
333
- dialog.dataLoading({visible: false});
334
- get_verify_timer = 60;
335
- gvc.notifyDataChange(id);
336
- });
337
- }
338
- })
339
- )}`;
340
- },
341
- divCreate: {
342
- class: `d-flex flex-column`,
343
- style: `gap:3px;`,
344
- },
345
- onCreate: () => {
346
- if (get_verify_timer > 0) {
347
- get_verify_timer--;
348
- setTimeout(() => {
349
- gvc.notifyDataChange(id);
350
- }, 1000);
351
- }
352
- },
353
- };
354
- }),
355
- default: update_vm.verify_code,
356
- callback: (text) => {
357
- update_vm.verify_code = text;
358
- },
359
- placeHolder: '請輸入驗證碼',
360
- })
361
- ].join('');
362
- },
363
- footer_html: (gvc) => {
364
- return html`
365
- <div class="w-100 d-flex align-items-center justify-content-end"
366
- style="gap:10px;">
367
- ${[
368
- BgWidget.cancel(
369
- gvc.event(() => {
370
- gvc.closeDialog();
371
- })
372
- ),
373
- BgWidget.save(
374
- gvc.event(() => {
375
- if (update_vm.pwd.length < 8) {
376
- dialog.errorMessage({text: '密碼必須大於8位數'})
377
- return
378
- }
379
- if (repeat_pwd !== update_vm.pwd) {
380
- dialog.errorMessage({text: '請再次確認密碼'})
381
- return
382
- }
383
- dialog.dataLoading({visible: true});
384
- ApiUser.setSaasUserData({
385
- userData: update_vm,
386
- }).then((res) => {
387
- dialog.dataLoading({visible: false});
388
- if (!res.result && res.response.data.msg === 'email-verify-false') {
389
- dialog.errorMessage({text: '驗證碼輸入錯誤'});
390
- } else if (!res.result) {
391
- dialog.errorMessage({text: '更新異常'});
392
- } else {
393
- dialog.successMessage({text: '更新成功'});
394
- gvc.closeDialog();
395
- recreate();
396
- }
397
- });
398
- }),
399
- '確認重設'
400
- ),
401
- ].join('')}
402
- </div>`;
403
- },
404
- });
405
- }))}</div>`,
406
- BgWidget.editeInput({
407
- gvc: gvc,
408
- title: html`
409
- <div class="d-flex flex-column" style="gap:3px;">簡訊通知
410
- ${BgWidget.grayNote('將會自動發送系統通知至你所設定的電話號碼')}
411
- </div>`,
412
- default: userData.userData.phone,
413
- callback: (text) => {
414
- userData.userData.phone = text;
415
- },
416
- placeHolder: '請輸入聯絡電話',
417
- })
418
- ].join(html`
419
- <div class="my-2"></div>`)}
420
- </div>`;
421
- },
422
- footer_html: (gvc: GVC) => {
423
- return html`
424
- <div class="w-100 d-flex align-items-center" style="gap:10px;">
425
- ${[
426
- BgWidget.dangerNote(
427
- '永久刪除帳號',
428
- gvc.event(() => {
429
- gvc.closeDialog();
430
- BgWidget.settingDialog({
431
- gvc: root_gvc,
432
- title: '是否刪除帳號?',
433
- innerHTML: (gvc) => {
434
- return [
435
- BgWidget.editeInput({
436
- gvc: gvc,
437
- title: gvc.bindView(() => {
438
- const id = gvc.glitter.getUUID();
439
- return {
440
- bind: id,
441
- view: () => {
442
- return html`刪除驗證碼
443
- ${BgWidget.blueNote(
444
- get_verify_timer ? `驗證碼已發送至『${original.userData.email}』` : '點我取得驗證碼',
445
- gvc.event(() => {
446
- if (!get_verify_timer) {
447
- const dialog = new ShareDialog(gvc.glitter);
448
- dialog.dataLoading({visible: true});
449
- ApiUser.emailVerify(original.userData.email, (window as any).glitterBase).then(async (r) => {
450
- dialog.dataLoading({visible: false});
451
- get_verify_timer = 60;
452
- gvc.notifyDataChange(id);
453
- });
454
- }
455
- })
456
- )}`;
457
- },
458
- divCreate: {
459
- class: `d-flex flex-column`,
460
- style: `gap:3px;`,
461
- },
462
- onCreate: () => {
463
- if (get_verify_timer > 0) {
464
- get_verify_timer--;
465
- setTimeout(() => {
466
- gvc.notifyDataChange(id);
467
- }, 1000);
468
- }
469
- },
470
- };
471
- }),
472
- default: userData.userData.verify_code,
473
- callback: (text) => {
474
- userData.userData.verify_code = text;
475
- },
476
- placeHolder: '請輸入驗證碼',
477
- }),
478
- ].join('');
479
- },
480
- footer_html: (gvc) => {
481
- return html`
482
- <div class="w-100 d-flex align-items-center justify-content-end"
483
- style="gap:10px;">
484
- ${[
485
- BgWidget.cancel(
486
- gvc.event(() => {
487
- gvc.closeDialog();
488
- })
489
- ),
490
- BgWidget.danger(
491
- gvc.event(() => {
492
- dialog.dataLoading({visible: true});
493
- ApiUser.deleteUser({
494
- email: original.userData.email,
495
- code: userData.userData.verify_code,
496
- app_name: (window as any).glitterBase,
497
- }).then((res) => {
498
- if (res.result) {
499
- location.href = gvc.glitter.root_path + 'shopnex/login';
500
- } else {
501
- dialog.dataLoading({visible: false});
502
- dialog.errorMessage({text: '驗證碼輸入錯誤'});
503
- }
504
- });
505
- }),
506
- '確認刪除'
507
- ),
508
- ].join('')}
509
- </div>`;
510
- },
511
- });
512
- })
513
- ),
514
- html`
515
- <div class="flex-fill"></div>`,
516
- BgWidget.cancel(
517
- gvc.event(() => {
518
- gvc.closeDialog();
519
- })
520
- ),
521
- BgWidget.save(
522
- gvc.event(async () => {
523
- if (!userData.userData.name) {
524
- dialog.errorMessage({text: '請輸入姓名'});
525
- return;
526
- } else if (!userData.userData.email) {
527
- dialog.errorMessage({text: '請輸入信箱'});
528
- return;
529
- } else if (userData.userData.email !== original.userData.email && !userData.userData.verify_code) {
530
- dialog.errorMessage({text: '請輸入驗證碼'});
531
- return;
532
- }
533
- dialog.dataLoading({visible: true});
534
- ApiUser.setSaasUserData({
535
- userData: userData.userData,
536
- }).then((res) => {
537
- dialog.dataLoading({visible: false});
538
- if (!res.result && res.response.data.msg === 'email-verify-false') {
539
- dialog.errorMessage({text: '驗證碼輸入錯誤'});
540
- } else if (!res.result) {
541
- dialog.errorMessage({text: '更新異常'});
542
- } else {
543
- dialog.successMessage({text: '更新成功'});
544
- gvc.closeDialog();
545
- recreate();
546
- }
547
- });
548
- // (await ApiUser.getSaasUserData(GlobalUser.saas_token, 'me')).response;
549
- })
550
- ),
551
- ].join('')}
552
- </div>`;
553
- },
554
- });
217
+ function recreate() {
218
+ gvc.recreateView();
555
219
  }
556
- public static async setContactInfo(gvc: GVC) {
557
- const dialog = new ShareDialog(gvc.glitter);
558
- dialog.dataLoading({visible: true});
559
- const original = (await ApiUser.getSaasUserData(GlobalUser.saas_token, 'me')).response;
560
- const userData = JSON.parse(JSON.stringify(original));
561
- dialog.dataLoading({visible: false});
562
220
 
563
- let get_verify_timer = 0;
564
-
565
- function recreate() {
566
- gvc.recreateView();
567
- }
568
- const root_gvc = gvc;
569
- BgWidget.settingDialog({
570
- gvc: gvc,
571
- title: '填寫基本資料',
572
- innerHTML: (gvc: GVC) => {
573
- return html`
574
- <div class="mt-n2">
575
- ${[
576
- BgWidget.editeInput({
577
- gvc: gvc,
578
- title: '公司或單位名稱',
579
- default: userData.userData.name,
580
- callback: (text) => {
581
- userData.userData.name = text;
221
+ const root_gvc = gvc;
222
+ BgWidget.settingDialog({
223
+ gvc: gvc,
224
+ title: '帳號設定',
225
+ innerHTML: (gvc: GVC) => {
226
+ return html` <div class="mt-n2">
227
+ ${[
228
+ BgWidget.editeInput({
229
+ gvc: gvc,
230
+ title: '公司或單位名稱',
231
+ default: userData.userData.name,
232
+ callback: text => {
233
+ userData.userData.name = text;
234
+ },
235
+ placeHolder: '請輸入公司或單位名稱',
236
+ }),
237
+ BgWidget.editeInput({
238
+ gvc: gvc,
239
+ title: html` <div class="d-flex flex-column" style="gap:3px;">
240
+ 電子信箱 ${BgWidget.grayNote('商店的所有訂單與用戶通知,將會發送至此信箱')}
241
+ </div>`,
242
+ default: userData.userData.email,
243
+ callback: text => {
244
+ userData.userData.email = text;
245
+ gvc.recreateView();
246
+ },
247
+ placeHolder: '請輸入電子信箱',
248
+ }),
249
+ (() => {
250
+ if (userData.userData.email !== original.userData.email) {
251
+ return [
252
+ BgWidget.editeInput({
253
+ gvc: gvc,
254
+ title: gvc.bindView(() => {
255
+ const id = gvc.glitter.getUUID();
256
+ return {
257
+ bind: id,
258
+ view: () => {
259
+ return `信箱驗證碼
260
+ ${BgWidget.blueNote(
261
+ get_verify_timer
262
+ ? `${get_verify_timer}秒後可再次發送驗證碼`
263
+ : '點我取得驗證碼',
264
+ gvc.event(() => {
265
+ if (!get_verify_timer) {
266
+ const dialog = new ShareDialog(gvc.glitter);
267
+ dialog.dataLoading({ visible: true });
268
+ ApiUser.emailVerify(
269
+ userData.userData.email,
270
+ (window as any).glitterBase
271
+ ).then(async r => {
272
+ dialog.dataLoading({ visible: false });
273
+ get_verify_timer = 60;
274
+ gvc.notifyDataChange(id);
275
+ });
276
+ }
277
+ })
278
+ )}`;
279
+ },
280
+ divCreate: {
281
+ class: `d-flex flex-column`,
282
+ style: `gap:3px;`,
582
283
  },
583
- placeHolder: '請輸入公司或單位名稱',
284
+ onCreate: () => {
285
+ if (get_verify_timer > 0) {
286
+ get_verify_timer--;
287
+ setTimeout(() => {
288
+ gvc.notifyDataChange(id);
289
+ }, 1000);
290
+ }
291
+ },
292
+ };
584
293
  }),
585
- BgWidget.editeInput({
294
+ default: userData.userData.verify_code,
295
+ callback: text => {
296
+ userData.userData.verify_code = text;
297
+ },
298
+ placeHolder: '請輸入驗證碼',
299
+ }),
300
+ ];
301
+ } else {
302
+ return [];
303
+ }
304
+ })(),
305
+ `<div class="d-flex align-items-center justify-content-end">${BgWidget.blueNote(
306
+ '重設密碼',
307
+ gvc.event(() => {
308
+ gvc.closeDialog();
309
+ let update_vm = {
310
+ verify_code: '',
311
+ pwd: '',
312
+ };
313
+ let repeat_pwd = '';
314
+ BgWidget.settingDialog({
315
+ gvc: root_gvc,
316
+ title: '重設密碼',
317
+ innerHTML: gvc => {
318
+ return [
319
+ BgWidget.editeInput({
586
320
  gvc: gvc,
587
- title: html`
588
- <div class="d-flex flex-column" style="gap:3px;">聯絡電話
589
- ${BgWidget.grayNote('正確填寫重要資料,避免遺漏重要通知')}
590
- </div>`,
591
- default: userData.userData.contact_phone,
592
- callback: (text) => {
593
- userData.userData.contact_phone = text;
321
+ title: '密碼',
322
+ default: update_vm.pwd,
323
+ callback: text => {
324
+ update_vm.pwd = text;
594
325
  },
595
- placeHolder: '請輸入聯絡電話',
596
- })
597
- ].join(html`
598
- <div class="my-2"></div>`)}
599
- </div>`;
600
- },
601
- footer_html: (gvc: GVC) => {
602
- return html`
603
- <div class="w-100 d-flex align-items-center justify-content-end" style="gap:10px;">
604
- ${[
605
- BgWidget.save(
606
- gvc.event(async () => {
607
- if (!userData.userData.name) {
608
- dialog.errorMessage({text: '請輸入公司或單位名稱'});
609
- return;
610
- }else if (!userData.userData.contact_phone) {
611
- dialog.errorMessage({text: '請輸入聯絡人電話'});
612
- return;
326
+ type: 'password',
327
+ placeHolder: '請輸入密碼',
328
+ }),
329
+ BgWidget.editeInput({
330
+ gvc: gvc,
331
+ title: '確認密碼',
332
+ default: repeat_pwd,
333
+ callback: text => {
334
+ repeat_pwd = text;
335
+ },
336
+ type: 'password',
337
+ placeHolder: '再次確認密碼',
338
+ }),
339
+ BgWidget.editeInput({
340
+ gvc: gvc,
341
+ title: gvc.bindView(() => {
342
+ const id = gvc.glitter.getUUID();
343
+ return {
344
+ bind: id,
345
+ view: () => {
346
+ return html`重設密碼驗證碼
347
+ ${BgWidget.blueNote(
348
+ get_verify_timer ? `驗證碼已發送至『${original.userData.email}』` : '點我取得驗證碼',
349
+ gvc.event(() => {
350
+ if (!get_verify_timer) {
351
+ const dialog = new ShareDialog(gvc.glitter);
352
+ dialog.dataLoading({ visible: true });
353
+ ApiUser.emailVerify(original.userData.email, (window as any).glitterBase).then(
354
+ async r => {
355
+ dialog.dataLoading({ visible: false });
356
+ get_verify_timer = 60;
357
+ gvc.notifyDataChange(id);
358
+ }
359
+ );
360
+ }
361
+ })
362
+ )}`;
363
+ },
364
+ divCreate: {
365
+ class: `d-flex flex-column`,
366
+ style: `gap:3px;`,
367
+ },
368
+ onCreate: () => {
369
+ if (get_verify_timer > 0) {
370
+ get_verify_timer--;
371
+ setTimeout(() => {
372
+ gvc.notifyDataChange(id);
373
+ }, 1000);
374
+ }
375
+ },
376
+ };
377
+ }),
378
+ default: update_vm.verify_code,
379
+ callback: text => {
380
+ update_vm.verify_code = text;
381
+ },
382
+ placeHolder: '請輸入驗證碼',
383
+ }),
384
+ ].join('');
385
+ },
386
+ footer_html: gvc => {
387
+ return html` <div class="w-100 d-flex align-items-center justify-content-end" style="gap:10px;">
388
+ ${[
389
+ BgWidget.cancel(
390
+ gvc.event(() => {
391
+ gvc.closeDialog();
392
+ })
393
+ ),
394
+ BgWidget.save(
395
+ gvc.event(() => {
396
+ if (update_vm.pwd.length < 8) {
397
+ dialog.errorMessage({ text: '密碼必須大於8位數' });
398
+ return;
613
399
  }
614
- dialog.dataLoading({visible: true});
400
+ if (repeat_pwd !== update_vm.pwd) {
401
+ dialog.errorMessage({ text: '請再次確認密碼' });
402
+ return;
403
+ }
404
+ dialog.dataLoading({ visible: true });
615
405
  ApiUser.setSaasUserData({
616
- userData: userData.userData,
617
- }).then((res) => {
618
- dialog.dataLoading({visible: false});
619
- if (!res.result && res.response.data.msg === 'email-verify-false') {
620
- dialog.errorMessage({text: '驗證碼輸入錯誤'});
621
- } else if (!res.result) {
622
- dialog.errorMessage({text: '更新異常'});
623
- } else {
624
- dialog.successMessage({text: '設定成功'});
625
- gvc.closeDialog();
626
- recreate();
627
- }
406
+ userData: update_vm,
407
+ }).then(res => {
408
+ dialog.dataLoading({ visible: false });
409
+ if (!res.result && res.response.data.msg === 'email-verify-false') {
410
+ dialog.errorMessage({ text: '驗證碼輸入錯誤' });
411
+ } else if (!res.result) {
412
+ dialog.errorMessage({ text: '更新異常' });
413
+ } else {
414
+ dialog.successMessage({ text: '更新成功' });
415
+ gvc.closeDialog();
416
+ recreate();
417
+ }
628
418
  });
629
- // (await ApiUser.getSaasUserData(GlobalUser.saas_token, 'me')).response;
630
- })
631
- ),
632
- ].join('')}
419
+ }),
420
+ '確認重設'
421
+ ),
422
+ ].join('')}
633
423
  </div>`;
634
- },
635
- });
424
+ },
425
+ });
426
+ })
427
+ )}</div>`,
428
+ BgWidget.editeInput({
429
+ gvc: gvc,
430
+ title: html` <div class="d-flex flex-column" style="gap:3px;">
431
+ 簡訊通知 ${BgWidget.grayNote('將會自動發送系統通知至你所設定的電話號碼')}
432
+ </div>`,
433
+ default: userData.userData.phone,
434
+ callback: text => {
435
+ userData.userData.phone = text;
436
+ },
437
+ placeHolder: '請輸入聯絡電話',
438
+ }),
439
+ ].join(html` <div class="my-2"></div>`)}
440
+ </div>`;
441
+ },
442
+ footer_html: (gvc: GVC) => {
443
+ return html` <div class="w-100 d-flex align-items-center" style="gap:10px;">
444
+ ${[
445
+ BgWidget.dangerNote(
446
+ '永久刪除帳號',
447
+ gvc.event(() => {
448
+ gvc.closeDialog();
449
+ BgWidget.settingDialog({
450
+ gvc: root_gvc,
451
+ title: '是否刪除帳號?',
452
+ innerHTML: gvc => {
453
+ return [
454
+ BgWidget.editeInput({
455
+ gvc: gvc,
456
+ title: gvc.bindView(() => {
457
+ const id = gvc.glitter.getUUID();
458
+ return {
459
+ bind: id,
460
+ view: () => {
461
+ return html`刪除驗證碼
462
+ ${BgWidget.blueNote(
463
+ get_verify_timer ? `驗證碼已發送至『${original.userData.email}』` : '點我取得驗證碼',
464
+ gvc.event(() => {
465
+ if (!get_verify_timer) {
466
+ const dialog = new ShareDialog(gvc.glitter);
467
+ dialog.dataLoading({ visible: true });
468
+ ApiUser.emailVerify(original.userData.email, (window as any).glitterBase).then(
469
+ async r => {
470
+ dialog.dataLoading({ visible: false });
471
+ get_verify_timer = 60;
472
+ gvc.notifyDataChange(id);
473
+ }
474
+ );
475
+ }
476
+ })
477
+ )}`;
478
+ },
479
+ divCreate: {
480
+ class: `d-flex flex-column`,
481
+ style: `gap:3px;`,
482
+ },
483
+ onCreate: () => {
484
+ if (get_verify_timer > 0) {
485
+ get_verify_timer--;
486
+ setTimeout(() => {
487
+ gvc.notifyDataChange(id);
488
+ }, 1000);
489
+ }
490
+ },
491
+ };
492
+ }),
493
+ default: userData.userData.verify_code,
494
+ callback: text => {
495
+ userData.userData.verify_code = text;
496
+ },
497
+ placeHolder: '請輸入驗證碼',
498
+ }),
499
+ ].join('');
500
+ },
501
+ footer_html: gvc => {
502
+ return html` <div class="w-100 d-flex align-items-center justify-content-end" style="gap:10px;">
503
+ ${[
504
+ BgWidget.cancel(
505
+ gvc.event(() => {
506
+ gvc.closeDialog();
507
+ })
508
+ ),
509
+ BgWidget.danger(
510
+ gvc.event(() => {
511
+ dialog.dataLoading({ visible: true });
512
+ ApiUser.deleteUser({
513
+ email: original.userData.email,
514
+ code: userData.userData.verify_code,
515
+ app_name: (window as any).glitterBase,
516
+ }).then(res => {
517
+ if (res.result) {
518
+ location.href = gvc.glitter.root_path + 'shopnex/login';
519
+ } else {
520
+ dialog.dataLoading({ visible: false });
521
+ dialog.errorMessage({ text: '驗證碼輸入錯誤' });
522
+ }
523
+ });
524
+ }),
525
+ '確認刪除'
526
+ ),
527
+ ].join('')}
528
+ </div>`;
529
+ },
530
+ });
531
+ })
532
+ ),
533
+ html` <div class="flex-fill"></div>`,
534
+ BgWidget.cancel(
535
+ gvc.event(() => {
536
+ gvc.closeDialog();
537
+ })
538
+ ),
539
+ BgWidget.save(
540
+ gvc.event(async () => {
541
+ if (!userData.userData.name) {
542
+ dialog.errorMessage({ text: '請輸入姓名' });
543
+ return;
544
+ } else if (!userData.userData.email) {
545
+ dialog.errorMessage({ text: '請輸入信箱' });
546
+ return;
547
+ } else if (userData.userData.email !== original.userData.email && !userData.userData.verify_code) {
548
+ dialog.errorMessage({ text: '請輸入驗證碼' });
549
+ return;
550
+ }
551
+ dialog.dataLoading({ visible: true });
552
+ ApiUser.setSaasUserData({
553
+ userData: userData.userData,
554
+ }).then(res => {
555
+ dialog.dataLoading({ visible: false });
556
+ if (!res.result && res.response.data.msg === 'email-verify-false') {
557
+ dialog.errorMessage({ text: '驗證碼輸入錯誤' });
558
+ } else if (!res.result) {
559
+ dialog.errorMessage({ text: '更新異常' });
560
+ } else {
561
+ dialog.successMessage({ text: '更新成功' });
562
+ gvc.closeDialog();
563
+ recreate();
564
+ }
565
+ });
566
+ // (await ApiUser.getSaasUserData(GlobalUser.saas_token, 'me')).response;
567
+ })
568
+ ),
569
+ ].join('')}
570
+ </div>`;
571
+ },
572
+ });
573
+ }
574
+ public static async setContactInfo(gvc: GVC) {
575
+ const dialog = new ShareDialog(gvc.glitter);
576
+ dialog.dataLoading({ visible: true });
577
+ const original = (await ApiUser.getSaasUserData(GlobalUser.saas_token, 'me')).response;
578
+ const userData = JSON.parse(JSON.stringify(original));
579
+ dialog.dataLoading({ visible: false });
580
+
581
+ let get_verify_timer = 0;
582
+
583
+ function recreate() {
584
+ gvc.recreateView();
636
585
  }
586
+ const root_gvc = gvc;
587
+ BgWidget.settingDialog({
588
+ gvc: gvc,
589
+ title: '填寫基本資料',
590
+ innerHTML: (gvc: GVC) => {
591
+ return html` <div class="mt-n2">
592
+ ${[
593
+ BgWidget.editeInput({
594
+ gvc: gvc,
595
+ title: '公司或單位名稱',
596
+ default: userData.userData.name,
597
+ callback: text => {
598
+ userData.userData.name = text;
599
+ },
600
+ placeHolder: '請輸入公司或單位名稱',
601
+ }),
602
+ BgWidget.editeInput({
603
+ gvc: gvc,
604
+ title: html` <div class="d-flex flex-column" style="gap:3px;">
605
+ 聯絡電話 ${BgWidget.grayNote('正確填寫重要資料,避免遺漏重要通知')}
606
+ </div>`,
607
+ default: userData.userData.contact_phone,
608
+ callback: text => {
609
+ userData.userData.contact_phone = text;
610
+ },
611
+ placeHolder: '請輸入聯絡電話',
612
+ }),
613
+ ].join(html` <div class="my-2"></div>`)}
614
+ </div>`;
615
+ },
616
+ footer_html: (gvc: GVC) => {
617
+ return html` <div class="w-100 d-flex align-items-center justify-content-end" style="gap:10px;">
618
+ ${[
619
+ BgWidget.save(
620
+ gvc.event(async () => {
621
+ if (!userData.userData.name) {
622
+ dialog.errorMessage({ text: '請輸入公司或單位名稱' });
623
+ return;
624
+ } else if (!userData.userData.contact_phone) {
625
+ dialog.errorMessage({ text: '請輸入聯絡人電話' });
626
+ return;
627
+ }
628
+ dialog.dataLoading({ visible: true });
629
+ ApiUser.setSaasUserData({
630
+ userData: userData.userData,
631
+ }).then(res => {
632
+ dialog.dataLoading({ visible: false });
633
+ if (!res.result && res.response.data.msg === 'email-verify-false') {
634
+ dialog.errorMessage({ text: '驗證碼輸入錯誤' });
635
+ } else if (!res.result) {
636
+ dialog.errorMessage({ text: '更新異常' });
637
+ } else {
638
+ dialog.successMessage({ text: '設定成功' });
639
+ gvc.closeDialog();
640
+ recreate();
641
+ }
642
+ });
643
+ // (await ApiUser.getSaasUserData(GlobalUser.saas_token, 'me')).response;
644
+ })
645
+ ),
646
+ ].join('')}
647
+ </div>`;
648
+ },
649
+ });
650
+ }
637
651
 
638
- public static openShopList(gvc: GVC) {
639
- gvc.glitter.innerDialog((gvc: GVC) => {
640
- const vm: {
641
- type: 'list' | 'replace';
642
- } = {
643
- type: 'list',
644
- };
645
- return gvc.bindView(() => {
646
- const id = gvc.glitter.getUUID();
647
- return {
652
+ public static openShopList(gvc: GVC) {
653
+ gvc.glitter.innerDialog((gvc: GVC) => {
654
+ const vm: {
655
+ type: 'list' | 'replace';
656
+ } = {
657
+ type: 'list',
658
+ };
659
+ return gvc.bindView(() => {
660
+ const id = gvc.glitter.getUUID();
661
+ return {
662
+ bind: id,
663
+ view: () => {
664
+ if (vm.type === 'list') {
665
+ return html` <div
666
+ style="width: 600px; max-width: 95vw; overflow-y: auto;"
667
+ class="bg-white shadow rounded-3"
668
+ >
669
+ <div class="w-100 d-flex align-items-center p-3 border-bottom">
670
+ <div class="tx_700 me-3">所有商店</div>
671
+ ${BgWidget.grayButton(
672
+ '新增商店',
673
+ gvc.event(() => {
674
+ vm.type = 'replace';
675
+ gvc.notifyDataChange(id);
676
+ }),
677
+ { icon: 'fa-regular fa-circle-plus' }
678
+ )}
679
+ <div class="flex-fill"></div>
680
+ <i
681
+ class="fa-regular fa-circle-xmark fs-5"
682
+ style="color:black; cursor:pointer;"
683
+ onclick="${gvc.event(() => {
684
+ gvc.closeDialog();
685
+ })}"
686
+ ></i>
687
+ </div>
688
+ ${gvc.bindView(() => {
689
+ const vm: {
690
+ loading: boolean;
691
+ data: any;
692
+ } = {
693
+ loading: true,
694
+ data: [],
695
+ };
696
+ const id = gvc.glitter.getUUID();
697
+
698
+ function refresh() {
699
+ vm.loading = true;
700
+ gvc.notifyDataChange(id);
701
+ ApiPageConfig.getAppList().then(res => {
702
+ vm.loading = false;
703
+ vm.data = res.response.result;
704
+ gvc.notifyDataChange(id);
705
+ });
706
+ }
707
+
708
+ refresh();
709
+ return {
648
710
  bind: id,
649
711
  view: () => {
650
- if (vm.type === 'list') {
651
- return html`
652
- <div style="width: 600px; max-width: 95vw; overflow-y: auto;"
653
- class="bg-white shadow rounded-3">
654
- <div class="w-100 d-flex align-items-center p-3 border-bottom">
655
- <div class="tx_700 me-3">所有商店</div>
656
- ${BgWidget.grayButton(
657
- '新增商店',
658
- gvc.event(() => {
659
- vm.type = 'replace';
660
- gvc.notifyDataChange(id);
661
- }),
662
- {icon: 'fa-regular fa-circle-plus'}
663
- )}
664
- <div class="flex-fill"></div>
665
- <i
666
- class="fa-regular fa-circle-xmark fs-5"
667
- style="color:black; cursor:pointer;"
668
- onclick="${gvc.event(() => {
669
- gvc.closeDialog();
670
- })}"
671
- ></i>
712
+ if (vm.loading) {
713
+ return BgWidget.spinner({
714
+ container: {
715
+ class: 'my-3',
716
+ },
717
+ });
718
+ } else {
719
+ return vm.data
720
+ .map((dd: any) => {
721
+ dd.theme_config = dd.theme_config ?? {};
722
+ const storeList = [
723
+ BgWidget.validImageBox({
724
+ gvc,
725
+ image:
726
+ dd.theme_config.preview_image ||
727
+ (dd.config &&
728
+ dd.template_config &&
729
+ dd.template_config.image &&
730
+ dd.template_config.image[0]),
731
+ width: 120 / (document.body.clientWidth > 768 ? 1 : 1.5),
732
+ height: 90 / (document.body.clientWidth > 768 ? 1 : 1.5),
733
+ class: 'rounded-3 shadow',
734
+ }),
735
+ html` <div class="d-flex flex-column" style="margin-left: 15px; gap:1px;">
736
+ <div class="d-flex gap-2" style="text-wrap: wrap;">
737
+ <span class="tx_700"
738
+ >${gvc.bindView(() => {
739
+ return {
740
+ bind: gvc.glitter.getUUID(),
741
+ view: () => {
742
+ //dd.theme_config.name || dd.appName
743
+ return new Promise<string>(async (resolve, reject) => {
744
+ try {
745
+ resolve(
746
+ ((
747
+ await ApiUser.getPublicConfig(
748
+ 'store-information',
749
+ 'manager',
750
+ dd.appName
751
+ )
752
+ ).response.value.shop_name ||
753
+ dd.theme_config.name ||
754
+ dd.appName) as string
755
+ );
756
+ } catch (e) {
757
+ resolve((dd.theme_config.name || dd.appName) as string);
758
+ }
759
+ });
760
+ },
761
+ divCreate: {},
762
+ };
763
+ })}</span
764
+ >
765
+ </div>
766
+ <div class="my-1">
767
+ ${dd.store_permission_title === 'owner' ? BgWidget.infoInsignia('商店擁有人') : ''}
768
+ </div>
769
+ ${(() => {
770
+ const config = dd;
771
+ let planText = gvc.glitter.share.plan_text();
772
+ return html` <div class="d-flex flex-column tx_normal_14">
773
+ 當前方案 : ${planText}
774
+ <div
775
+ style="color: ${new Date(config.dead_line).getTime() < new Date().getTime()
776
+ ? '#da1313'
777
+ : '#4d86db'};"
778
+ >
779
+ ${new Date(config.dead_line).getTime() < new Date().getTime()
780
+ ? '方案過期日'
781
+ : '方案到期日'}
782
+ :${gvc.glitter.ut.dateFormat(new Date(config.dead_line), 'yyyy-MM-dd hh:mm')}
672
783
  </div>
673
- ${gvc.bindView(() => {
674
- const vm: {
675
- loading: boolean;
676
- data: any;
677
- } = {
678
- loading: true,
679
- data: [],
680
- };
681
- const id = gvc.glitter.getUUID();
682
-
683
- function refresh() {
684
- vm.loading = true;
685
- gvc.notifyDataChange(id);
686
- ApiPageConfig.getAppList().then((res) => {
687
- vm.loading = false;
688
- vm.data = res.response.result;
689
- gvc.notifyDataChange(id);
690
- });
691
- }
692
-
693
- refresh();
694
- return {
695
- bind: id,
696
- view: () => {
697
- if (vm.loading) {
698
- return BgWidget.spinner({
699
- container: {
700
- class: 'my-3',
701
- },
702
- });
703
- } else {
704
- return vm.data
705
- .map((dd: any) => {
706
- dd.theme_config = dd.theme_config ?? {};
707
- const storeList = [
708
- BgWidget.validImageBox({
709
- gvc,
710
- image: dd.theme_config.preview_image || (dd.config && dd.template_config && dd.template_config.image && dd.template_config.image[0]),
711
- width: 120 / (document.body.clientWidth > 768 ? 1 : 1.5),
712
- height: 90 / (document.body.clientWidth > 768 ? 1 : 1.5),
713
- class: 'rounded-3 shadow',
714
- }),
715
- html`
716
- <div class="d-flex flex-column"
717
- style="margin-left: 15px; gap:1px;">
718
- <div class="d-flex gap-2"
719
- style="text-wrap: wrap;">
720
- <span class="tx_700"
721
- >${gvc.bindView(() => {
722
- return {
723
- bind: gvc.glitter.getUUID(),
724
- view: () => {
725
- //dd.theme_config.name || dd.appName
726
- return new Promise<string>(async (resolve, reject) => {
727
- try {
728
- resolve(
729
- ((await ApiUser.getPublicConfig('store-information', 'manager', dd.appName)).response.value.shop_name ||
730
- dd.theme_config.name ||
731
- dd.appName) as string
732
- );
733
- } catch (e) {
734
- resolve((dd.theme_config.name || dd.appName) as string);
735
- }
736
- });
737
- },
738
- divCreate: {},
739
- };
740
- })}</span
741
- >
742
- </div>
743
- <div class="my-1">
744
- ${dd.store_permission_title === 'owner' ? BgWidget.infoInsignia('商店擁有人') : ''}
745
- </div>
746
- ${(() => {
747
- const config = dd;
748
- let planText = (gvc.glitter).share.plan_text()
749
- return html`
750
- <div class="d-flex flex-column tx_normal_14">
751
- 當前方案 : ${planText}
752
- <div style="color: ${new Date(config.dead_line).getTime() < new Date().getTime() ? '#da1313' : '#4d86db'};">
753
- ${new Date(config.dead_line).getTime() < new Date().getTime() ? '方案過期日' : '方案到期日'}
754
- :${gvc.glitter.ut.dateFormat(new Date(config.dead_line), 'yyyy-MM-dd hh:mm')}
755
- </div>
756
- </div>`;
757
- })()}
758
- <div class="tx_normal_14">
759
- 上次儲存時間:${gvc.glitter.ut.dateFormat(new Date(dd.update_time), 'yyyy-MM-dd hh:mm')}
760
- </div>
761
- </div>`,
762
- dd.store_permission_title === 'owner'
763
- ? html`
764
- <div class="p-0 me-1" style="width: 40px;">
765
- <button
766
- class="btn btn-size-sm btn-snow text-dark"
767
- type="button"
768
- data-bs-toggle="dropdown"
769
- aria-haspopup="true"
770
- aria-expanded="false"
771
- >
772
- <i class="fa-solid fa-ellipsis"
773
- aria-hidden="true"></i>
774
- </button>
775
- <div class="dropdown-menu">
776
- <a
777
- class="dropdown-item cursor_pointer"
778
- onclick="${gvc.event(() => {
779
- gvc.glitter.setUrlParameter('appName', dd.appName);
780
- SaasViewModel.renew(gvc);
781
- })}"
782
- >續費</a
783
- >
784
- <div class="dropdown-divider"></div>
785
- <a
786
- class="dropdown-item cursor_pointer"
787
- onclick="${gvc.event(() => {
788
- EditorElem.openEditorDialog(
789
- gvc,
790
- (gvc) => {
791
- const appName = dd.theme_config.name || dd.appName;
792
- let deleteText = '';
793
- return html`
794
- <div class="p-2">
795
- ${[
796
- html`
797
- <div class="alert alert-danger p-2 fs-base"
798
- style="white-space: normal;">
799
- 請確認是否刪除此商店,刪除之後將無法復原,請謹慎進行操作
800
- </div>`,
801
- EditorElem.editeInput({
802
- gvc: gvc,
803
- title: '刪除確認',
804
- placeHolder: `請輸入「${appName}」`,
805
- default: deleteText,
806
- callback: (text) => {
807
- deleteText = text;
808
- },
809
- }),
810
- BgWidget.horizontalLine(),
811
- html`
812
- <div class="d-flex align-items-center justify-content-end mb-1">
813
- ${BgWidget.redButton(
814
- '確認刪除',
815
- gvc.event(() => {
816
- const dialog = new ShareDialog(gvc.glitter);
817
- if (deleteText === appName) {
818
- dialog.dataLoading({visible: true});
819
- ApiPageConfig.deleteApp(dd.appName).then((res) => {
820
- dialog.dataLoading({visible: false});
821
- if (dd.appName === (window as any).appName) {
822
- const url = new URL(location.href);
823
- location.href = url.href.replace(url.search, '');
824
- } else {
825
- gvc.closeDialog();
826
- refresh();
827
- }
828
- });
829
- } else {
830
- dialog.errorMessage({text: '輸入錯誤'});
831
- }
832
- })
833
- )}
834
- </div>`,
835
- ].join('')}
836
- </div>`;
837
- },
838
- () => {
839
- },
840
- 400,
841
- '刪除商店'
842
- );
843
- })}"
844
- >刪除商店</a
845
- >
846
- </div>
847
- </div>`
848
- : '',
849
- html`
850
- <div>
851
- ${BgWidget.customButton({
852
- button: {
853
- color: 'black',
854
- size: 'sm',
855
- },
856
- text: {
857
- name: '更換商店',
858
- },
859
- event: gvc.event(() => {
860
- const url = new URL(gvc.glitter.root_path);
861
- url.searchParams.set('type', 'editor');
862
- url.searchParams.set('function', 'backend-manger');
863
- url.searchParams.set('appName', dd.appName);
864
- location.href = url.href;
865
- }),
866
- })}
867
- </div>`,
868
- ];
869
-
870
- if (document.body.clientWidth > 768) {
871
- return html`
872
- <div class="p-4"
873
- style="display: flex; align-items: center;">
874
- ${storeList[0]}${storeList[1]}
875
- <div class="flex-fill"></div>
876
- ${storeList[2]}${storeList[3]}
877
- </div>`;
878
- }
879
- return html`
880
- <div class="p-4"
881
- style="display: flex; align-items: center; justify-content: flex-start; gap: 16px;">
882
- ${storeList[0]}
883
- <div style="width: 100%;">
884
- ${storeList[1]}
885
- <div style="display: flex; justify-content: flex-end; margin-top: 12px;">
886
- ${storeList[2]}${storeList[3]}
887
- </div>
888
- </div>
889
- </div>`;
890
- })
891
- .join(html`
892
- <div class="w-100 border-bottom"></div>`);
893
- }
894
- },
895
- divCreate: {
896
- style: `max-height: 600px; overflow-y: auto;`,
784
+ </div>`;
785
+ })()}
786
+ <div class="tx_normal_14">
787
+ 上次儲存時間:${gvc.glitter.ut.dateFormat(
788
+ new Date(dd.update_time),
789
+ 'yyyy-MM-dd hh:mm'
790
+ )}
791
+ </div>
792
+ </div>`,
793
+ dd.store_permission_title === 'owner'
794
+ ? html` <div class="p-0 me-1" style="width: 40px;">
795
+ <button
796
+ class="btn btn-size-sm btn-snow text-dark"
797
+ type="button"
798
+ data-bs-toggle="dropdown"
799
+ aria-haspopup="true"
800
+ aria-expanded="false"
801
+ >
802
+ <i class="fa-solid fa-ellipsis" aria-hidden="true"></i>
803
+ </button>
804
+ <div class="dropdown-menu">
805
+ <a
806
+ class="dropdown-item cursor_pointer"
807
+ onclick="${gvc.event(() => {
808
+ gvc.glitter.setUrlParameter('appName', dd.appName);
809
+ SaasViewModel.renew(gvc);
810
+ })}"
811
+ >續費</a
812
+ >
813
+ <div class="dropdown-divider"></div>
814
+ <a
815
+ class="dropdown-item cursor_pointer"
816
+ onclick="${gvc.event(() => {
817
+ EditorElem.openEditorDialog(
818
+ gvc,
819
+ gvc => {
820
+ const appName = dd.theme_config.name || dd.appName;
821
+ let deleteText = '';
822
+ return html` <div class="p-2">
823
+ ${[
824
+ html` <div
825
+ class="alert alert-danger p-2 fs-base"
826
+ style="white-space: normal;"
827
+ >
828
+ 請確認是否刪除此商店,刪除之後將無法復原,請謹慎進行操作
829
+ </div>`,
830
+ EditorElem.editeInput({
831
+ gvc: gvc,
832
+ title: '刪除確認',
833
+ placeHolder: `請輸入「${appName}」`,
834
+ default: deleteText,
835
+ callback: text => {
836
+ deleteText = text;
837
+ },
838
+ }),
839
+ BgWidget.horizontalLine(),
840
+ html` <div class="d-flex align-items-center justify-content-end mb-1">
841
+ ${BgWidget.redButton(
842
+ '確認刪除',
843
+ gvc.event(() => {
844
+ const dialog = new ShareDialog(gvc.glitter);
845
+ if (deleteText === appName) {
846
+ dialog.dataLoading({ visible: true });
847
+ ApiPageConfig.deleteApp(dd.appName).then(res => {
848
+ dialog.dataLoading({ visible: false });
849
+ if (dd.appName === (window as any).appName) {
850
+ const url = new URL(location.href);
851
+ location.href = url.href.replace(url.search, '');
852
+ } else {
853
+ gvc.closeDialog();
854
+ refresh();
855
+ }
856
+ });
857
+ } else {
858
+ dialog.errorMessage({ text: '輸入錯誤' });
859
+ }
860
+ })
861
+ )}
862
+ </div>`,
863
+ ].join('')}
864
+ </div>`;
897
865
  },
898
- };
899
- })}
900
- </div>`;
901
- } else {
902
- return SaasViewModel.createShop(gvc, false);
903
- }
904
- },
905
- };
906
- });
907
- }, 'change_app');
908
- }
866
+ () => {},
867
+ 400,
868
+ '刪除商店'
869
+ );
870
+ })}"
871
+ >刪除商店</a
872
+ >
873
+ </div>
874
+ </div>`
875
+ : '',
876
+ html` <div>
877
+ ${BgWidget.customButton({
878
+ button: {
879
+ color: 'black',
880
+ size: 'sm',
881
+ },
882
+ text: {
883
+ name: '更換商店',
884
+ },
885
+ event: gvc.event(() => {
886
+ const url = new URL(gvc.glitter.root_path);
887
+ url.searchParams.set('type', 'editor');
888
+ url.searchParams.set('function', 'backend-manger');
889
+ url.searchParams.set('appName', dd.appName);
890
+ location.href = url.href;
891
+ }),
892
+ })}
893
+ </div>`,
894
+ ];
909
895
 
910
- public static createShop(gvc: GVC, register?: boolean) {
911
- const postMD: {
912
- appName: string;
913
- name: string;
914
- sub_domain: string;
915
- refer_app: string;
916
- } = {
917
- name: '',
918
- appName: 't_' + new Date().getTime(),
919
- sub_domain: '',
920
- refer_app: '',
896
+ if (document.body.clientWidth > 768) {
897
+ return html` <div class="p-4" style="display: flex; align-items: center;">
898
+ ${storeList[0]}${storeList[1]}
899
+ <div class="flex-fill"></div>
900
+ ${storeList[2]}${storeList[3]}
901
+ </div>`;
902
+ }
903
+ return html` <div
904
+ class="p-4"
905
+ style="display: flex; align-items: center; justify-content: flex-start; gap: 16px;"
906
+ >
907
+ ${storeList[0]}
908
+ <div style="width: 100%;">
909
+ ${storeList[1]}
910
+ <div style="display: flex; justify-content: flex-end; margin-top: 12px;">
911
+ ${storeList[2]}${storeList[3]}
912
+ </div>
913
+ </div>
914
+ </div>`;
915
+ })
916
+ .join(html` <div class="w-100 border-bottom"></div>`);
917
+ }
918
+ },
919
+ divCreate: {
920
+ style: `max-height: 600px; overflow-y: auto;`,
921
+ },
922
+ };
923
+ })}
924
+ </div>`;
925
+ } else {
926
+ return SaasViewModel.createShop(gvc, false);
927
+ }
928
+ },
921
929
  };
922
- gvc.addStyle(`
930
+ });
931
+ }, 'change_app');
932
+ }
933
+
934
+ public static createShop(gvc: GVC, register?: boolean) {
935
+ const postMD: {
936
+ appName: string;
937
+ name: string;
938
+ sub_domain: string;
939
+ refer_app: string;
940
+ } = {
941
+ name: '',
942
+ appName: 't_' + new Date().getTime(),
943
+ sub_domain: '',
944
+ refer_app: '',
945
+ };
946
+ gvc.addStyle(`
923
947
  .hoverHidden div {
924
948
  display: none;
925
949
  }
@@ -927,539 +951,561 @@ export class SaasViewModel {
927
951
  display: flex;
928
952
  }
929
953
  `);
930
- gvc.glitter.addStyleLink(gvc.glitter.root_path + `/css/editor.css`);
931
- const hr = html`
932
- <div style="${(document.body.clientWidth<800) ? `width: 100%;`:`width: 600px;max-width: calc(100vw - 20px); overflow-y: auto;max-height: calc(100vh - 50px);`}"
933
- class="bg-white shadow ${(document.body.clientWidth>800) ? `rounded-3`:``}">
934
- <div class="w-100 d-flex align-items-center p-3 border-bottom">
935
- <div class="fw-500 color39" style="padding-top: ${gvc.glitter.share.top_inset}px;">建立您的商店</div>
936
- <div class="flex-fill"></div>
937
- <i
938
- class="fa-regular fa-circle-xmark fs-5 color39 ${register ? `d-none` : ``}"
939
- style="cursor:pointer;"
940
- onclick="${gvc.event(() => {
941
- gvc.closeDialog();
942
- })}"
943
- ></i>
944
- </div>
945
- ${gvc.bindView(() => {
946
- const id = gvc.glitter.getUUID();
947
- return {
948
- bind: id,
949
- view: () => {
950
- return html`
951
- <div class="px-3 py-2">
952
- ${[
953
- EditorElem.editeInput({
954
- gvc: gvc,
955
- title: '商店名稱',
956
- style: 'color:#393939',
957
- placeHolder: `請輸入商店名稱`,
958
- default: postMD.name,
959
- callback: (text) => {
960
- postMD.name = text;
961
- },
962
- }),
963
- gvc.bindView(() => {
964
- const id = gvc.glitter.getUUID();
965
- return {
966
- bind: id,
967
- view: () => {
968
- return EditorElem.editeInput({
969
- gvc: gvc,
970
- title: html`
971
- <div class="my-2">
972
- <div class="mb-1">免費商店網址</div>
973
- <div class="d-flex flex-column" style="">
974
- ${BgWidget.grayNote('建議輸入與品牌相關的英文名稱')}
975
- ${BgWidget.greenNote(`https://${postMD.sub_domain || '尚未輸入'}.shopnex.tw`, '', 'margin-top: 0.5rem')}
976
- </div>
977
- </div>
978
- `,
979
- pattern: `A-Za-z0-9-`,
980
- placeHolder: `請輸入商店網址`,
981
- default: postMD.sub_domain,
982
- callback: (text) => {
983
- postMD.sub_domain = text;
984
- gvc.notifyDataChange(id);
985
- },
986
- });
987
- },
988
- };
989
- }),
990
- EditorElem.h3(`<div class="d-flex flex-column" style="gap:3px;">
991
- ${['選擇初始模板',BgWidget.grayNote('請選擇初始模板,後續可在進行更換')].join('')}
992
- </div>`),
993
-
994
- SaasViewModel.initialTemplate(gvc, (appName) => {
995
- postMD.refer_app = appName;
996
- }),
997
- ].join('<div class="my-2"></div>')}
998
- </div>`;
999
- },
1000
- divCreate: {
1001
- style: `max-height:calc(${window.innerHeight - gvc.glitter.share.top_inset - gvc.glitter.share.bottom_inset}px - ${document.body.clientWidth>1200 ? `165`:`115`}px);overflow-y:auto;`,
1002
- class: ``,
954
+ gvc.glitter.addStyleLink(gvc.glitter.root_path + `/css/editor.css`);
955
+ const hr = html` <div
956
+ style="${document.body.clientWidth < 800
957
+ ? `width: 100%;`
958
+ : `width: 600px;max-width: calc(100vw - 20px); overflow-y: auto;max-height: calc(100vh - 50px);`}"
959
+ class="bg-white shadow ${document.body.clientWidth > 800 ? `rounded-3` : ``}"
960
+ >
961
+ <div class="w-100 d-flex align-items-center p-3 border-bottom">
962
+ <div class="fw-500 color39" style="padding-top: ${gvc.glitter.share.top_inset}px;">建立您的商店</div>
963
+ <div class="flex-fill"></div>
964
+ <i
965
+ class="fa-regular fa-circle-xmark fs-5 color39 ${register ? `d-none` : ``}"
966
+ style="cursor:pointer;"
967
+ onclick="${gvc.event(() => {
968
+ gvc.closeDialog();
969
+ })}"
970
+ ></i>
971
+ </div>
972
+ ${gvc.bindView(() => {
973
+ const id = gvc.glitter.getUUID();
974
+ return {
975
+ bind: id,
976
+ view: () => {
977
+ return html` <div class="px-3 py-2">
978
+ ${[
979
+ EditorElem.editeInput({
980
+ gvc: gvc,
981
+ title: '商店名稱',
982
+ style: 'color:#393939',
983
+ placeHolder: `請輸入商店名稱`,
984
+ default: postMD.name,
985
+ callback: text => {
986
+ postMD.name = text;
987
+ },
988
+ }),
989
+ gvc.bindView(() => {
990
+ const id = gvc.glitter.getUUID();
991
+ return {
992
+ bind: id,
993
+ view: () => {
994
+ return EditorElem.editeInput({
995
+ gvc: gvc,
996
+ title: html`
997
+ <div class="my-2">
998
+ <div class="mb-1">免費商店網址</div>
999
+ <div class="d-flex flex-column" style="">
1000
+ ${BgWidget.grayNote('建議輸入與品牌相關的英文名稱')}
1001
+ ${BgWidget.greenNote(
1002
+ `https://${postMD.sub_domain || '尚未輸入'}.shopnex.tw`,
1003
+ '',
1004
+ 'margin-top: 0.5rem'
1005
+ )}
1006
+ </div>
1007
+ </div>
1008
+ `,
1009
+ pattern: `A-Za-z0-9-`,
1010
+ placeHolder: `請輸入商店網址`,
1011
+ default: postMD.sub_domain,
1012
+ callback: text => {
1013
+ postMD.sub_domain = text;
1014
+ gvc.notifyDataChange(id);
1003
1015
  },
1004
- };
1005
- })}
1006
- <div class="w-100 d-flex align-items-center justify-content-end shadow p-3">
1007
- ${BgWidget.save(
1008
- gvc.event(() => {
1009
- const dialog = new ShareDialog(gvc.glitter);
1010
- if (!postMD.sub_domain) {
1011
- dialog.errorMessage({
1012
- text: '請填寫預設網域',
1013
- });
1014
- } else if (!postMD.name) {
1015
- dialog.errorMessage({
1016
- text: '請填寫商店名稱',
1017
- });
1018
- } else if (!postMD.refer_app) {
1019
- dialog.errorMessage({
1020
- text: '請選擇預設模板',
1021
- });
1022
- } else {
1023
- SaasViewModel.createApp(gvc, postMD.appName, postMD.name, postMD.refer_app, postMD.sub_domain, register!);
1024
- }
1025
- }),
1026
- '確認建立'
1027
- )}
1028
- </div>
1016
+ });
1017
+ },
1018
+ };
1019
+ }),
1020
+ EditorElem.h3(`<div class="d-flex flex-column" style="gap:3px;">
1021
+ ${['選擇初始模板', BgWidget.grayNote('請選擇初始模板,後續可在進行更換')].join('')}
1022
+ </div>`),
1023
+
1024
+ SaasViewModel.initialTemplate(gvc, appName => {
1025
+ postMD.refer_app = appName;
1026
+ }),
1027
+ ].join('<div class="my-2"></div>')}
1029
1028
  </div>`;
1030
- if (register) {
1031
- if(document.body.clientWidth<800){
1032
- return `<div class="position-fixed w-100 vh-100 bg-white" style="top:0px;left:0px;">
1033
- ${hr}
1034
- </div>`
1029
+ },
1030
+ divCreate: {
1031
+ style: `max-height:calc(${window.innerHeight - gvc.glitter.share.top_inset - gvc.glitter.share.bottom_inset}px - ${document.body.clientWidth > 1200 ? `165` : `115`}px);overflow-y:auto;`,
1032
+ class: ``,
1033
+ },
1034
+ };
1035
+ })}
1036
+ <div class="w-100 d-flex align-items-center justify-content-end shadow p-3">
1037
+ ${BgWidget.save(
1038
+ gvc.event(() => {
1039
+ const dialog = new ShareDialog(gvc.glitter);
1040
+ if (!postMD.sub_domain) {
1041
+ dialog.errorMessage({
1042
+ text: '請填寫預設網域',
1043
+ });
1044
+ } else if (!postMD.name) {
1045
+ dialog.errorMessage({
1046
+ text: '請填寫商店名稱',
1047
+ });
1048
+ } else if (!postMD.refer_app) {
1049
+ dialog.errorMessage({
1050
+ text: '請選擇預設模板',
1051
+ });
1052
+ } else {
1053
+ SaasViewModel.createApp(gvc, postMD.appName, postMD.name, postMD.refer_app, postMD.sub_domain, register!);
1035
1054
  }
1036
- return html`
1037
- <div
1038
- class="position-fixed vw-100 vh-100 d-flex align-items-center justify-content-center bg-white"
1039
- style="left: 0px;top:0px;
1055
+ }),
1056
+ '確認建立'
1057
+ )}
1058
+ </div>
1059
+ </div>`;
1060
+ if (register) {
1061
+ if (document.body.clientWidth < 800) {
1062
+ return `<div class="position-fixed w-100 vh-100 bg-white" style="top:0px;left:0px;">
1063
+ ${hr}
1064
+ </div>`;
1065
+ }
1066
+ return html` <div
1067
+ class="position-fixed vw-100 vh-100 d-flex align-items-center justify-content-center bg-white"
1068
+ style="left: 0px;top:0px;
1040
1069
  background-image: url('https://d3jnmi1tfjgtti.cloudfront.net/file/252530754/1711305933115-第一個背景橘色.png');
1041
1070
  background-size: cover;
1042
1071
  "
1043
- >
1044
- ${hr}
1045
- </div>`;
1046
- } else {
1047
- return hr;
1048
- }
1072
+ >
1073
+ ${hr}
1074
+ </div>`;
1075
+ } else {
1076
+ return hr;
1049
1077
  }
1078
+ }
1050
1079
 
1051
- public static initialTemplate(gvc: GVC, callback: (appName: string) => void) {
1052
- let vm = {
1053
- search: '',
1054
- select: '',
1055
- };
1056
- const containerID = gvc.glitter.getUUID();
1057
- return gvc.bindView(() => {
1058
- return {
1059
- bind: containerID,
1060
- view: () => {
1061
- return gvc.bindView(() => {
1062
- let data: any = undefined;
1063
- const id = gvc.glitter.getUUID();
1064
- ApiPageConfig.getTemplateList().then((res) => {
1065
- data = res;
1066
- data.response.result.reverse();
1067
- gvc.notifyDataChange(id);
1068
- });
1080
+ public static initialTemplate(gvc: GVC, callback: (appName: string) => void) {
1081
+ let vm = {
1082
+ search: '',
1083
+ select: '',
1084
+ };
1085
+ const containerID = gvc.glitter.getUUID();
1086
+ return gvc.bindView(() => {
1087
+ return {
1088
+ bind: containerID,
1089
+ view: () => {
1090
+ return gvc.bindView(() => {
1091
+ let data: any = undefined;
1092
+ const id = gvc.glitter.getUUID();
1093
+ ApiPageConfig.getTemplateList().then(res => {
1094
+ data = res;
1095
+ data.response.result.reverse();
1096
+ gvc.notifyDataChange(id);
1097
+ });
1069
1098
 
1070
- return {
1071
- bind: id,
1072
- view: () => {
1073
- if (data) {
1074
- return (() => {
1075
- if (data.response.result.length === 0) {
1076
- if (!vm.search) {
1077
- return html`
1078
- <div class="d-flex align-items-center justify-content-center flex-column w-100 py-4"
1079
- style="width:700px;gap:10px;">
1080
- <img src="./img/box-open-solid.svg"/>
1081
- <span class="color39 text-center">尚未自製任何模塊<br/>請前往開發者模式自製專屬模塊</span>
1082
- </div>
1083
- `;
1084
- } else {
1085
- return html`
1086
- <div class="d-flex align-items-center justify-content-center flex-column w-100 py-4"
1087
- style="width:700px;gap:10px;">
1088
- <img src="./img/box-open-solid.svg"/>
1089
- <span class="color39 text-center">查無相關模塊</span>
1090
- </div>
1091
- `;
1092
- }
1093
- } else {
1094
- return html`
1095
- <div class="w-100" style=" overflow-y: auto;">
1096
- <div class="row m-0 pt-2 mx-n2">
1097
- ${data.response.result
1098
- .map((dd: any, index: number) => {
1099
- return html`
1100
- <div class="col-6 col-sm-4 mb-3 rounded-3">
1101
- <div
1102
- class="d-flex flex-column justify-content-center w-100 "
1103
- style="gap:5px;cursor:pointer;${vm.select === dd.appName
1104
- ? `overflow:hidden;background: #FFB400;border: 1px solid #FF6C02;padding:10px;border-radius: 5px;`
1105
- : ``}"
1106
- >
1107
- <div class="card w-100 position-relative rounded hoverHidden bgf6 rounded-3"
1108
- style="padding-bottom: 133%;">
1109
- <div
1110
- class="position-absolute w-100 h-100 d-flex align-items-center justify-content-center rounded-3"
1111
- style="overflow: hidden;"
1112
- >
1113
- <img
1114
- class="w-100 "
1115
- src="${dd.template_config.image[0] ??
1116
- 'https://d3jnmi1tfjgtti.cloudfront.net/file/252530754/1713445383494-未命名(1080x1080像素).jpg'}"
1117
- />
1118
- </div>
1099
+ return {
1100
+ bind: id,
1101
+ view: () => {
1102
+ if (data) {
1103
+ return (() => {
1104
+ if (data.response.result.length === 0) {
1105
+ if (!vm.search) {
1106
+ return html`
1107
+ <div
1108
+ class="d-flex align-items-center justify-content-center flex-column w-100 py-4"
1109
+ style="width:700px;gap:10px;"
1110
+ >
1111
+ <img src="./img/box-open-solid.svg" />
1112
+ <span class="color39 text-center">尚未自製任何模塊<br />請前往開發者模式自製專屬模塊</span>
1113
+ </div>
1114
+ `;
1115
+ } else {
1116
+ return html`
1117
+ <div
1118
+ class="d-flex align-items-center justify-content-center flex-column w-100 py-4"
1119
+ style="width:700px;gap:10px;"
1120
+ >
1121
+ <img src="./img/box-open-solid.svg" />
1122
+ <span class="color39 text-center">查無相關模塊</span>
1123
+ </div>
1124
+ `;
1125
+ }
1126
+ } else {
1127
+ return html`
1128
+ <div class="w-100" style=" overflow-y: auto;">
1129
+ <div class="row m-0 pt-2 mx-n2">
1130
+ ${data.response.result
1131
+ .map((dd: any, index: number) => {
1132
+ return html`
1133
+ <div class="col-6 col-sm-4 mb-3 rounded-3">
1134
+ <div
1135
+ class="d-flex flex-column justify-content-center w-100 "
1136
+ style="gap:5px;cursor:pointer;${vm.select === dd.appName
1137
+ ? `overflow:hidden;background: #FFB400;border: 1px solid #FF6C02;padding:10px;border-radius: 5px;`
1138
+ : ``}"
1139
+ >
1140
+ <div
1141
+ class="card w-100 position-relative rounded hoverHidden bgf6 rounded-3"
1142
+ style="padding-bottom: 133%;"
1143
+ >
1144
+ <div
1145
+ class="position-absolute w-100 h-100 d-flex align-items-center justify-content-center rounded-3"
1146
+ style="overflow: hidden;"
1147
+ >
1148
+ <img
1149
+ class="w-100 "
1150
+ src="${dd.template_config.image[0] ??
1151
+ 'https://d3jnmi1tfjgtti.cloudfront.net/file/252530754/1713445383494-未命名(1080x1080像素).jpg'}"
1152
+ />
1153
+ </div>
1119
1154
 
1120
- <div
1121
- class="position-absolute w-100 h-100 align-items-center justify-content-center rounded fs-6 flex-column"
1122
- style="background: rgba(0,0,0,0.5);gap:5px;"
1123
- >
1124
- <button
1125
- class="btn btn-secondary d-flex align-items-center "
1126
- style="height: 28px;width: 75px;gap:5px;"
1127
- onclick="${gvc.event(() => {
1128
- vm.select = dd.appName;
1129
- callback(dd.appName);
1130
- gvc.notifyDataChange(id);
1131
- })}"
1132
- >
1133
- 選擇
1134
- </button>
1135
- </div>
1136
- </div>
1137
- <h3 class="fs-6 mb-0 d-flex justify-content-between align-items-center">
1138
- ${dd.template_config.name}
1139
- <i
1140
- class="fa-solid fa-eye"
1141
- style="cursor:pointer;"
1142
- onclick="${gvc.event(() => {
1143
- gvc.glitter.openNewTab(`https://${dd.domain}/index`);
1144
- })}"
1145
- ></i>
1146
- </h3>
1147
- </div>
1148
- </div>
1149
- `;
1150
- })
1151
- .join('')}
1152
- </div>
1153
- </div>
1154
- `;
1155
- }
1156
- })();
1157
- } else {
1158
- return html`
1159
- <div class="w-100 p-3 d-flex align-items-center justify-content-center flex-column"
1160
- style="gap: 10px;">
1161
- <div class="spinner-border fs-5"></div>
1162
- <div class="fs-6 fw-500">載入中...</div>
1163
- </div>`;
1164
- }
1165
- },
1166
- divCreate: {
1167
- style: '',
1168
- },
1169
- };
1170
- });
1171
- },
1155
+ <div
1156
+ class="position-absolute w-100 h-100 align-items-center justify-content-center rounded fs-6 flex-column"
1157
+ style="background: rgba(0,0,0,0.5);gap:5px;"
1158
+ >
1159
+ <button
1160
+ class="btn btn-secondary d-flex align-items-center "
1161
+ style="height: 28px;width: 75px;gap:5px;"
1162
+ onclick="${gvc.event(() => {
1163
+ vm.select = dd.appName;
1164
+ callback(dd.appName);
1165
+ gvc.notifyDataChange(id);
1166
+ })}"
1167
+ >
1168
+ 選擇
1169
+ </button>
1170
+ </div>
1171
+ </div>
1172
+ <h3 class="fs-6 mb-0 d-flex justify-content-between align-items-center">
1173
+ ${dd.template_config.name}
1174
+ <i
1175
+ class="fa-solid fa-eye"
1176
+ style="cursor:pointer;"
1177
+ onclick="${gvc.event(() => {
1178
+ gvc.glitter.openNewTab(`https://${dd.domain}/index`);
1179
+ })}"
1180
+ ></i>
1181
+ </h3>
1182
+ </div>
1183
+ </div>
1184
+ `;
1185
+ })
1186
+ .join('')}
1187
+ </div>
1188
+ </div>
1189
+ `;
1190
+ }
1191
+ })();
1192
+ } else {
1193
+ return html` <div
1194
+ class="w-100 p-3 d-flex align-items-center justify-content-center flex-column"
1195
+ style="gap: 10px;"
1196
+ >
1197
+ <div class="spinner-border fs-5"></div>
1198
+ <div class="fs-6 fw-500">載入中...</div>
1199
+ </div>`;
1200
+ }
1201
+ },
1202
+ divCreate: {
1203
+ style: '',
1204
+ },
1172
1205
  };
1173
- });
1174
- }
1206
+ });
1207
+ },
1208
+ };
1209
+ });
1210
+ }
1175
1211
 
1176
- public static renew(gvc: GVC) {
1177
- gvc.closeDialog();
1178
- (window.parent as any).glitter.setUrlParameter('tab', 'member_plan');
1179
- (window.parent as any).glitter.pageConfig[0].gvc!.recreateView();
1180
- }
1212
+ public static renew(gvc: GVC) {
1213
+ gvc.closeDialog();
1214
+ (window.parent as any).glitter.setUrlParameter('tab', 'member_plan');
1215
+ (window.parent as any).glitter.pageConfig[0].gvc!.recreateView();
1216
+ }
1181
1217
 
1182
- public static createApp(gvc: GVC, app_name: string, pick_name: string, refer_app: string, sub_domain: string, register: boolean) {
1183
- return new Promise(async (resolve, reject) => {
1184
- const pass = /^[a-zA-Z0-9_-]+$/.test(app_name);
1185
- if (!pass) {
1186
- resolve(false);
1187
- return;
1188
- }
1189
- const createAPP = refer_app;
1190
- const appName = app_name;
1191
- const glitter = (window as any).glitter;
1192
- const shareDialog = new ShareDialog(glitter);
1193
- const html = String.raw;
1194
- if (gvc.glitter.getCookieByName('glitterToken') === undefined) {
1195
- shareDialog.errorMessage({text: '請先登入'});
1196
- return;
1218
+ public static createApp(
1219
+ gvc: GVC,
1220
+ app_name: string,
1221
+ pick_name: string,
1222
+ refer_app: string,
1223
+ sub_domain: string,
1224
+ register: boolean
1225
+ ) {
1226
+ return new Promise(async (resolve, reject) => {
1227
+ const pass = /^[a-zA-Z0-9_-]+$/.test(app_name);
1228
+ if (!pass) {
1229
+ resolve(false);
1230
+ return;
1231
+ }
1232
+ const createAPP = refer_app;
1233
+ const appName = app_name;
1234
+ const glitter = (window as any).glitter;
1235
+ const shareDialog = new ShareDialog(glitter);
1236
+ const html = String.raw;
1237
+ if (gvc.glitter.getCookieByName('glitterToken') === undefined) {
1238
+ shareDialog.errorMessage({ text: '請先登入' });
1239
+ return;
1240
+ } else {
1241
+ if (!appName) {
1242
+ shareDialog.errorMessage({ text: '請輸入APP名稱' });
1243
+ return;
1244
+ }
1245
+ const saasConfig: {
1246
+ config: any;
1247
+ api: any;
1248
+ } = (window as any).saasConfig;
1249
+ shareDialog.dataLoading({
1250
+ visible: true,
1251
+ text: '商店準備中...',
1252
+ });
1253
+ BaseApi.create({
1254
+ url: saasConfig.config.url + `/api/v1/app`,
1255
+ type: 'POST',
1256
+ timeout: 0,
1257
+ headers: {
1258
+ 'Content-Type': 'application/json',
1259
+ Authorization: register ? GlobalUser.token : GlobalUser.saas_token,
1260
+ },
1261
+ data: JSON.stringify({
1262
+ domain: '',
1263
+ appName: encodeURIComponent(appName),
1264
+ copyApp: createAPP,
1265
+ sub_domain: sub_domain,
1266
+ brand: register ? (window as any).appName : (window as any).glitterBase,
1267
+ name: pick_name,
1268
+ copyWith: ['checkout', 'user', 'public_config'],
1269
+ }),
1270
+ }).then(d2 => {
1271
+ shareDialog.dataLoading({ visible: false });
1272
+ if (d2.result) {
1273
+ const url = new URL(location.href);
1274
+ url.searchParams.set('type', 'editor');
1275
+ url.searchParams.set('page', '');
1276
+ url.searchParams.set('function', 'backend-manger');
1277
+ url.searchParams.set('appName', appName as string);
1278
+ location.href = url.href;
1279
+ resolve(true);
1280
+ } else {
1281
+ if (d2.response.code === 'HAVE_APP') {
1282
+ shareDialog.errorMessage({ text: '建立失敗,此英文名稱已被使用' });
1283
+ } else if (d2.response.code === 'HAVE_DOMAIN') {
1284
+ shareDialog.errorMessage({ text: '建立失敗,此網域名稱已被使用' });
1197
1285
  } else {
1198
- if (!appName) {
1199
- shareDialog.errorMessage({text: '請輸入APP名稱'});
1200
- return;
1201
- }
1202
- const saasConfig: {
1203
- config: any;
1204
- api: any;
1205
- } = (window as any).saasConfig;
1206
- shareDialog.dataLoading({
1207
- visible: true,
1208
- text: '商店準備中...',
1209
- });
1210
- BaseApi.create({
1211
- url: saasConfig.config.url + `/api/v1/app`,
1212
- type: 'POST',
1213
- timeout: 0,
1214
- headers: {
1215
- 'Content-Type': 'application/json',
1216
- Authorization: register ? GlobalUser.token : GlobalUser.saas_token,
1217
- },
1218
- data: JSON.stringify({
1219
- domain: '',
1220
- appName: encodeURIComponent(appName),
1221
- copyApp: createAPP,
1222
- sub_domain: sub_domain,
1223
- brand: register ? (window as any).appName : (window as any).glitterBase,
1224
- name: pick_name,
1225
- copyWith: ['checkout', 'user', 'public_config'],
1226
- }),
1227
- }).then((d2) => {
1228
- shareDialog.dataLoading({visible: false});
1229
- if (d2.result) {
1230
- const url = new URL(location.href);
1231
- url.searchParams.set('type', 'editor');
1232
- url.searchParams.set('page', '');
1233
- url.searchParams.set('function', 'backend-manger');
1234
- url.searchParams.set('appName', appName as string);
1235
- location.href = url.href;
1236
- resolve(true);
1237
- } else {
1238
- if (d2.response.code === 'HAVE_APP') {
1239
- shareDialog.errorMessage({text: '建立失敗,此英文名稱已被使用'});
1240
- } else if (d2.response.code === 'HAVE_DOMAIN') {
1241
- shareDialog.errorMessage({text: '建立失敗,此網域名稱已被使用'});
1242
- } else {
1243
- shareDialog.errorMessage({text: '建立失敗,此英文名稱已被使用'});
1244
- }
1245
- resolve(false);
1246
- }
1247
- });
1286
+ shareDialog.errorMessage({ text: '建立失敗,此英文名稱已被使用' });
1248
1287
  }
1288
+ resolve(false);
1289
+ }
1249
1290
  });
1250
- }
1291
+ }
1292
+ });
1293
+ }
1251
1294
 
1252
- public static notifySetting(gvc: GVC) {
1253
- const glitter = gvc.glitter;
1254
- const dialog = new ShareDialog(gvc.glitter);
1255
- const ids = {
1256
- container: glitter.getUUID(),
1257
- };
1258
- const notifyType = [
1259
- {title: '信件通知', key: 'email'},
1260
- {title: 'LINE通知', key: 'line'},
1261
- {title: '簡訊發送', key: 'sms'},
1262
- ];
1263
- const defaultData = notifyType.map((item) => {
1295
+ public static notifySetting(gvc: GVC) {
1296
+ const glitter = gvc.glitter;
1297
+ const dialog = new ShareDialog(gvc.glitter);
1298
+ const ids = {
1299
+ container: glitter.getUUID(),
1300
+ };
1301
+ const notifyType = [
1302
+ { title: '信件通知', key: 'email' },
1303
+ { title: 'LINE通知', key: 'line' },
1304
+ { title: '簡訊發送', key: 'sms' },
1305
+ ];
1306
+ const defaultData = notifyType.map(item => {
1307
+ return {
1308
+ type: item.key,
1309
+ list: [
1310
+ {
1311
+ key: 'auto-email-shipment',
1312
+ status: true,
1313
+ },
1314
+ {
1315
+ key: 'auto-email-in-stock',
1316
+ status: true,
1317
+ },
1318
+ {
1319
+ key: 'auto-email-shipment-arrival',
1320
+ status: true,
1321
+ },
1322
+ {
1323
+ key: 'auto-email-order-create',
1324
+ status: true,
1325
+ },
1326
+ {
1327
+ key: 'auto-email-payment-successful',
1328
+ status: true,
1329
+ },
1330
+ {
1331
+ key: 'proof-purchase',
1332
+ status: true,
1333
+ },
1334
+ {
1335
+ key: 'user-register',
1336
+ status: true,
1337
+ },
1338
+ {
1339
+ key: 'get-customer-message',
1340
+ status: true,
1341
+ },
1342
+ {
1343
+ key: 'form-receive',
1344
+ status: true,
1345
+ },
1346
+ ],
1347
+ };
1348
+ });
1349
+ const vm = {
1350
+ dataList: [] as {
1351
+ type: string;
1352
+ list: {
1353
+ key: string;
1354
+ status: boolean;
1355
+ }[];
1356
+ }[],
1357
+ select: 'email',
1358
+ selectId: 0,
1359
+ loading: true,
1360
+ };
1361
+ return BgWidget.settingDialog({
1362
+ gvc,
1363
+ title: '通知設定',
1364
+ innerHTML: () => {
1365
+ return gvc.bindView(
1366
+ (() => {
1264
1367
  return {
1265
- type: item.key,
1266
- list: [
1267
- {
1268
- key: 'auto-email-shipment',
1269
- status: true,
1270
- },
1271
- {
1272
- key: 'auto-email-shipment-arrival',
1273
- status: true,
1274
- },
1275
- {
1276
- key: 'auto-email-order-create',
1277
- status: true,
1278
- },
1279
- {
1280
- key: 'auto-email-payment-successful',
1281
- status: true,
1282
- },
1283
- {
1284
- key: 'proof-purchase',
1285
- status: true,
1286
- },
1287
- {
1288
- key: 'user-register',
1289
- status: true,
1290
- },
1291
- {
1292
- key: 'get-customer-message',
1293
- status: true,
1294
- },
1295
- {
1296
- key: 'form-receive',
1297
- status: true,
1298
- },
1299
- ],
1300
- };
1301
- });
1302
- const vm = {
1303
- dataList: [] as {
1304
- type: string;
1305
- list: {
1306
- key: string;
1307
- status: boolean;
1308
- }[];
1309
- }[],
1310
- select: 'email',
1311
- selectId: 0,
1312
- loading: true,
1313
- };
1314
- return BgWidget.settingDialog({
1315
- gvc,
1316
- title: '通知設定',
1317
- innerHTML: () => {
1318
- return gvc.bindView(
1319
- (() => {
1320
- return {
1321
- bind: ids.container,
1322
- view: () => {
1323
- if (vm.loading) {
1324
- return BgWidget.spinner();
1325
- } else {
1326
- return [
1327
- BgWidget.tab(
1328
- notifyType,
1329
- gvc,
1330
- vm.select,
1331
- (text) => {
1332
- vm.select = text as any;
1333
- vm.selectId = notifyType.findIndex((item) => item.key === vm.select);
1334
- gvc.notifyDataChange(ids.container);
1335
- },
1336
- 'margin: 0 !important; position: sticky; top: 0; background-color: #fff; z-index: 2;'
1337
- ),
1338
- BgWidget.tableV3({
1339
- gvc,
1340
- getData: (vmi) => {
1341
- vmi.pageSize = 1;
1342
- vmi.originalData = vm.dataList;
1343
- vmi.tableData = vm.dataList[vm.selectId].list.map((dd: any) => {
1344
- return [
1345
- {
1346
- key: '通知事件',
1347
- value: (() => {
1348
- switch (dd.key) {
1349
- case 'auto-email-shipment':
1350
- return '商品出貨';
1351
- case 'auto-email-shipment-arrival':
1352
- return '商品到貨';
1353
- case 'auto-email-order-create':
1354
- return '訂單成立';
1355
- case 'auto-email-payment-successful':
1356
- return '訂單付款成功';
1357
- case 'proof-purchase':
1358
- return '訂單待核款';
1359
- case 'user-register':
1360
- return '顧客新註冊通知';
1361
- case 'get-customer-message':
1362
- return '客服訊息';
1363
- case 'form-receive':
1364
- return '表單收集信件';
1365
- default:
1366
- return '其他通知';
1367
- }
1368
- })(),
1369
- },
1370
- {
1371
- key: '狀態',
1372
- value: BgWidget.switchButton(gvc, dd.status, (bool) => {
1373
- dd.status = bool;
1374
- }),
1375
- },
1376
- ];
1377
- });
1378
- vmi.loading = false;
1379
- vmi.callback();
1380
- },
1381
- rowClick: () => {
1382
- },
1383
- filter: [],
1384
- hiddenPageSplit: true,
1385
- }),
1386
- ].join('');
1368
+ bind: ids.container,
1369
+ view: () => {
1370
+ if (vm.loading) {
1371
+ return BgWidget.spinner();
1372
+ } else {
1373
+ return [
1374
+ BgWidget.tab(
1375
+ notifyType,
1376
+ gvc,
1377
+ vm.select,
1378
+ text => {
1379
+ vm.select = text as any;
1380
+ vm.selectId = notifyType.findIndex(item => item.key === vm.select);
1381
+ gvc.notifyDataChange(ids.container);
1382
+ },
1383
+ 'margin: 0 !important; position: sticky; top: 0; background-color: #fff; z-index: 2;'
1384
+ ),
1385
+ BgWidget.tableV3({
1386
+ gvc,
1387
+ getData: vmi => {
1388
+ vmi.pageSize = 1;
1389
+ vmi.originalData = vm.dataList;
1390
+ vmi.tableData = vm.dataList[vm.selectId].list.map((dd: any) => {
1391
+ return [
1392
+ {
1393
+ key: '通知事件',
1394
+ value: (() => {
1395
+ switch (dd.key) {
1396
+ case 'auto-email-shipment':
1397
+ return '商品出貨';
1398
+ case 'auto-email-in-stock':
1399
+ return '商品備貨';
1400
+ case 'auto-email-shipment-arrival':
1401
+ return '商品到貨';
1402
+ case 'auto-email-order-create':
1403
+ return '訂單成立';
1404
+ case 'auto-email-payment-successful':
1405
+ return '訂單付款成功';
1406
+ case 'proof-purchase':
1407
+ return '訂單待核款';
1408
+ case 'user-register':
1409
+ return '顧客新註冊通知';
1410
+ case 'get-customer-message':
1411
+ return '客服訊息';
1412
+ case 'form-receive':
1413
+ return '表單收集信件';
1414
+ default:
1415
+ return '其他通知';
1387
1416
  }
1417
+ })(),
1388
1418
  },
1389
- divCreate: {},
1390
- onCreate: () => {
1391
- if (ids.container && vm.loading) {
1392
- ApiUser.getPublicConfig('notify_setting', 'manager').then((data: any) => {
1393
- vm.dataList = (() => {
1394
- if (data.response.value) {
1395
- try {
1396
- const response = data.response.value.data;
1397
- return defaultData.map((d) => {
1398
- const findData = response.find((r: { type: string }) => {
1399
- return r.type === d.type;
1400
- });
1401
- if (!findData) {
1402
- return d;
1403
- }
1404
- d.list = d.list.map((item) => {
1405
- const findItem = findData.list.find((r: {
1406
- key: string
1407
- }) => {
1408
- return r.key === item.key;
1409
- });
1410
- return findItem ?? item;
1411
- });
1412
- return d;
1413
- });
1414
- } catch (e) {
1415
- return defaultData;
1416
- }
1417
- }
1418
- return defaultData;
1419
- })();
1420
-
1421
- vm.loading = false;
1422
- gvc.notifyDataChange(ids.container);
1423
- });
1424
- }
1419
+ {
1420
+ key: '狀態',
1421
+ value: BgWidget.switchButton(gvc, dd.status, bool => {
1422
+ dd.status = bool;
1423
+ }),
1425
1424
  },
1426
- };
1427
- })()
1428
- );
1429
- },
1430
- footer_html: (gvc) => {
1431
- return [
1432
- BgWidget.cancel(
1433
- gvc.event(() => {
1434
- gvc.closeDialog();
1435
- })
1436
- ),
1437
- BgWidget.save(
1438
- gvc.event(() => {
1439
- dialog.dataLoading({visible: true});
1440
- ApiUser.setPublicConfig({
1441
- key: 'notify_setting',
1442
- value: {data: vm.dataList},
1443
- user_id: 'manager',
1444
- }).then((data) => {
1445
- dialog.dataLoading({visible: false});
1446
- if (data.result && data.response.result) {
1447
- dialog.successMessage({text: '設定成功'});
1448
- } else {
1449
- dialog.successMessage({text: '設定失敗'});
1450
- }
1425
+ ];
1426
+ });
1427
+ vmi.loading = false;
1428
+ vmi.callback();
1429
+ },
1430
+ rowClick: () => {},
1431
+ filter: [],
1432
+ hiddenPageSplit: true,
1433
+ }),
1434
+ ].join('');
1435
+ }
1436
+ },
1437
+ divCreate: {},
1438
+ onCreate: () => {
1439
+ if (ids.container && vm.loading) {
1440
+ ApiUser.getPublicConfig('notify_setting', 'manager').then((data: any) => {
1441
+ vm.dataList = (() => {
1442
+ if (data.response.value) {
1443
+ try {
1444
+ const response = data.response.value.data;
1445
+ return defaultData.map(d => {
1446
+ const findData = response.find((r: { type: string }) => {
1447
+ return r.type === d.type;
1451
1448
  });
1452
- })
1453
- ),
1454
- ].join('');
1455
- },
1456
- });
1457
- }
1449
+ if (!findData) {
1450
+ return d;
1451
+ }
1452
+ d.list = d.list.map(item => {
1453
+ const findItem = findData.list.find((r: { key: string }) => {
1454
+ return r.key === item.key;
1455
+ });
1456
+ return findItem ?? item;
1457
+ });
1458
+ return d;
1459
+ });
1460
+ } catch (e) {
1461
+ return defaultData;
1462
+ }
1463
+ }
1464
+ return defaultData;
1465
+ })();
1466
+
1467
+ vm.loading = false;
1468
+ gvc.notifyDataChange(ids.container);
1469
+ });
1470
+ }
1471
+ },
1472
+ };
1473
+ })()
1474
+ );
1475
+ },
1476
+ footer_html: gvc => {
1477
+ return [
1478
+ BgWidget.cancel(
1479
+ gvc.event(() => {
1480
+ gvc.closeDialog();
1481
+ })
1482
+ ),
1483
+ BgWidget.save(
1484
+ gvc.event(() => {
1485
+ dialog.dataLoading({ visible: true });
1486
+ ApiUser.setPublicConfig({
1487
+ key: 'notify_setting',
1488
+ value: { data: vm.dataList },
1489
+ user_id: 'manager',
1490
+ }).then(data => {
1491
+ dialog.dataLoading({ visible: false });
1492
+ if (data.result && data.response.result) {
1493
+ dialog.successMessage({ text: '設定成功' });
1494
+ } else {
1495
+ dialog.successMessage({ text: '設定失敗' });
1496
+ }
1497
+ });
1498
+ })
1499
+ ),
1500
+ ].join('');
1501
+ },
1502
+ });
1503
+ }
1458
1504
  }
1459
1505
 
1460
1506
  const interval = setInterval(() => {
1461
- if ((window as any).glitter) {
1462
- clearInterval(interval);
1463
- (window as any).glitter.setModule(import.meta.url, SaasViewModel);
1464
- }
1507
+ if ((window as any).glitter) {
1508
+ clearInterval(interval);
1509
+ (window as any).glitter.setModule(import.meta.url, SaasViewModel);
1510
+ }
1465
1511
  }, 100);