ts-glitter 13.6.3 → 13.6.5

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 (62) hide show
  1. package/lowcode/Entry.js +1 -1
  2. package/lowcode/Entry.ts +1 -1
  3. package/lowcode/backend-manager/bg-customer-message.js +338 -47
  4. package/lowcode/backend-manager/bg-customer-message.ts +351 -52
  5. package/lowcode/backend-manager/bg-widget.js +2 -2
  6. package/lowcode/backend-manager/bg-widget.ts +2 -2
  7. package/lowcode/cms-plugin/auto-reply.js +9 -9
  8. package/lowcode/cms-plugin/auto-reply.ts +9 -9
  9. package/lowcode/cms-plugin/customer-message-user.js +4 -3
  10. package/lowcode/cms-plugin/customer-message-user.ts +4 -3
  11. package/lowcode/cms-plugin/filter-options.js +1 -1
  12. package/lowcode/cms-plugin/filter-options.ts +1 -1
  13. package/lowcode/cms-plugin/line-auto-reply.js +1 -1
  14. package/lowcode/cms-plugin/line-auto-reply.ts +1 -1
  15. package/lowcode/cms-plugin/shopping-finance-setting.js +1 -1
  16. package/lowcode/cms-plugin/shopping-finance-setting.ts +1 -1
  17. package/lowcode/cms-plugin/sns-auto-reply.js +8 -8
  18. package/lowcode/cms-plugin/sns-auto-reply.ts +8 -8
  19. package/lowcode/glitterBundle/module/html-generate.js +2 -3
  20. package/lowcode/glitterBundle/module/html-generate.ts +2 -3
  21. package/lowcode/jspage/editor.ts +496 -496
  22. package/lowcode/jspage/function-page/main_editor.js +3 -3
  23. package/lowcode/jspage/function-page/main_editor.ts +3 -3
  24. package/lowcode/view-model/saas-view-model.js +7 -7
  25. package/lowcode/view-model/saas-view-model.ts +7 -7
  26. package/package.json +1 -1
  27. package/src/api-public/controllers/ai-chat.js.map +1 -1
  28. package/src/api-public/controllers/ai-chat.ts +2 -0
  29. package/src/api-public/services/ai-robot.d.ts +5 -0
  30. package/src/api-public/services/ai-robot.js +182 -3
  31. package/src/api-public/services/ai-robot.js.map +1 -1
  32. package/src/api-public/services/ai-robot.ts +174 -0
  33. package/src/api-public/services/auto-send-email.js +24 -24
  34. package/src/api-public/services/auto-send-email.js.map +1 -1
  35. package/src/api-public/services/auto-send-email.ts +24 -24
  36. package/src/api-public/services/chat.d.ts +2 -0
  37. package/src/api-public/services/chat.js +63 -55
  38. package/src/api-public/services/chat.js.map +1 -1
  39. package/src/api-public/services/chat.ts +115 -105
  40. package/src/api-public/services/line-message.js +68 -61
  41. package/src/api-public/services/line-message.js.map +1 -1
  42. package/src/api-public/services/line-message.ts +203 -211
  43. package/src/api-public/services/notify.d.ts +15 -6
  44. package/src/api-public/services/notify.js +360 -216
  45. package/src/api-public/services/notify.js.map +1 -1
  46. package/src/api-public/services/notify.ts +395 -222
  47. package/src/api-public/services/post.js +2 -9
  48. package/src/api-public/services/post.js.map +1 -1
  49. package/src/api-public/services/post.ts +2 -13
  50. package/src/api-public/services/public-table-check.js +14 -6
  51. package/src/api-public/services/public-table-check.js.map +1 -1
  52. package/src/api-public/services/public-table-check.ts +21 -11
  53. package/src/api-public/services/shopping.js +1 -1
  54. package/src/api-public/services/shopping.js.map +1 -1
  55. package/src/api-public/services/shopping.ts +1 -3
  56. package/src/api-public/services/sms.js +28 -24
  57. package/src/api-public/services/sms.js.map +1 -1
  58. package/src/api-public/services/sms.ts +112 -123
  59. package/src/api-public/services/user.js +5 -5
  60. package/src/api-public/services/user.js.map +1 -1
  61. package/src/api-public/services/user.ts +6 -6
  62. package/src/services/template.js.map +1 -1
