ts-glitter 22.4.7 → 22.4.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.
- package/lib/glitterBundle/Glitter.css +74 -62
- package/lowcode/Entry.js +1 -1
- package/lowcode/Entry.ts +1 -1
- package/lowcode/backend-manager/bg-product.js +49 -32
- package/lowcode/backend-manager/bg-product.ts +57 -39
- package/lowcode/backend-manager/bg-widget.js +17 -0
- package/lowcode/backend-manager/bg-widget.ts +18 -0
- package/lowcode/cms-plugin/information/information-module.js +5 -5
- package/lowcode/cms-plugin/information/information-module.ts +9 -5
- package/lowcode/cms-plugin/menus-setting.js +69 -55
- package/lowcode/cms-plugin/menus-setting.ts +77 -61
- package/lowcode/cms-plugin/module/form-module.js +109 -89
- package/lowcode/cms-plugin/module/form-module.ts +680 -650
- package/lowcode/cms-plugin/module/product-excel.js +1 -0
- package/lowcode/cms-plugin/module/product-excel.ts +2 -0
- package/lowcode/cms-plugin/pos-pages/payment-page.js +28 -10
- package/lowcode/cms-plugin/pos-pages/payment-page.ts +29 -10
- package/lowcode/cms-plugin/shopping-allowance-manager.js +0 -1
- package/lowcode/cms-plugin/shopping-allowance-manager.ts +0 -1
- package/lowcode/cms-plugin/shopping-collections.js +367 -193
- package/lowcode/cms-plugin/shopping-collections.ts +664 -243
- package/lowcode/cms-plugin/shopping-information.js +392 -38
- package/lowcode/cms-plugin/shopping-information.ts +479 -87
- package/lowcode/cms-plugin/shopping-product-setting.js +2 -2
- package/lowcode/cms-plugin/shopping-product-setting.ts +2 -2
- package/lowcode/cms-plugin/shopping-setting-advance.js +906 -766
- package/lowcode/cms-plugin/shopping-setting-advance.ts +977 -841
- package/lowcode/cms-plugin/shopping-setting-basic.js +1547 -1285
- package/lowcode/cms-plugin/shopping-setting-basic.ts +1742 -1466
- package/lowcode/cms-plugin/stock-stores.js +1 -0
- package/lowcode/cms-plugin/stock-stores.ts +1 -0
- package/lowcode/cms-plugin/user-list.js +47 -12
- package/lowcode/cms-plugin/user-list.ts +52 -14
- package/lowcode/css/editor.css +6 -0
- package/lowcode/glitterBundle/Glitter.css +74 -62
- package/lowcode/jslib/nestable/index.html +317 -0
- package/lowcode/jslib/nestable/jquery.nestable.js +484 -0
- package/lowcode/official_view_component/form-widget/input-custom.js +98 -6
- package/lowcode/official_view_component/form-widget/input-custom.ts +121 -16
- package/lowcode/public-components/headers/header-class.js +63 -0
- package/lowcode/public-components/headers/header-class.ts +65 -0
- package/lowcode/public-components/headers/sy-02.js +386 -400
- package/lowcode/public-components/headers/sy-02.ts +482 -492
- package/lowcode/public-components/headers/sy-03.js +42 -43
- package/lowcode/public-components/headers/sy-03.ts +46 -43
- package/lowcode/public-components/headers/sy-04.js +43 -41
- package/lowcode/public-components/headers/sy-04.ts +48 -41
- package/lowcode/public-components/headers/sy-05.js +30 -27
- package/lowcode/public-components/headers/sy-05.ts +33 -27
- package/lowcode/public-components/product/product-list.js +160 -148
- package/lowcode/public-components/product/product-list.ts +186 -165
- package/lowcode/public-models/product.ts +26 -1
- package/lowcode/src/glitterBundle/Glitter.css +74 -62
- package/package.json +1 -1
- package/rxmnt81tnk.json +1 -0
- package/src/api-public/controllers/shop.js +10 -4
- package/src/api-public/controllers/shop.js.map +1 -1
- package/src/api-public/controllers/shop.ts +14 -9
- package/src/api-public/services/ezpay/tool.d.ts +1 -0
- package/src/api-public/services/mail.js +1 -1
- package/src/api-public/services/mail.js.map +1 -1
- package/src/api-public/services/mail.ts +1 -1
- package/src/api-public/services/schedule.d.ts +0 -1
- package/src/api-public/services/schedule.js +12 -35
- package/src/api-public/services/schedule.js.map +1 -1
- package/src/api-public/services/schedule.ts +15 -39
- package/src/api-public/services/shopee.js +7 -17
- package/src/api-public/services/shopping.d.ts +27 -6
- package/src/api-public/services/shopping.js +364 -85
- package/src/api-public/services/shopping.js.map +1 -1
- package/src/api-public/services/shopping.ts +510 -101
- package/src/api-public/services/updated-table-checked.js +58 -1
- package/src/api-public/services/updated-table-checked.js.map +1 -1
- package/src/api-public/services/updated-table-checked.ts +62 -1
- package/src/api-public/services/user-update.js +14 -0
- package/src/api-public/services/user-update.js.map +1 -1
- package/src/api-public/services/user-update.ts +15 -0
- package/src/api-public/services/user.js +1 -1
- package/src/api-public/services/user.js.map +1 -1
- package/src/api-public/services/user.ts +1 -1
- package/src/app-project/serverless/src/modules/database.d.ts +1 -1
- package/src/app-project/serverless/src/modules/redis.d.ts +1 -1
- package/src/helper/glitter-util.d.ts +1 -0
- package/src/index.js +7 -5
- package/src/index.js.map +1 -1
- package/src/index.ts +45 -38
- package/src/modules/firebase.js +1 -0
- package/src/modules/firebase.js.map +1 -1
- package/src/modules/firebase.ts +1 -0
- package/src/seo-config.d.ts +1 -1
- package/src/seo-config.js +1 -2
- package/src/seo-config.js.map +1 -1
- package/src/seo-config.ts +1 -2
- package/src/services/saas-table-check.js.map +1 -1
- package/src/services/ses.js +4 -3
- package/src/services/ses.js.map +1 -1
- package/src/services/system-schedule.js.map +1 -1
- package/src/services/system-schedule.ts +1 -0
|
@@ -8,6 +8,13 @@ import { GlobalUser } from '../glitter-base/global/global-user.js';
|
|
|
8
8
|
import { InformationModule, ViewModel } from './information/information-module.js';
|
|
9
9
|
|
|
10
10
|
const html = String.raw;
|
|
11
|
+
const css = String.raw;
|
|
12
|
+
|
|
13
|
+
interface ReverseRule {
|
|
14
|
+
rule: string;
|
|
15
|
+
range: string;
|
|
16
|
+
enabled: boolean;
|
|
17
|
+
}
|
|
11
18
|
|
|
12
19
|
export class ShoppingInformation {
|
|
13
20
|
static saveArray: (() => Promise<boolean>)[] = [];
|
|
@@ -20,6 +27,9 @@ export class ShoppingInformation {
|
|
|
20
27
|
id: glitter.getUUID(),
|
|
21
28
|
tableId: glitter.getUUID(),
|
|
22
29
|
filterId: glitter.getUUID(),
|
|
30
|
+
webTypeId: glitter.getUUID(),
|
|
31
|
+
reverseId: glitter.getUUID(),
|
|
32
|
+
reverseEditId: glitter.getUUID(),
|
|
23
33
|
type: 'basic',
|
|
24
34
|
data: {
|
|
25
35
|
ubn: '',
|
|
@@ -125,6 +135,15 @@ export class ShoppingInformation {
|
|
|
125
135
|
bind: vm.id,
|
|
126
136
|
dataList: [{ obj: vm, key: 'type' }],
|
|
127
137
|
view: () => {
|
|
138
|
+
gvc.glitter.addMtScript(
|
|
139
|
+
[
|
|
140
|
+
{
|
|
141
|
+
src: `https://raw.githack.com/SortableJS/Sortable/master/Sortable.js`,
|
|
142
|
+
},
|
|
143
|
+
],
|
|
144
|
+
() => {},
|
|
145
|
+
() => {}
|
|
146
|
+
);
|
|
128
147
|
if (vm.mainLoading) {
|
|
129
148
|
ApiUser.getPublicConfig('store-information', 'manager').then((response: any) => {
|
|
130
149
|
const data = response.response.value;
|
|
@@ -155,7 +174,9 @@ export class ShoppingInformation {
|
|
|
155
174
|
|
|
156
175
|
function createSection(title: string, description?: string) {
|
|
157
176
|
return html`
|
|
158
|
-
<div class="d-flex" style="font-weight: 700;color: #393939; font-size: 16px;line-height: 1.4;gap: 6px;"
|
|
177
|
+
<div class="d-flex" style="font-weight: 700;color: #393939; font-size: 16px;line-height: 1.4;gap: 6px;">
|
|
178
|
+
${title}
|
|
179
|
+
</div>
|
|
159
180
|
${description
|
|
160
181
|
? html` <div style="color: #8D8D8D; font-size: 14px; padding-right: 10px;">${description}</div>`
|
|
161
182
|
: ''}
|
|
@@ -163,16 +184,17 @@ export class ShoppingInformation {
|
|
|
163
184
|
}
|
|
164
185
|
|
|
165
186
|
function createToggle(title: string, description: string, key: keyof typeof vm.data) {
|
|
166
|
-
const toggleHtml =
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
187
|
+
const toggleHtml = html` <div class="cursor_pointer form-check form-switch m-0 p-0" style="min-width: 50px;">
|
|
188
|
+
<input
|
|
189
|
+
class="form-check-input m-0"
|
|
190
|
+
type="checkbox"
|
|
191
|
+
onchange="${gvc.event(() => (vm.data[key] = !vm.data[key]))}"
|
|
192
|
+
${vm.data[key] ? 'checked' : ''}
|
|
193
|
+
/>
|
|
194
|
+
</div>`;
|
|
174
195
|
return createRow(
|
|
175
|
-
html
|
|
196
|
+
html` <div>${title}</div>
|
|
197
|
+
${toggleHtml}`,
|
|
176
198
|
description,
|
|
177
199
|
''
|
|
178
200
|
);
|
|
@@ -243,6 +265,367 @@ export class ShoppingInformation {
|
|
|
243
265
|
);
|
|
244
266
|
}
|
|
245
267
|
|
|
268
|
+
function drawReserveSection() {
|
|
269
|
+
return gvc.bindView({
|
|
270
|
+
bind: vm.reverseId,
|
|
271
|
+
view: () => {
|
|
272
|
+
function drawQuest() {
|
|
273
|
+
return BgWidget.questionButton(
|
|
274
|
+
gvc.event(() => {
|
|
275
|
+
BgWidget.quesDialog({
|
|
276
|
+
gvc: gvc,
|
|
277
|
+
style: '',
|
|
278
|
+
innerHTML(gvc: GVC): string {
|
|
279
|
+
const hint =
|
|
280
|
+
'若是商店的每日營業時間為 上午09:00~上午12:00 且星期一固定公休' +
|
|
281
|
+
'作法:新增規則「幾點到幾點」指定時間、再設置「特定星期」指定星期一' +
|
|
282
|
+
'切記公休的規則要再下方,才能覆蓋掉上面的規則';
|
|
283
|
+
return html`
|
|
284
|
+
<div class="d-flex flex-column text-white">
|
|
285
|
+
<div>若是商店的每日營業時間為 上午09:00~上午12:00 且星期一固定公休,</div>
|
|
286
|
+
<div>作法:新增規則「幾點到幾點」指定時間、再設置「特定星期」指定星期一</div>
|
|
287
|
+
<div>切記公休的規則要再下方,才能覆蓋掉上面的規則</div>
|
|
288
|
+
<img src="${img}" alt="hintImg" style="margin-top:8px;" />
|
|
289
|
+
</div>
|
|
290
|
+
`;
|
|
291
|
+
},
|
|
292
|
+
});
|
|
293
|
+
})
|
|
294
|
+
);
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
function drawEdition() {
|
|
298
|
+
return gvc.bindView({
|
|
299
|
+
bind: vm.reverseEditId,
|
|
300
|
+
view: () => {
|
|
301
|
+
gvc.addStyle(css`
|
|
302
|
+
.range-input {
|
|
303
|
+
padding: 0 18px;
|
|
304
|
+
border-radius: 10px;
|
|
305
|
+
border: 1px solid #ddd;
|
|
306
|
+
background: #fff;
|
|
307
|
+
height: 40px;
|
|
308
|
+
gap: 10px;
|
|
309
|
+
}
|
|
310
|
+
|
|
311
|
+
.range-input-raw {
|
|
312
|
+
display: flex;
|
|
313
|
+
gap: 18px;
|
|
314
|
+
}
|
|
315
|
+
`);
|
|
316
|
+
try {
|
|
317
|
+
interface RangeViewType {
|
|
318
|
+
[key: string]: (ruleIndex: number) => string;
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
const toggleHtml = (ruleIndex: number) => {
|
|
322
|
+
let toggle = ruleData[ruleIndex].enabled
|
|
323
|
+
return html`
|
|
324
|
+
${toggle?"開啟":"關閉"}
|
|
325
|
+
<div
|
|
326
|
+
class="cursor_pointer form-check form-switch m-0 p-0"
|
|
327
|
+
style="min-width: 50px;"
|
|
328
|
+
>
|
|
329
|
+
<input
|
|
330
|
+
class="form-check-input m-0"
|
|
331
|
+
type="checkbox"
|
|
332
|
+
onchange="${gvc.event(e => {
|
|
333
|
+
ruleData[ruleIndex].enabled = !toggle;
|
|
334
|
+
gvc.notifyDataChange(vm.reverseEditId);
|
|
335
|
+
})}"
|
|
336
|
+
${toggle ? 'checked' : ''}
|
|
337
|
+
/>
|
|
338
|
+
</div>`;
|
|
339
|
+
};
|
|
340
|
+
const rangeView: RangeViewType = {
|
|
341
|
+
date: (ruleIndex: number) => {
|
|
342
|
+
const dateInput = (dateString: string, index: number) => {
|
|
343
|
+
const date = dateString.split(',');
|
|
344
|
+
return html`
|
|
345
|
+
<div class="d-flex range-input flex-fill">
|
|
346
|
+
<input
|
|
347
|
+
class="border-0 w-100"
|
|
348
|
+
value="${date[index]}"
|
|
349
|
+
type="time"
|
|
350
|
+
onchange="${gvc.event(e => {
|
|
351
|
+
function isValidTimeRange(timeRange:string) {
|
|
352
|
+
const [start, end] = timeRange.split(',');
|
|
353
|
+
|
|
354
|
+
// 轉換時間為日期對象,並設置同一天的日期(例如,2023-01-01)
|
|
355
|
+
const startTime = new Date(`2023-01-01T${start}:00`);
|
|
356
|
+
const endTime = new Date(`2023-01-01T${end}:00`);
|
|
357
|
+
|
|
358
|
+
// 比較時間
|
|
359
|
+
return endTime > startTime;
|
|
360
|
+
}
|
|
361
|
+
date[index] = e.value;
|
|
362
|
+
ruleData[ruleIndex].range = isValidTimeRange(`${date[0]},${date[1]}`)?`${date[0]},${date[1]}`:`${date[1]},${date[0]}`;
|
|
363
|
+
gvc.notifyDataChange(vm.reverseEditId)
|
|
364
|
+
})}"
|
|
365
|
+
/>
|
|
366
|
+
</div>
|
|
367
|
+
`;
|
|
368
|
+
};
|
|
369
|
+
|
|
370
|
+
return html`
|
|
371
|
+
<div class="h-100 d-flex range-input-raw">
|
|
372
|
+
${dateInput(ruleData[ruleIndex].range, 0)} ${dateInput(ruleData[ruleIndex].range, 1)}
|
|
373
|
+
</div>
|
|
374
|
+
`;
|
|
375
|
+
},
|
|
376
|
+
week: (ruleIndex: number) => {
|
|
377
|
+
|
|
378
|
+
|
|
379
|
+
return BgWidget.select({
|
|
380
|
+
callback(value: any): void {
|
|
381
|
+
ruleData[ruleIndex].range = value
|
|
382
|
+
console.log(vm.data);
|
|
383
|
+
},
|
|
384
|
+
default: ruleData[ruleIndex].range,
|
|
385
|
+
gvc: gvc,
|
|
386
|
+
options: [
|
|
387
|
+
{ key: "1", value: "禮拜一" },
|
|
388
|
+
{ key: "2", value: "禮拜二" },
|
|
389
|
+
{ key: "3", value: "禮拜三" },
|
|
390
|
+
{ key: "4", value: "禮拜四" },
|
|
391
|
+
{ key: "5", value: "禮拜五" },
|
|
392
|
+
{ key: "6", value: "禮拜六" },
|
|
393
|
+
{ key: "7", value: "禮拜日" }
|
|
394
|
+
]
|
|
395
|
+
|
|
396
|
+
})
|
|
397
|
+
},
|
|
398
|
+
month: (ruleIndex: number) => {
|
|
399
|
+
const monthInput = (monthString: string, index: number) => {
|
|
400
|
+
const month = monthString.split(',');
|
|
401
|
+
return html`
|
|
402
|
+
<div class="d-flex range-input flex-fill">
|
|
403
|
+
<input
|
|
404
|
+
class="border-0 w-100"
|
|
405
|
+
value="${month[index]}"
|
|
406
|
+
type="number"
|
|
407
|
+
onchange="${gvc.event(e => {
|
|
408
|
+
const numberValue = Number(e.value);
|
|
409
|
+
if (numberValue > 12 || numberValue < 1) {
|
|
410
|
+
dialog.infoMessage({
|
|
411
|
+
text: '請輸入正確的月份數字',
|
|
412
|
+
callback: () => {
|
|
413
|
+
e.value = month[index];
|
|
414
|
+
},
|
|
415
|
+
});
|
|
416
|
+
} else {
|
|
417
|
+
month[index] = e.value;
|
|
418
|
+
ruleData[ruleIndex].range = `${month[0]},${month[1]}`;
|
|
419
|
+
}
|
|
420
|
+
})}"
|
|
421
|
+
/>
|
|
422
|
+
<div class="tx_gray_16 d-flex align-items-center">月</div>
|
|
423
|
+
</div>
|
|
424
|
+
`;
|
|
425
|
+
};
|
|
426
|
+
|
|
427
|
+
return html`
|
|
428
|
+
<div class="h-100 d-flex range-input-raw">
|
|
429
|
+
${monthInput(ruleData[ruleIndex].range, 0)} ${monthInput(ruleData[ruleIndex].range, 1)}
|
|
430
|
+
</div>
|
|
431
|
+
`;
|
|
432
|
+
},
|
|
433
|
+
};
|
|
434
|
+
return ruleData
|
|
435
|
+
.map((rule, index: number) => {
|
|
436
|
+
return html` <li
|
|
437
|
+
class="w-100 mb-2 d-flex align-items-center "
|
|
438
|
+
style="overflow: hidden;padding-bottom: 18px;height:58px;"
|
|
439
|
+
>
|
|
440
|
+
<div class="d-flex align-items-center pe-5 flex-shrink-0" style="width:33%">
|
|
441
|
+
<i class="fa-sharp fa-solid fa-grip-dots-vertical me-3 dragItem cursor_move"></i>
|
|
442
|
+
${BgWidget.select({
|
|
443
|
+
gvc: gvc,
|
|
444
|
+
callback(value: any): void {
|
|
445
|
+
rule.rule = value;
|
|
446
|
+
const initData = {
|
|
447
|
+
month : ()=>{
|
|
448
|
+
return "1,12"
|
|
449
|
+
},
|
|
450
|
+
date:()=>{
|
|
451
|
+
return `00:00,23:59`
|
|
452
|
+
},
|
|
453
|
+
week:()=>{
|
|
454
|
+
return "1"
|
|
455
|
+
}
|
|
456
|
+
}
|
|
457
|
+
rule.range = initData[rule.rule as keyof typeof initData]();
|
|
458
|
+
gvc.notifyDataChange(vm.reverseEditId);
|
|
459
|
+
},
|
|
460
|
+
style: 'color:#393939',
|
|
461
|
+
default: rule.rule ?? 'month',
|
|
462
|
+
options: [
|
|
463
|
+
{ key: 'month', value: '月份區間' },
|
|
464
|
+
{ key: 'week', value: '特定星期' },
|
|
465
|
+
{ key: 'date', value: '日期區間' },
|
|
466
|
+
],
|
|
467
|
+
})}
|
|
468
|
+
</div>
|
|
469
|
+
<div class="h-100 pe-5" style="width:52%" >${rangeView[rule.rule ?? 'month'](index)}</div>
|
|
470
|
+
<div class="d-flex flex-shrink-0 position-relative" style="width:15%;gap:6px;">${toggleHtml(index)}
|
|
471
|
+
<i class="ms-auto fa-solid fa-xmark-large cursor_pointer" style="color:#B0B0B0" onclick="${gvc.event(()=>{
|
|
472
|
+
ruleData.splice(index, 1);
|
|
473
|
+
gvc.notifyDataChange(vm.reverseEditId);
|
|
474
|
+
})}"></i>
|
|
475
|
+
</div>
|
|
476
|
+
|
|
477
|
+
</li>`;
|
|
478
|
+
})
|
|
479
|
+
.join('');
|
|
480
|
+
} catch (e: any) {
|
|
481
|
+
console.log(e);
|
|
482
|
+
return e;
|
|
483
|
+
}
|
|
484
|
+
},
|
|
485
|
+
divCreate: {
|
|
486
|
+
elem: 'ul',
|
|
487
|
+
option: [{ key: 'id', value: vm.reverseEditId }],
|
|
488
|
+
class: 'd-flex flex-column m-0',
|
|
489
|
+
style: 'padding-top:24px;',
|
|
490
|
+
},
|
|
491
|
+
onCreate: () => {
|
|
492
|
+
let n = 0;
|
|
493
|
+
const interval = setInterval(() => {
|
|
494
|
+
n++;
|
|
495
|
+
if ((gvc.glitter.window as any).Sortable) {
|
|
496
|
+
try {
|
|
497
|
+
function swapArr(arr: any, index1: number, index2: number) {
|
|
498
|
+
const data = arr[index1];
|
|
499
|
+
arr.splice(index1, 1);
|
|
500
|
+
arr.splice(index2, 0, data);
|
|
501
|
+
}
|
|
502
|
+
|
|
503
|
+
let startIndex = 0;
|
|
504
|
+
//@ts-ignore
|
|
505
|
+
gvc.glitter.window.Sortable.create(gvc.glitter.document.getElementById(vm.reverseEditId), {
|
|
506
|
+
group: gvc.glitter.getUUID(),
|
|
507
|
+
animation: 100,
|
|
508
|
+
handle: '.dragItem',
|
|
509
|
+
onChange: function (evt: any) {},
|
|
510
|
+
onStart: function (evt: any) {
|
|
511
|
+
startIndex = evt.oldIndex;
|
|
512
|
+
},
|
|
513
|
+
onEnd: (evt: any) => {
|
|
514
|
+
swapArr(ruleData, startIndex, evt.newIndex);
|
|
515
|
+
},
|
|
516
|
+
});
|
|
517
|
+
} catch (e) {}
|
|
518
|
+
clearInterval(interval);
|
|
519
|
+
}
|
|
520
|
+
if (n > 100) {
|
|
521
|
+
clearInterval(interval);
|
|
522
|
+
}
|
|
523
|
+
}, 100);
|
|
524
|
+
},
|
|
525
|
+
});
|
|
526
|
+
}
|
|
527
|
+
|
|
528
|
+
gvc.addStyle(css`
|
|
529
|
+
.quest-Dialog {
|
|
530
|
+
padding: 10px;
|
|
531
|
+
border-radius: 10px;
|
|
532
|
+
}
|
|
533
|
+
`);
|
|
534
|
+
let ruleData: ReverseRule[] = vm.data.ruleData??[];
|
|
535
|
+
const emptyData: ReverseRule = {
|
|
536
|
+
enabled: false,
|
|
537
|
+
range: '1,12',
|
|
538
|
+
rule: 'month',
|
|
539
|
+
};
|
|
540
|
+
const img =
|
|
541
|
+
'https://d3jnmi1tfjgtti.cloudfront.net/file/122538856/sizeoriginal_s*px$_sasas8s7sfscs5s0_messageImage_1748238444050.jpg';
|
|
542
|
+
const sectionText = {
|
|
543
|
+
first: {
|
|
544
|
+
title: '營業/預約時段管理',
|
|
545
|
+
subTitle: '管理商店的營業時段與公休日,活動預約時間將依此設定自動生成',
|
|
546
|
+
quest: drawQuest(),
|
|
547
|
+
},
|
|
548
|
+
section: {
|
|
549
|
+
rawTitle: [
|
|
550
|
+
{ key: 'rule', text: '規則', width: 'width:33%' },
|
|
551
|
+
{
|
|
552
|
+
key: 'range',
|
|
553
|
+
text: '區間',
|
|
554
|
+
width: 'flex-grow:1',
|
|
555
|
+
},
|
|
556
|
+
{ key: 'enabled', text: '預約功能', width: 'width:15%' },
|
|
557
|
+
],
|
|
558
|
+
data: ruleData,
|
|
559
|
+
},
|
|
560
|
+
third: {
|
|
561
|
+
text: '※ 下方的規則優先覆蓋上方的規則',
|
|
562
|
+
btn: BgWidget.save(
|
|
563
|
+
gvc.event(() => {
|
|
564
|
+
|
|
565
|
+
ruleData.push(structuredClone(emptyData));
|
|
566
|
+
vm.data.ruleData = ruleData;
|
|
567
|
+
gvc.notifyDataChange(vm.reverseEditId);
|
|
568
|
+
}),
|
|
569
|
+
'新增規則'
|
|
570
|
+
),
|
|
571
|
+
},
|
|
572
|
+
};
|
|
573
|
+
return BgWidget.mainCard(html`
|
|
574
|
+
<div class="d-flex flex-column" style="gap: 24px;">
|
|
575
|
+
<!-- reverse first section-->
|
|
576
|
+
<div class="d-flex flex-column">
|
|
577
|
+
<div class="tx_700">${sectionText.first.title} ${sectionText.first.quest}</div>
|
|
578
|
+
<div class="tx_gray_14">${sectionText.first.subTitle}</div>
|
|
579
|
+
</div>
|
|
580
|
+
<!-- reverse second section-->
|
|
581
|
+
<div class="d-flex flex-column">
|
|
582
|
+
<div class="d-flex">
|
|
583
|
+
${sectionText.section.rawTitle
|
|
584
|
+
.map(rawTitle => {
|
|
585
|
+
return html` <div class="d-flex tx_700" style="${rawTitle.width}">${rawTitle.text}</div> `;
|
|
586
|
+
})
|
|
587
|
+
.join('')}
|
|
588
|
+
</div>
|
|
589
|
+
<div class="d-flex flex-column" style="gap:33px;">${drawEdition()}</div>
|
|
590
|
+
</div>
|
|
591
|
+
<!-- reverse third section-->
|
|
592
|
+
<div class="d-flex" style="padding: 12px 20px;background: #F7F7F7;">
|
|
593
|
+
<div class="tx_700 d-flex align-items-center">${sectionText.third.text}</div>
|
|
594
|
+
<div class="ms-auto">${sectionText.third.btn}</div>
|
|
595
|
+
</div>
|
|
596
|
+
</div>
|
|
597
|
+
`);
|
|
598
|
+
},
|
|
599
|
+
divCreate: {},
|
|
600
|
+
});
|
|
601
|
+
}
|
|
602
|
+
|
|
603
|
+
function drawWebTypeSection() {
|
|
604
|
+
return gvc.bindView({
|
|
605
|
+
bind: vm.webTypeId,
|
|
606
|
+
view: () => {
|
|
607
|
+
const webTypeSection: Record<string, any> = {
|
|
608
|
+
reserve: drawReserveSection(),
|
|
609
|
+
};
|
|
610
|
+
|
|
611
|
+
return html`
|
|
612
|
+
<div class="d-flex flex-column">
|
|
613
|
+
${vm.data.web_type
|
|
614
|
+
.map((web_type: string) => {
|
|
615
|
+
if (webTypeSection[web_type]) {
|
|
616
|
+
return webTypeSection[web_type];
|
|
617
|
+
}
|
|
618
|
+
return ``;
|
|
619
|
+
})
|
|
620
|
+
.filter((item: string) => item !== '')
|
|
621
|
+
.join(BgWidget.mbContainer(24))}
|
|
622
|
+
${BgWidget.mbContainer(24)}
|
|
623
|
+
</div>
|
|
624
|
+
`;
|
|
625
|
+
},
|
|
626
|
+
divCreate: {},
|
|
627
|
+
});
|
|
628
|
+
}
|
|
246
629
|
|
|
247
630
|
const typeMap: Record<string, () => string> = {
|
|
248
631
|
basic: () => {
|
|
@@ -367,9 +750,11 @@ export class ShoppingInformation {
|
|
|
367
750
|
.shopnex.tw
|
|
368
751
|
</div>
|
|
369
752
|
</div>
|
|
370
|
-
${domainType==='custom'
|
|
371
|
-
|
|
372
|
-
|
|
753
|
+
${domainType === 'custom'
|
|
754
|
+
? (() => {
|
|
755
|
+
return ``;
|
|
756
|
+
})()
|
|
757
|
+
: ``}
|
|
373
758
|
<div class="d-flex justify-content-end">${BgWidget.save(gvc.event(applyDomain), '申請')}</div>
|
|
374
759
|
</div>
|
|
375
760
|
`,
|
|
@@ -578,84 +963,91 @@ export class ShoppingInformation {
|
|
|
578
963
|
],
|
|
579
964
|
callback: (array: any) => {
|
|
580
965
|
vm.data.web_type = array;
|
|
966
|
+
gvc.notifyDataChange('web_type');
|
|
581
967
|
},
|
|
582
968
|
type: 'multiple',
|
|
583
969
|
})}
|
|
584
|
-
`)
|
|
585
|
-
return BgWidget.mainCard(html`
|
|
586
|
-
<div class="tx_700">商店類型</div>
|
|
587
|
-
<div class="tx_gray_14">系統將根據您勾選的項目,開放相對應的功能</div>
|
|
588
|
-
${BgWidget.inlineCheckBox({
|
|
589
|
-
title: '',
|
|
590
|
-
gvc,
|
|
591
|
-
def: vm.data.web_type,
|
|
592
|
-
array: [
|
|
593
|
-
{ title: '零售購物', value: 'shop' },
|
|
594
|
-
{ title: '授課網站', value: 'teaching' },
|
|
595
|
-
{ title: '預約系統', value: 'reserve' },
|
|
596
|
-
{ title: '餐飲組合', value: 'kitchen' },
|
|
597
|
-
{ title: '秤重交易', value: 'weighing' },
|
|
598
|
-
],
|
|
599
|
-
callback: (array: any) => {
|
|
600
|
-
vm.data.web_type = array;
|
|
601
|
-
},
|
|
602
|
-
type: 'multiple',
|
|
603
|
-
})}
|
|
604
|
-
`) +
|
|
605
|
-
BgWidget.mbContainer(24)
|
|
606
|
-
+
|
|
607
|
-
BgWidget.mainCard(html`
|
|
608
|
-
<div class="d-flex flex-column " style="gap:18px;">
|
|
609
|
-
<div class="tx_700">商店功能</div>
|
|
610
|
-
${createToggle('啟用 AI 選品', '透過 AI 選品功能,用戶可以使用自然語言描述找到所需商品', 'ai_search')}
|
|
611
|
-
${GlobalUser.getPlan().id > 0
|
|
612
|
-
? createToggle(
|
|
613
|
-
'啟用聊聊功能',
|
|
614
|
-
'啟用聊聊功能,方便客戶直接於官網前台與您聯繫,並詢問商品詳細內容',
|
|
615
|
-
'chat_toggle'
|
|
616
|
-
)
|
|
617
|
-
: ''}
|
|
618
|
-
${createToggle(
|
|
619
|
-
'啟用心願單功能',
|
|
620
|
-
'方便客戶收藏並管理喜愛的商品清單,隨時查看心儀商品,提升購物體驗與轉換率',
|
|
621
|
-
'wishlist'
|
|
622
|
-
)}
|
|
623
|
-
${createToggle('啟用顧客評論功能', '顧客可以對您的商品進行評論', 'customer_comment')}
|
|
624
|
-
${createToggle(
|
|
625
|
-
'啟用 Cookie 聲明',
|
|
626
|
-
'如需使用廣告追蹤行為,必須啟用 Cookie 聲明,才可發送廣告',
|
|
627
|
-
'cookie_check'
|
|
628
|
-
)}
|
|
629
|
-
${createToggle('顯示商品剩餘庫存', '啟用此功能,顧客會在商品頁面看到此商品剩餘的庫存數', 'stock_view')}
|
|
630
|
-
${createToggle(
|
|
631
|
-
'線上商店開放預購商品',
|
|
632
|
-
'啟用此功能,顧客可以在線上商店的商品無庫存時,進行預購',
|
|
633
|
-
'pre_order_status'
|
|
634
|
-
)}
|
|
635
|
-
${createToggle(
|
|
636
|
-
'商品卡片顯示區間價格',
|
|
637
|
-
'啟用後,若商品有多個規格、不同價位,前台商品卡片將會使用價格區間來顯示,關閉則顯示該商品規格中最低價者',
|
|
638
|
-
'interval_price_card'
|
|
639
|
-
)}
|
|
640
|
-
${createToggle(
|
|
641
|
-
'單獨顯示商品特價',
|
|
642
|
-
'啟用此功能,會將含有特價的商品價格或區間,單獨使用紅字顯示,關閉則採用刪改線的方式呈現特價',
|
|
643
|
-
'independent_special_price'
|
|
644
|
-
)}
|
|
645
|
-
${createPickUpModeDialog(
|
|
646
|
-
'取貨號碼',
|
|
647
|
-
'針對特店取貨功能,開啟取貨號碼功能消費者需告知商家取貨號碼並前往特店取貨'
|
|
648
|
-
)}
|
|
649
|
-
${createCheckoutModeDialog(
|
|
650
|
-
'訂單結算模式',
|
|
651
|
-
'設定訂單結算模式,可調整顧客累積消費金額、會員等級、數據分析的統計機制'
|
|
652
|
-
)}
|
|
653
|
-
${createInvoiceModeDialog(
|
|
654
|
-
'發票開立時機',
|
|
655
|
-
'設定發票開立的時機,可在商家想要的時間點,開立並發送訂單發票'
|
|
656
|
-
)}
|
|
657
|
-
</div>
|
|
658
970
|
`);
|
|
971
|
+
return (
|
|
972
|
+
BgWidget.mainCard(html`
|
|
973
|
+
<div class="tx_700">商店類型</div>
|
|
974
|
+
<div class="tx_gray_14">系統將根據您勾選的項目,開放相對應的功能</div>
|
|
975
|
+
${BgWidget.inlineCheckBox({
|
|
976
|
+
title: '',
|
|
977
|
+
gvc,
|
|
978
|
+
def: vm.data.web_type,
|
|
979
|
+
array: [
|
|
980
|
+
{ title: '零售購物', value: 'shop' },
|
|
981
|
+
{ title: '授課網站', value: 'teaching' },
|
|
982
|
+
{ title: '預約系統', value: 'reserve' },
|
|
983
|
+
{ title: '餐飲組合', value: 'kitchen' },
|
|
984
|
+
{ title: '秤重交易', value: 'weighing' },
|
|
985
|
+
],
|
|
986
|
+
callback: (array: any) => {
|
|
987
|
+
vm.data.web_type = array;
|
|
988
|
+
},
|
|
989
|
+
type: 'multiple',
|
|
990
|
+
})}
|
|
991
|
+
`) +
|
|
992
|
+
BgWidget.mbContainer(24) +
|
|
993
|
+
drawWebTypeSection() +
|
|
994
|
+
BgWidget.mainCard(html`
|
|
995
|
+
<div class="d-flex flex-column " style="gap:18px;">
|
|
996
|
+
<div class="tx_700">商店功能</div>
|
|
997
|
+
${createToggle('啟用 AI 選品', '透過 AI 選品功能,用戶可以使用自然語言描述找到所需商品', 'ai_search')}
|
|
998
|
+
${GlobalUser.getPlan().id > 0
|
|
999
|
+
? createToggle(
|
|
1000
|
+
'啟用聊聊功能',
|
|
1001
|
+
'啟用聊聊功能,方便客戶直接於官網前台與您聯繫,並詢問商品詳細內容',
|
|
1002
|
+
'chat_toggle'
|
|
1003
|
+
)
|
|
1004
|
+
: ''}
|
|
1005
|
+
${createToggle(
|
|
1006
|
+
'啟用心願單功能',
|
|
1007
|
+
'方便客戶收藏並管理喜愛的商品清單,隨時查看心儀商品,提升購物體驗與轉換率',
|
|
1008
|
+
'wishlist'
|
|
1009
|
+
)}
|
|
1010
|
+
${createToggle('啟用顧客評論功能', '顧客可以對您的商品進行評論', 'customer_comment')}
|
|
1011
|
+
${createToggle(
|
|
1012
|
+
'啟用 Cookie 聲明',
|
|
1013
|
+
'如需使用廣告追蹤行為,必須啟用 Cookie 聲明,才可發送廣告',
|
|
1014
|
+
'cookie_check'
|
|
1015
|
+
)}
|
|
1016
|
+
${createToggle(
|
|
1017
|
+
'顯示商品剩餘庫存',
|
|
1018
|
+
'啟用此功能,顧客會在商品頁面看到此商品剩餘的庫存數',
|
|
1019
|
+
'stock_view'
|
|
1020
|
+
)}
|
|
1021
|
+
${createToggle(
|
|
1022
|
+
'線上商店開放預購商品',
|
|
1023
|
+
'啟用此功能,顧客可以在線上商店的商品無庫存時,進行預購',
|
|
1024
|
+
'pre_order_status'
|
|
1025
|
+
)}
|
|
1026
|
+
${createToggle(
|
|
1027
|
+
'商品卡片顯示區間價格',
|
|
1028
|
+
'啟用後,若商品有多個規格、不同價位,前台商品卡片將會使用價格區間來顯示,關閉則顯示該商品規格中最低價者',
|
|
1029
|
+
'interval_price_card'
|
|
1030
|
+
)}
|
|
1031
|
+
${createToggle(
|
|
1032
|
+
'單獨顯示商品特價',
|
|
1033
|
+
'啟用此功能,會將含有特價的商品價格或區間,單獨使用紅字顯示,關閉則採用刪改線的方式呈現特價',
|
|
1034
|
+
'independent_special_price'
|
|
1035
|
+
)}
|
|
1036
|
+
${createPickUpModeDialog(
|
|
1037
|
+
'取貨號碼',
|
|
1038
|
+
'針對特店取貨功能,開啟取貨號碼功能消費者需告知商家取貨號碼並前往特店取貨'
|
|
1039
|
+
)}
|
|
1040
|
+
${createCheckoutModeDialog(
|
|
1041
|
+
'訂單結算模式',
|
|
1042
|
+
'設定訂單結算模式,可調整顧客累積消費金額、會員等級、數據分析的統計機制'
|
|
1043
|
+
)}
|
|
1044
|
+
${createInvoiceModeDialog(
|
|
1045
|
+
'發票開立時機',
|
|
1046
|
+
'設定發票開立的時機,可在商家想要的時間點,開立並發送訂單發票'
|
|
1047
|
+
)}
|
|
1048
|
+
</div>
|
|
1049
|
+
`)
|
|
1050
|
+
);
|
|
659
1051
|
},
|
|
660
1052
|
global: () => {
|
|
661
1053
|
return BgWidget.mainCard(html`
|
|
@@ -645,7 +645,7 @@ export class ShoppingProductSetting {
|
|
|
645
645
|
const language_data = postMD.language_data[ShoppingProductSetting.select_language];
|
|
646
646
|
imageLibrary.selectImageFromArray(language_data.preview_image, {
|
|
647
647
|
gvc: gvc,
|
|
648
|
-
title: html ` <div class="d-flex flex-column"
|
|
648
|
+
title: html ` <div class="d-flex flex-column">圖片庫</div>`,
|
|
649
649
|
getSelect: imageUrl => {
|
|
650
650
|
variant[`preview_image_${ShoppingProductSetting.select_language}`] = imageUrl;
|
|
651
651
|
gvc.notifyDataChange(id);
|
|
@@ -1382,7 +1382,7 @@ export class ShoppingProductSetting {
|
|
|
1382
1382
|
</div>
|
|
1383
1383
|
<div class="flex-fill"></div>
|
|
1384
1384
|
<div class="d-flex align-items-center justify-content-end w-100 mt-2">
|
|
1385
|
-
<div class="me-2
|
|
1385
|
+
<div class="me-2">
|
|
1386
1386
|
${LanguageBackend.switchBtn({
|
|
1387
1387
|
gvc: gvc,
|
|
1388
1388
|
language: vm.language,
|
|
@@ -741,7 +741,7 @@ export class ShoppingProductSetting {
|
|
|
741
741
|
];
|
|
742
742
|
imageLibrary.selectImageFromArray(language_data.preview_image, {
|
|
743
743
|
gvc: gvc,
|
|
744
|
-
title: html` <div class="d-flex flex-column"
|
|
744
|
+
title: html` <div class="d-flex flex-column">圖片庫</div>`,
|
|
745
745
|
getSelect: imageUrl => {
|
|
746
746
|
variant[`preview_image_${ShoppingProductSetting.select_language}`] = imageUrl;
|
|
747
747
|
gvc.notifyDataChange(id);
|
|
@@ -1643,7 +1643,7 @@ export class ShoppingProductSetting {
|
|
|
1643
1643
|
</div>
|
|
1644
1644
|
<div class="flex-fill"></div>
|
|
1645
1645
|
<div class="d-flex align-items-center justify-content-end w-100 mt-2">
|
|
1646
|
-
<div class="me-2
|
|
1646
|
+
<div class="me-2">
|
|
1647
1647
|
${LanguageBackend.switchBtn({
|
|
1648
1648
|
gvc: gvc,
|
|
1649
1649
|
language: vm.language,
|