ts-glitter 14.1.3 → 14.1.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 (39) hide show
  1. package/lowcode/Entry.js +1 -1
  2. package/lowcode/Entry.ts +1 -1
  3. package/lowcode/cms-plugin/permission-setting.js +1 -1
  4. package/lowcode/cms-plugin/permission-setting.ts +1 -1
  5. package/lowcode/cms-plugin/shopping-product-setting.js +36 -35
  6. package/lowcode/cms-plugin/shopping-product-setting.ts +77 -76
  7. package/lowcode/glitterBundle/plugins/editor-elem.js +72 -37
  8. package/lowcode/glitterBundle/plugins/editor-elem.ts +245 -211
  9. package/lowcode/jslib/froala/languages/zh_tw.js +297 -269
  10. package/lowcode/official_view_component/official/form.js +2 -0
  11. package/lowcode/official_view_component/official/form.ts +2 -0
  12. package/lowcode/public-components/checkout/index.js +116 -36
  13. package/lowcode/public-components/checkout/index.ts +116 -36
  14. package/lowcode/public-components/product/product-detail.js +2 -2
  15. package/lowcode/public-components/product/product-detail.ts +4 -4
  16. package/lowcode/view-model/saas-view-model.js +1 -1
  17. package/lowcode/view-model/saas-view-model.ts +1 -1
  18. package/package.json +1 -1
  19. package/src/api-public/controllers/ai-chat.js.map +1 -1
  20. package/src/api-public/controllers/app-release.js.map +1 -1
  21. package/src/api-public/controllers/article.js.map +1 -1
  22. package/src/api-public/controllers/post.js.map +1 -1
  23. package/src/api-public/controllers/shop.js.map +1 -1
  24. package/src/api-public/controllers/user.js.map +1 -1
  25. package/src/api-public/services/ai-robot.d.ts +1 -0
  26. package/src/api-public/services/ai-robot.js.map +1 -1
  27. package/src/api-public/services/post.js.map +1 -1
  28. package/src/api-public/services/schedule.js.map +1 -1
  29. package/src/api-public/services/share-permission.js +2 -2
  30. package/src/api-public/services/share-permission.js.map +1 -1
  31. package/src/api-public/services/share-permission.ts +2 -2
  32. package/src/api-public/services/shopping.js.map +5 -1
  33. package/src/helper/glitter-util.d.ts +1 -0
  34. package/src/helper/glitter-util.js +1 -1
  35. package/src/helper/glitter-util.js.map +5 -1
  36. package/src/helper/glitter-util.ts +1 -1
  37. package/src/index.js +3 -3
  38. package/src/index.js.map +5 -1
  39. package/src/services/template.js.map +1 -1
package/lowcode/Entry.js CHANGED
@@ -70,7 +70,7 @@ export class Entry {
70
70
  }
71
71
  window.renderClock = (_a = window.renderClock) !== null && _a !== void 0 ? _a : clockF();
72
72
  console.log(`Entry-time:`, window.renderClock.stop());
73
- glitter.share.editerVersion = 'V_14.1.3';
73
+ glitter.share.editerVersion = 'V_14.1.5';
74
74
  glitter.share.start = new Date();