package/lowcode/Entry.js CHANGED
@@ -59,7 +59,7 @@ export class Entry {
59
59
  }
60
60
  window.renderClock = (_a = window.renderClock) !== null && _a !== void 0 ? _a : clockF();
61
61
  console.log(`Entry-time:`, window.renderClock.stop());
62
- glitter.share.editerVersion = "V_13.6.3";
62
+ glitter.share.editerVersion = "V_13.6.5";
63
63
  glitter.share.start = (new Date());
64
64
  const vm = {
65
65
  appConfig: [],
package/lowcode/Entry.ts CHANGED
@@ -60,7 +60,7 @@ export class Entry {
60
60
  }
61
61
  (window as any).renderClock = (window as any).renderClock ?? clockF();
62
62
  console.log(`Entry-time:`, (window as any).renderClock.stop());
63
- glitter.share.editerVersion = "V_13.6.3";
63
+ glitter.share.editerVersion = "V_13.6.5";
64
64
  glitter.share.start = (new Date());
65
65
  const vm: {
66
66
  appConfig: any;
@@ -366,53 +366,339 @@ export class BgCustomerMessage {
366
366
  </div>
367
367
  ${BgWidget.switchButton(gvc, keyData.toggle, (bool) => {
368
368
  keyData.toggle = bool;
369
+ gvc.notifyDataChange(vO.id);
369
370
  })}
370
371
  </div>`,
371
- BgWidget.editeInput({
372
- gvc: gvc,
373
- title: '客服名稱',
374
- type: 'name',
375
- placeHolder: `請輸入客服名稱`,
376
- default: keyData.name,
377
- callback: (text) => {
378
- keyData.name = text;
379
- },
380
- }),
381
- EditorElem.uploadImage({
382
- title: '大頭照',
383
- gvc: gvc,
384
- def: keyData.head || '',
385
- callback: (text) => {
386
- keyData.head = text;
387
- },
388
- }),
389
- EditorElem.colorSelect({
390
- gvc: gvc,
391
- title: '設定主色調',
392
- def: keyData.color,
393
- callback: (text) => {
394
- keyData.color = text;
395
- gvc.notifyDataChange(vO.id);
396
- },
397
- }),
398
- BgWidget.editeInput({
399
- gvc: gvc,
400
- title: '置頂標題',
401
- placeHolder: `請輸入置頂標題`,
402
- default: keyData.title,
403
- callback: (text) => {
404
- keyData.title = text;
405
- },
406
- }),
407
- BgWidget.textArea({
408
- gvc: gvc,
409
- title: '置頂內文',
410
- placeHolder: `請輸入置頂內文`,
411
- default: keyData.content,
412
- callback: (text) => {
413
- keyData.content = text;
414
- },
415
- }),
372
+ ...(() => {
373
+ if (keyData.toggle) {
374
+ return [
375
+ gvc.bindView(() => {
376
+ keyData.ask_manual_keyword = keyData.ask_manual_keyword || '真人客服';
377
+ keyData.ask_ai_keyword = keyData.ask_ai_keyword || 'AI客服';
378
+ const cid = gvc.glitter.getUUID();
379
+ return {
380
+ bind: cid,
381
+ view: () => {
382
+ return html `
383
+ <div class="d-flex flex-column"
384
+ style="gap:5px;">
385
+ <div class="tx_normal fw-normal"
386
+ style="">AI客服機器人
387
+ </div>
388
+ <div class="d-flex">
389
+ ${BgWidget.switchButton(gvc, keyData.ai_toggle, (bool) => {
390
+ keyData.ai_toggle = bool;
391
+ gvc.notifyDataChange(cid);
392
+ })}
393
+ ${keyData.ai_toggle ? `啟用` : `關閉`}
394
+ </div>
395
+ ${keyData.ai_toggle ? html `
396
+ <div class="mt-2 d-flex align-items-center"
397
+ style="gap:10px;">
398
+ ${BgWidget.grayButton('AI 問答設定', gvc.event(() => __awaiter(this, void 0, void 0, function* () {
399
+ let keyData = (yield ApiUser.getPublicConfig(`robot_ai_reply`, 'manager')).response.value || {};
400
+ BgWidget.settingDialog({
401
+ gvc: gvc,
402
+ title: 'AI問答設定',
403
+ innerHTML: (gvc) => {
404
+ return gvc.bindView(() => {
405
+ const id = gvc.glitter.getUUID();
406
+ const html = String.raw;
407
+ return {
408
+ bind: id,
409
+ view: () => {
410
+ var _a;
411
+ if (Array.isArray(keyData)) {
412
+ keyData = {};
413
+ }
414
+ keyData.question = (_a = keyData.question) !== null && _a !== void 0 ? _a : [];
415
+ const parId = gvc.glitter.getUUID();
416
+ const id = gvc.glitter.getUUID();
417
+ function refresh() {
418
+ gvc.notifyDataChange(id);
419
+ }
420
+ return html `
421
+ ${BgWidget.alertInfo('', [
422
+ `<span class="fw-500 fs-6">*當AI判斷,客戶提出的問題與你設定的問題有關聯的話,將會直接回答你設定的回覆內容。</span>`,
423
+ `<span class="fw-500 fs-6">*建議設定多個問答項目,來提升機器人客服的妥善率。</span>`,
424
+ ], {
425
+ class: 'p-2',
426
+ style: ``
427
+ })}
428
+ <div style=""
429
+ class="p-2">
430
+
431
+ ${gvc.bindView(() => {
432
+ return {
433
+ bind: id,
434
+ view: () => {
435
+ return (keyData.question || []).map((d2, index) => {
436
+ return html `
437
+ <li onclick="${gvc.event(() => {
438
+ const copy = JSON.parse(JSON.stringify(d2));
439
+ BgWidget.settingDialog({
440
+ gvc: gvc,
441
+ title: '設定問答',
442
+ innerHTML: (gvc) => {
443
+ return [BgWidget.editeInput({
444
+ gvc: gvc,
445
+ title: '問題',
446
+ placeHolder: `請輸入問題`,
447
+ default: copy.ask,
448
+ callback: (text) => {
449
+ copy.ask = text;
450
+ },
451
+ }), BgWidget.textArea({
452
+ gvc: gvc,
453
+ title: '回答',
454
+ placeHolder: `請輸入回答`,
455
+ default: copy.response,
456
+ callback: (text) => {
457
+ copy.response = text;
458
+ },
459
+ })].map((dd) => {
460
+ return `<div>${dd}</div>`;
461
+ }).join('');
462
+ },
463
+ footer_html: (gvc) => {
464
+ return [
465
+ BgWidget.cancel(gvc.event(() => {
466
+ gvc.closeDialog();
467
+ })),
468
+ BgWidget.save(gvc.event(() => {
469
+ refresh();
470
+ gvc.closeDialog();
471
+ }))
472
+ ].join(``);
473
+ }
474
+ });
475
+ })}">
476
+ <div class="w-100 fw-500 d-flex align-items-center fs-6 hoverBtn h_item rounded px-2 hoverF2 mb-1 subComponentGuide"
477
+ style="gap:5px;color:#393939;">
478
+ <div class=" p-1 dragItem ">
479
+ <i class="fa-solid fa-grip-dots-vertical d-flex align-items-center justify-content-center "
480
+ style="width:15px;height:15px;"
481
+ aria-hidden="true"></i>
482
+ </div>
483
+ <span style="max-width:calc(100% - 60px);text-overflow: ellipsis;white-space: nowrap;overflow: hidden;">${d2.ask}</span>
484
+ <div class="flex-fill"></div>
485
+ <div class="hoverBtn p-1 child"
486
+ onclick="${gvc.event((e, event) => {
487
+ event.stopPropagation();
488
+ event.preventDefault();
489
+ dialog.checkYesOrNot({
490
+ text: '是否確認移除問答?',
491
+ callback: (response) => {
492
+ if (response) {
493
+ keyData.question.splice(index, 1);
494
+ gvc.notifyDataChange(id);
495
+ }
496
+ }
497
+ });
498
+ })}">
499
+ <i class="fa-regular fa-trash d-flex align-items-center justify-content-center "
500
+ aria-hidden="true"></i>
501
+ </div>
502
+ </div>
503
+ </li>`;
504
+ }).join('');
505
+ },
506
+ divCreate: {
507
+ class: `mx-n2`,
508
+ elem: 'ul',
509
+ option: [{
510
+ key: 'id',
511
+ value: parId
512
+ }],
513
+ },
514
+ onCreate: () => {
515
+ gvc.glitter.addMtScript([
516
+ {
517
+ src: `https://raw.githack.com/SortableJS/Sortable/master/Sortable.js`,
518
+ },
519
+ ], () => {
520
+ const interval = setInterval(() => {
521
+ if (window.Sortable) {
522
+ try {
523
+ gvc.addStyle(`
524
+ ul {
525
+ list-style: none;
526
+ padding: 0;
527
+ }
528
+ `);
529
+ function swapArr(arr, index1, index2) {
530
+ const data = arr[index1];
531
+ arr.splice(index1, 1);
532
+ arr.splice(index2, 0, data);
533
+ }
534
+ let startIndex = 0;
535
+ Sortable.create(gvc.glitter.document.getElementById(parId), {
536
+ handle: '.dragItem',
537
+ group: gvc.glitter.getUUID(),
538
+ animation: 100,
539
+ onChange: function (evt) {
540
+ swapArr(keyData.question, startIndex, evt.newIndex);
541
+ const newIndex = evt.newIndex;
542
+ startIndex = newIndex;
543
+ },
544
+ onEnd: (evt) => {
545
+ },
546
+ onStart: function (evt) {
547
+ startIndex = evt.oldIndex;
548
+ },
549
+ });
550
+ }
551
+ catch (e) {
552
+ }
553
+ clearInterval(interval);
554
+ }
555
+ }, 100);
556
+ }, () => {
557
+ });
558
+ }
559
+ };
560
+ })}
561
+ <div class="w-100"
562
+ style="justify-content: center; align-items: center; gap: 4px; display: flex;color: #3366BB;cursor: pointer;"
563
+ data-bs-toggle="dropdown"
564
+ aria-haspopup="true"
565
+ aria-expanded="false"
566
+ onclick="${gvc.event(() => {
567
+ const copy = {
568
+ ask: '',
569
+ response: ''
570
+ };
571
+ BgWidget.settingDialog({
572
+ gvc: gvc,
573
+ title: '設定問答',
574
+ innerHTML: (gvc) => {
575
+ return [BgWidget.editeInput({
576
+ gvc: gvc,
577
+ title: '問題',
578
+ placeHolder: `請輸入問題`,
579
+ default: copy.ask,
580
+ callback: (text) => {
581
+ copy.ask = text;
582
+ },
583
+ }), BgWidget.textArea({
584
+ gvc: gvc,
585
+ title: '回答',
586
+ placeHolder: `請輸入回答`,
587
+ default: copy.response,
588
+ callback: (text) => {
589
+ copy.response = text;
590
+ },
591
+ })].map((dd) => {
592
+ return `<div>${dd}</div>`;
593
+ }).join('');
594
+ },
595
+ footer_html: (gvc) => {
596
+ return [
597
+ BgWidget.cancel(gvc.event(() => {
598
+ gvc.closeDialog();
599
+ })),
600
+ BgWidget.save(gvc.event(() => {
601
+ if (!copy.ask || !copy.response) {
602
+ dialog.errorMessage({ text: '內容不得為空' });
603
+ return;
604
+ }
605
+ keyData.question.push(copy);
606
+ refresh();
607
+ gvc.closeDialog();
608
+ }))
609
+ ].join(``);
610
+ }
611
+ });
612
+ })}">
613
+ <div style="font-size: 16px; font-family: Noto Sans; font-weight: 400; word-wrap: break-word">
614
+ 新增一則問答
615
+ </div>
616
+ <i class="fa-solid fa-plus"
617
+ aria-hidden="true"></i>
618
+ </div>
619
+ </div>
620
+ `;
621
+ },
622
+ divCreate: {
623
+ class: `m-n2`,
624
+ },
625
+ };
626
+ });
627
+ },
628
+ footer_html: (gvc) => {
629
+ return [BgWidget.cancel(gvc.event(() => {
630
+ gvc.closeDialog();
631
+ }), '取消'), BgWidget.save(gvc.event(() => __awaiter(this, void 0, void 0, function* () {
632
+ dialog.dataLoading({ visible: true });
633
+ yield ApiUser.setPublicConfig({
634
+ key: `robot_ai_reply`,
635
+ value: keyData,
636
+ user_id: 'manager',
637
+ });
638
+ dialog.dataLoading({ visible: false });
639
+ dialog.successMessage({ text: '設定成功!' });
640
+ gvc.closeDialog();
641
+ })), '儲存')].join('');
642
+ }
643
+ });
644
+ })))}
645
+ </div>` : ``}
646
+ </div>
647
+ `;
648
+ }
649
+ };
650
+ }),
651
+ BgWidget.editeInput({
652
+ gvc: gvc,
653
+ title: '客服名稱',
654
+ type: 'name',
655
+ placeHolder: `請輸入客服名稱`,
656
+ default: keyData.name,
657
+ callback: (text) => {
658
+ keyData.name = text;
659
+ },
660
+ }),
661
+ EditorElem.uploadImage({
662
+ title: '大頭照',
663
+ gvc: gvc,
664
+ def: keyData.head || '',
665
+ callback: (text) => {
666
+ keyData.head = text;
667
+ },
668
+ }),
669
+ EditorElem.colorSelect({
670
+ gvc: gvc,
671
+ title: '設定主色調',
672
+ def: keyData.color,
673
+ callback: (text) => {
674
+ keyData.color = text;
675
+ gvc.notifyDataChange(vO.id);
676
+ },
677
+ }),
678
+ BgWidget.editeInput({
679
+ gvc: gvc,
680
+ title: '置頂標題',
681
+ placeHolder: `請輸入置頂標題`,
682
+ default: keyData.title,
683
+ callback: (text) => {
684
+ keyData.title = text;
685
+ },
686
+ }),
687
+ BgWidget.textArea({
688
+ gvc: gvc,
689
+ title: '置頂內文',
690
+ placeHolder: `請輸入置頂內文`,
691
+ default: keyData.content,
692
+ callback: (text) => {
693
+ keyData.content = text;
694
+ },
695
+ })
696
+ ];
697
+ }
698
+ else {
699
+ return [];
700
+ }
701
+ })()
416
702
  ].join(`<div class="my-2"></div>`)}
417
703
  </div>`,