75
75
  const vm = {
76
76
  appConfig: [],
package/lowcode/Entry.ts CHANGED
@@ -72,7 +72,7 @@ export class Entry {
72
72
  }
73
73
  (window as any).renderClock = (window as any).renderClock ?? clockF();
74
74
  console.log(`Entry-time:`, (window as any).renderClock.stop());
75
- glitter.share.editerVersion = 'V_14.1.3';
75
+ glitter.share.editerVersion = 'V_14.1.5';
76
76
  glitter.share.start = new Date();
77
77
  const vm: {
78
78
  appConfig: any;
@@ -494,7 +494,7 @@ export class PermissionSetting {
494
494
  phone: vm.data.config.phone,
495
495
  auth: vm.data.config.auth,
496
496
  },
497
- status: vm.data.status,
497
+ status: obj.type === 'add' ? 1 : vm.data.status,
498
498
  }).then((res) => {
499
499
  dialog.dataLoading({ visible: false });
500
500
  if (res.result) {
@@ -617,7 +617,7 @@ export class PermissionSetting {
617
617
  phone: vm.data.config.phone,
618
618
  auth: vm.data.config.auth,
619
619
  },
620
- status: vm.data.status,
620
+ status: obj.type === 'add' ? 1:vm.data.status,
621
621
  }).then((res) => {
622
622
  dialog.dataLoading({ visible: false });
623
623
  if (res.result) {
@@ -2046,8 +2046,8 @@ export class ShoppingProductSetting {
2046
2046
  return [
2047
2047
  BgWidget.container(html `
2048
2048
  <div class="title-container flex-column" style="gap:10px;">
2049
- <div class="d-flex align-items-center w-100">
2050
- ${BgWidget.goBack(obj.gvc.event(() => {
2049
+ <div class="d-flex align-items-center w-100">
2050
+ ${BgWidget.goBack(obj.gvc.event(() => {
2051
2051
  if (window.parent.glitter.share.checkData && !window.parent.glitter.share.checkData()) {
2052
2052
  const dialog = new ShareDialog(gvc.glitter);
2053
2053
  dialog.checkYesOrNot({
@@ -2066,37 +2066,39 @@ export class ShoppingProductSetting {
2066
2066
  obj.vm.type = 'list';
2067
2067
  }
2068
2068
  }))}
2069
- <h3 class="mb-0 me-3 tx_title">${obj.type === 'replace' ? postMD.title || '編輯商品' : `新增商品`}</h3>
2070
- <div class="flex-fill"></div>
2071
- </div>
2072
- <div class="d-flex w-100">
2073
- <div class="flex-fill"></div>
2074
- ${[
2075
- BgWidget.grayButton('複製現有商品', gvc.event(() => {
2076
- BgProduct.productsDialog({
2077
- gvc: gvc,
2078
- default: [],
2079
- single: true,
2080
- callback: (value) => {
2081
- const dialog = new ShareDialog(gvc.glitter);
2082
- dialog.dataLoading({ visible: true });
2083
- ApiShop.getProduct({
2084
- page: 0,
2085
- limit: 1,
2086
- id: value[0],
2087
- }).then((data) => {
2088
- dialog.dataLoading({ visible: false });
2089
- if (data.result && data.response.data && data.response.data.content) {
2090
- postMD = data.response.data.content;
2091
- postMD.id = undefined;
2092
- setProductType();
2093
- gvc.notifyDataChange(vm.id);
2094
- }
2095
- });
2096
- },
2097
- show_product_type: true
2098
- });
2099
- }), {}),
2069
+ <h3 class="mb-0 me-3 tx_title">${obj.type === 'replace' ? postMD.title || '編輯商品' : `新增商品`}</h3>
2070
+ <div class="flex-fill"></div>
2071
+ </div>
2072
+ <div class="d-flex w-100">
2073
+ <div class="flex-fill"></div>
2074
+ ${[
2075
+ obj.type === 'replace'
2076
+ ? ''
2077
+ : BgWidget.grayButton('複製現有商品', gvc.event(() => {
2078
+ BgProduct.productsDialog({
2079
+ gvc: gvc,
2080
+ default: [],
2081
+ single: true,
2082
+ callback: (value) => {
2083
+ const dialog = new ShareDialog(gvc.glitter);
2084
+ dialog.dataLoading({ visible: true });
2085
+ ApiShop.getProduct({
2086
+ page: 0,
2087
+ limit: 1,
2088
+ id: value[0],
2089
+ }).then((data) => {
2090
+ dialog.dataLoading({ visible: false });
2091
+ if (data.result && data.response.data && data.response.data.content) {
2092
+ postMD = data.response.data.content;
2093
+ postMD.id = undefined;
2094
+ setProductType();
2095
+ gvc.notifyDataChange(vm.id);
2096
+ }
2097
+ });
2098
+ },
2099
+ show_product_type: true,
2100
+ });
2101
+ }), {}),
2100
2102
  BgWidget.grayButton('AI 生成', gvc.event(() => {
2101
2103
  ProductAi.setProduct(gvc, postMD, () => {
2102
2104
  gvc.notifyDataChange(vm.id);
@@ -2107,7 +2109,7 @@ export class ShoppingProductSetting {
2107
2109
  window.parent.glitter.openNewTab(href);
2108
2110
  }), { icon: document.body.clientWidth > 768 ? 'fa-regular fa-eye' : undefined }),
2109
2111
  ].join(html `<div class="mx-1"></div>`)}
2110
- </div>
2112
+ </div>
2111
2113
  </div>
2112
2114
  ${BgWidget.container1x2({
2113
2115
  html: [
@@ -4281,7 +4283,6 @@ ${(_c = postMD.seo.content) !== null && _c !== void 0 ? _c : ''}</textarea
4281
4283
  Number(variant['v_width']) == 0 ||
4282
4284
  variant['v_length'] == undefined ||
4283
4285
  Number(variant['v_length']) == 0) {
4284
- console.log('variant -- ', variant);
4285
4286
  dialog.infoMessage({
4286
4287
  text: `規格 ${variant.spec.join(',')} 材積資訊未填`,
4287
4288
  });
@@ -2417,81 +2417,83 @@ export class ShoppingProductSetting {
2417
2417
  BgWidget.container(
2418
2418
  html`
2419
2419
  <div class="title-container flex-column" style="gap:10px;">
2420
- <div class="d-flex align-items-center w-100">
2421
- ${BgWidget.goBack(
2422
- obj.gvc.event(() => {
2423
- if ((window.parent as any).glitter.share.checkData && !(window.parent as any).glitter.share.checkData()) {
2424
- const dialog = new ShareDialog(gvc.glitter);
2425
- dialog.checkYesOrNot({
2426
- text: '尚未儲存內容,是否確認跳轉?',
2427
- callback: (response) => {
2428
- if (response) {
2429
- (window.parent as any).glitter.share.checkData = () => {
2430
- return true;
2431
- };
2432
- obj.vm.type = 'list';
2433
- }
2434
- },
2435
- });
2436
- } else {
2437
- obj.vm.type = 'list';
2438
- }
2439
- })
2440
- )}
2441
- <h3 class="mb-0 me-3 tx_title">${obj.type === 'replace' ? postMD.title || '編輯商品' : `新增商品`}</h3>
2442
- <div class="flex-fill"></div>
2443
- </div>
2444
- <div class="d-flex w-100">
2445
- <div class="flex-fill"></div>
2446
- ${[
2447
- BgWidget.grayButton(
2448
- '複製現有商品',
2449
- gvc.event(() => {
2450
- BgProduct.productsDialog({
2451
- gvc: gvc,
2452
- default: [],
2453
- single: true,
2454
- callback: (value) => {
2455
- const dialog = new ShareDialog(gvc.glitter);
2456
- dialog.dataLoading({ visible: true });
2457
- ApiShop.getProduct({
2458
- page: 0,
2459
- limit: 1,
2460
- id: value[0],
2461
- }).then((data) => {
2462
- dialog.dataLoading({ visible: false });
2463
- if (data.result && data.response.data && data.response.data.content) {
2464
- postMD = data.response.data.content;
2465
- postMD.id = undefined;
2466
- setProductType();
2467
- gvc.notifyDataChange(vm.id);
2468
- }
2469
- });
2470
- },
2471
- show_product_type:true
2472
- });
2473
- }),
2474
- {}
2475
- ),
2476
- BgWidget.grayButton(
2477
- 'AI 生成',
2478
- gvc.event(() => {
2479
- ProductAi.setProduct(gvc, postMD, () => {
2480
- gvc.notifyDataChange(vm.id);
2481
- });
2482
- }),
2483
- {}
2484
- ),
2485
- BgWidget.grayButton(
2486
- document.body.clientWidth > 768 ? '預覽商品' : '預覽',
2487
- gvc.event(() => {
2488
- const href = `https://${(window.parent as any).glitter.share.editorViewModel.domain}/products/${postMD.seo.domain}`;
2489
- (window.parent as any).glitter.openNewTab(href);
2490
- }),
2491
- { icon: document.body.clientWidth > 768 ? 'fa-regular fa-eye' : undefined }
2492
- ),
2493
- ].join(html`<div class="mx-1"></div>`)}
2494
- </div>
2420
+ <div class="d-flex align-items-center w-100">
2421
+ ${BgWidget.goBack(
2422
+ obj.gvc.event(() => {
2423
+ if ((window.parent as any).glitter.share.checkData && !(window.parent as any).glitter.share.checkData()) {
2424
+ const dialog = new ShareDialog(gvc.glitter);
2425
+ dialog.checkYesOrNot({
2426
+ text: '尚未儲存內容,是否確認跳轉?',
2427
+ callback: (response) => {
2428
+ if (response) {
2429
+ (window.parent as any).glitter.share.checkData = () => {
2430
+ return true;
2431
+ };
2432
+ obj.vm.type = 'list';
2433
+ }
2434
+ },
2435
+ });
2436
+ } else {
2437
+ obj.vm.type = 'list';
2438
+ }
2439
+ })
2440
+ )}
2441
+ <h3 class="mb-0 me-3 tx_title">${obj.type === 'replace' ? postMD.title || '編輯商品' : `新增商品`}</h3>
2442
+ <div class="flex-fill"></div>
2443
+ </div>
2444
+ <div class="d-flex w-100">
2445
+ <div class="flex-fill"></div>
2446
+ ${[
2447
+ obj.type === 'replace'
2448
+ ? ''
2449
+ : BgWidget.grayButton(
2450
+ '複製現有商品',
2451
+ gvc.event(() => {
2452
+ BgProduct.productsDialog({
2453
+ gvc: gvc,
2454
+ default: [],
2455
+ single: true,
2456
+ callback: (value) => {
2457
+ const dialog = new ShareDialog(gvc.glitter);
2458
+ dialog.dataLoading({ visible: true });
2459
+ ApiShop.getProduct({
2460
+ page: 0,
2461
+ limit: 1,
2462
+ id: value[0],
2463
+ }).then((data) => {
2464
+ dialog.dataLoading({ visible: false });
2465
+ if (data.result && data.response.data && data.response.data.content) {
2466
+ postMD = data.response.data.content;
2467
+ postMD.id = undefined;
2468
+ setProductType();
2469
+ gvc.notifyDataChange(vm.id);
2470
+ }
2471
+ });
2472
+ },
2473
+ show_product_type: true,
2474
+ });
2475
+ }),
2476
+ {}
2477
+ ),
2478
+ BgWidget.grayButton(
2479
+ 'AI 生成',
2480
+ gvc.event(() => {
2481
+ ProductAi.setProduct(gvc, postMD, () => {
2482
+ gvc.notifyDataChange(vm.id);
2483
+ });
2484
+ }),
2485
+ {}
2486
+ ),
2487
+ BgWidget.grayButton(
2488
+ document.body.clientWidth > 768 ? '預覽商品' : '預覽',
2489
+ gvc.event(() => {
2490
+ const href = `https://${(window.parent as any).glitter.share.editorViewModel.domain}/products/${postMD.seo.domain}`;
2491
+ (window.parent as any).glitter.openNewTab(href);
2492
+ }),
2493
+ { icon: document.body.clientWidth > 768 ? 'fa-regular fa-eye' : undefined }
2494
+ ),
2495
+ ].join(html`<div class="mx-1"></div>`)}
2496
+ </div>
2495
2497
  </div>
2496
2498
  ${BgWidget.container1x2(
2497
2499
  {
@@ -4925,7 +4927,6 @@ ${postMD.seo.content ?? ''}</textarea
4925
4927
  variant['v_length'] == undefined ||
4926
4928
  Number(variant['v_length']) == 0
4927
4929
  ) {
4928
- console.log('variant -- ', variant);
4929
4930
  dialog.infoMessage({
4930
4931
  text: `規格 ${variant.spec.join(',')} 材積資訊未填`,
4931
4932
  });
@@ -855,6 +855,7 @@ ${obj.structEnd ? obj.structEnd : '})()'}`,
855
855
  `https://cdnjs.cloudflare.com/ajax/libs/codemirror/6.65.7/codemirror.min.js`,
856
856
  `https://cdnjs.cloudflare.com/ajax/libs/codemirror/6.65.7/mode/xml/xml.min.js`,
857
857
  `https://cdnjs.cloudflare.com/ajax/libs/dompurify/2.2.7/purify.min.js`,
858
+ `https://cdn.jsdelivr.net/npm/froala-editor/js/languages/zh_tw.js`,
858
859
  `froala_editor.min.js`,
859
860
  `plugins/align.min.js`,
860
861
  `plugins/char_counter.min.js`,
@@ -913,26 +914,26 @@ ${obj.structEnd ? obj.structEnd : '})()'}`,
913
914
  setTimeout(() => {
914
915
  var _a;
915
916
  gvc.addStyle(`
916
- #insertImage-1 {
917
- display: none !important;
918
- }
919
- #insertImage-2 {
920
- display: none !important;
921
- }
922
- .fr-sticky-dummy {
923
- display: none !important;
924
- }
925
- ${obj.hiddenBorder
917
+ #insertImage-1 {
918
+ display: none !important;
919
+ }
920
+ #insertImage-2 {
921
+ display: none !important;
922
+ }
923
+ .fr-sticky-dummy {
924
+ display: none !important;
925
+ }
926
+ ${obj.hiddenBorder
926
927
  ? css `
927
- .fr-box {
928
- border: none !important;
929
- }
930
- .fr-box > div {
931
- border: none !important;
932
- }
933
- `
928
+ .fr-box {
929
+ border: none !important;
930
+ }
931
+ .fr-box > div {
932
+ border: none !important;
933
+ }
934
+ `
934
935
  : ''}
935
- `);
936
+ `);
936
937
  function generateFontSizeArray() {
937
938
  let fontSizes = [];
938
939
  for (let size = 8; size <= 30; size += 1) {
@@ -946,7 +947,8 @@ ${obj.structEnd ? obj.structEnd : '})()'}`,
946
947
  }
947
948
  return fontSizes;
948
949
  }
949
- const editor = new glitter.window.FroalaEditor('#' + richID, {
950
+ const FroalaEditor = glitter.window.FroalaEditor;
951
+ const editor = new FroalaEditor('#' + richID, {
950
952
  language: 'zh_tw',
951
953
  heightMin: (_a = obj.setHeight) !== null && _a !== void 0 ? _a : 350,
952
954
  content: obj.def,
@@ -1022,6 +1024,38 @@ ${obj.structEnd ? obj.structEnd : '})()'}`,
1022
1024
  },
1023
1025
  },
1024
1026
  key: 'hWA2C-7I2B2C4B3E4E2G3wd1DBKSPF1WKTUCQOa1OURPJ1KDe2F-11D2C2D2D2C3B3C1D6B1C2==',
1027
+ toolbarButtons: [
1028
+ 'bold',
1029
+ 'italic',
1030
+ 'underline',
1031
+ 'align',
1032
+ '|',
1033
+ 'paragraphFormat',
1034
+ 'fontSize',
1035
+ 'fontFamily',
1036
+ 'textColor',
1037
+ 'backgroundColor',
1038
+ 'clearFormatting',
1039
+ '|',
1040
+ 'insertTable',
1041
+ 'insertLink',
1042
+ 'insertImage',
1043
+ 'insertVideo',
1044
+ 'insertHR',
1045
+ '|',
1046
+ 'formatOL',
1047
+ 'emoticons',
1048
+ 'html',
1049
+ ],
1050
+ paragraphFormat: {
1051
+ N: '普通文字',
1052
+ H1: '標題 1',
1053
+ H2: '標題 2',
1054
+ H3: '標題 3',
1055
+ H4: '標題 4',
1056
+ H5: '標題 5',
1057
+ H6: '標題 6',
1058
+ },
1025
1059
  });
1026
1060
  if (glitter.document.querySelector(`.${richID}-loading`)) {
1027
1061
  glitter.document.querySelector(`.${richID}-loading`).remove();
@@ -1032,19 +1066,20 @@ ${obj.structEnd ? obj.structEnd : '})()'}`,
1032
1066
  try {
1033
1067
  editor.destroy();
1034
1068
  }
1035
- catch (e) {
1036
- }
1037
- render();
1069
+ catch (e) { }
1070
+ setTimeout(() => {
1071
+ render();
1072
+ }, 500);
1038
1073
  return;
1039
1074
  }
1040
1075
  target.outerHTML = html ` <button
1041
- id="insertImage-replace"
1042
- type="button"
1043
- tabindex="-1"
1044
- role="button"
1045
- class="fr-command fr-btn "
1046
- data-title="插入圖片 (⌘P)"
1047
- onclick="${obj.gvc.event(() => {
1076
+ id="insertImage-replace"
1077
+ type="button"
1078
+ tabindex="-1"
1079
+ role="button"
1080
+ class="fr-command fr-btn "
1081
+ data-title="插入圖片 (⌘P)"
1082
+ onclick="${obj.gvc.event(() => {
1048
1083
  if (obj.insertImageEvent) {
1049
1084
  obj.insertImageEvent(editor);
1050
1085
  }
@@ -1084,14 +1119,14 @@ ${obj.structEnd ? obj.structEnd : '})()'}`,
1084
1119
  });
1085
1120
  }
1086
1121
  })}"
1087
- >
1088
- <svg class="fr-svg" focusable="false" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
1089
- <path
1090
- d="M14.2,11l3.8,5H6l3-3.9l2.1,2.7L14,11H14.2z M8.5,11c0.8,0,1.5-0.7,1.5-1.5S9.3,8,8.5,8S7,8.7,7,9.5C7,10.3,7.7,11,8.5,11z M22,6v12c0,1.1-0.9,2-2,2H4c-1.1,0-2-0.9-2-2V6c0-1.1,0.9-2,2-2h16C21.1,4,22,4.9,22,6z M20,8.8V6H4v12h16V8.8z"
1091
- ></path>
1092
- </svg>
1093
- <span class="fr-sr-only">插入圖片</span>
1094
- </button>`;
1122
+ >
1123
+ <svg class="fr-svg" focusable="false" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
1124
+ <path
1125
+ d="M14.2,11l3.8,5H6l3-3.9l2.1,2.7L14,11H14.2z M8.5,11c0.8,0,1.5-0.7,1.5-1.5S9.3,8,8.5,8S7,8.7,7,9.5C7,10.3,7.7,11,8.5,11z M22,6v12c0,1.1-0.9,2-2,2H4c-1.1,0-2-0.9-2-2V6c0-1.1,0.9-2,2-2h16C21.1,4,22,4.9,22,6z M20,8.8V6H4v12h16V8.8z"
1126
+ ></path>
1127
+ </svg>
1128
+ <span class="fr-sr-only">插入圖片</span>
1129
+ </button>`;
1095
1130
  if (obj.rich_height) {
1096
1131
  glitter.document.querySelector(`#` + richID).querySelector(`.fr-view`).style.height = obj.rich_height;
1097
1132
  glitter.document.querySelector(`#` + richID).querySelector(`.fr-view`).style.minHeight = 'auto';