418
704
  gvc.bindView(() => {
@@ -421,6 +707,9 @@ export class BgCustomerMessage {
421
707
  return {
422
708
  bind: id,
423
709
  view: () => {
710
+ if (!keyData.toggle) {
711
+ return ``;
712
+ }
424
713
  return new Promise((resolve, reject) => __awaiter(this, void 0, void 0, function* () {
425
714
  var _a;
426
715
  let keyData = (yield ApiUser.getPublicConfig(`robot_auto_reply`, 'manager')).response.value || {};
@@ -436,10 +725,12 @@ export class BgCustomerMessage {
436
725
  }
437
726
  resolve(html `
438
727
  <div class="position-relative bgf6 d-flex align-items-center justify-content-between mx-n2 p-2 py-3 border-top border-bottom mt-2 shadow">
439
- <span class="fs-6 fw-bold "
440
- style="color:black;">常見問題</span>
728
+ <span class="fs-6 fw-bold d-flex flex-column"
729
+ style="color:black;">常見問題
730
+ ${BgWidget.grayNote('將顯示於客服聊天首頁,讓用戶直接點選')}</span>
441
731
  </div>
442
732
  <div style="" class="p-2">
733
+
443
734
  ${gvc.bindView(() => {
444
735
  return {
445
736
  bind: id,