ts-glitter 13.3.5 → 13.3.7

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 (99) hide show
  1. package/lowcode/Entry.js +1 -1
  2. package/lowcode/Entry.ts +1 -1
  3. package/lowcode/backend-manager/bg-blog.js +2 -7
  4. package/lowcode/backend-manager/bg-blog.ts +8 -13
  5. package/lowcode/backend-manager/bg-graph-api.js +6 -11
  6. package/lowcode/backend-manager/bg-graph-api.ts +14 -20
  7. package/lowcode/backend-manager/bg-line.js +526 -1002
  8. package/lowcode/backend-manager/bg-line.ts +1815 -2354
  9. package/lowcode/backend-manager/bg-notify.js +392 -746
  10. package/lowcode/backend-manager/bg-notify.ts +436 -835
  11. package/lowcode/backend-manager/bg-project.js +176 -293
  12. package/lowcode/backend-manager/bg-project.ts +214 -344
  13. package/lowcode/backend-manager/bg-recommend.js +39 -148
  14. package/lowcode/backend-manager/bg-recommend.ts +43 -162
  15. package/lowcode/backend-manager/bg-sns.js +489 -814
  16. package/lowcode/backend-manager/bg-sns.ts +1876 -2238
  17. package/lowcode/backend-manager/bg-widget.js +301 -171
  18. package/lowcode/backend-manager/bg-widget.ts +324 -193
  19. package/lowcode/cms-plugin/ai-points.js +84 -67
  20. package/lowcode/cms-plugin/ai-points.ts +280 -247
  21. package/lowcode/cms-plugin/auto-reply.js +6 -7
  22. package/lowcode/cms-plugin/auto-reply.ts +6 -7
  23. package/lowcode/cms-plugin/data-analyze.js +5 -6
  24. package/lowcode/cms-plugin/data-analyze.ts +5 -6
  25. package/lowcode/cms-plugin/form-setting.js +122 -220
  26. package/lowcode/cms-plugin/form-setting.ts +124 -240
  27. package/lowcode/cms-plugin/line-auto-reply.js +17 -18
  28. package/lowcode/cms-plugin/line-auto-reply.ts +29 -36
  29. package/lowcode/cms-plugin/member-group-list.js +5 -2
  30. package/lowcode/cms-plugin/member-group-list.ts +5 -2
  31. package/lowcode/cms-plugin/member-type-list.js +36 -84
  32. package/lowcode/cms-plugin/member-type-list.ts +39 -92
  33. package/lowcode/cms-plugin/menus-setting.js +8 -73
  34. package/lowcode/cms-plugin/menus-setting.ts +8 -78
  35. package/lowcode/cms-plugin/permission-setting.js +73 -106
  36. package/lowcode/cms-plugin/permission-setting.ts +236 -278
  37. package/lowcode/cms-plugin/shopping-collections.js +95 -137
  38. package/lowcode/cms-plugin/shopping-collections.ts +103 -147
  39. package/lowcode/cms-plugin/shopping-discount-setting.js +310 -416
  40. package/lowcode/cms-plugin/shopping-discount-setting.ts +1269 -1386
  41. package/lowcode/cms-plugin/shopping-finance-setting.js +1 -0
  42. package/lowcode/cms-plugin/shopping-finance-setting.ts +1 -0
  43. package/lowcode/cms-plugin/shopping-order-manager.js +742 -973
  44. package/lowcode/cms-plugin/shopping-order-manager.ts +1928 -2164
  45. package/lowcode/cms-plugin/shopping-order-return.js +147 -267
  46. package/lowcode/cms-plugin/shopping-order-return.ts +154 -292
  47. package/lowcode/cms-plugin/shopping-product-setting.js +6 -2
  48. package/lowcode/cms-plugin/shopping-product-setting.ts +8 -4
  49. package/lowcode/cms-plugin/shopping-product-stock.js +12 -92
  50. package/lowcode/cms-plugin/shopping-product-stock.ts +14 -94
  51. package/lowcode/cms-plugin/shopping-product-text.js +0 -3
  52. package/lowcode/cms-plugin/shopping-product-text.ts +0 -3
  53. package/lowcode/cms-plugin/shopping-rebate.js +95 -151
  54. package/lowcode/cms-plugin/shopping-rebate.ts +101 -159
  55. package/lowcode/cms-plugin/sms-points.js +83 -67
  56. package/lowcode/cms-plugin/sms-points.ts +281 -241
  57. package/lowcode/cms-plugin/sns-auto-reply.js +18 -18
  58. package/lowcode/cms-plugin/sns-auto-reply.ts +34 -40
  59. package/lowcode/cms-plugin/user-list.js +71 -90
  60. package/lowcode/cms-plugin/user-list.ts +76 -95
  61. package/lowcode/cms-plugin/web-config-setting.js +61 -111
  62. package/lowcode/cms-plugin/web-config-setting.ts +65 -124
  63. package/lowcode/css/editor.css +5 -2
  64. package/lowcode/glitter-base/route/shopping.js +1 -1
  65. package/lowcode/glitter-base/route/shopping.ts +19 -19
  66. package/lowcode/jspage/editor.js +1 -1
  67. package/lowcode/jspage/editor.ts +1 -1
  68. package/lowcode/jspage/main.js +3 -0
  69. package/lowcode/jspage/main.ts +3 -0
  70. package/package.json +1 -2
  71. package/src/api-public/controllers/ai-chat.js.map +5 -1
  72. package/src/api-public/controllers/article.js.map +1 -1
  73. package/src/api-public/controllers/chat.js.map +1 -1
  74. package/src/api-public/controllers/fb-message.js.map +1 -1
  75. package/src/api-public/controllers/index.js.map +1 -1
  76. package/src/api-public/controllers/line-message.js.map +1 -1
  77. package/src/api-public/controllers/rebate.js.map +1 -1
  78. package/src/api-public/controllers/shop.js.map +1 -1
  79. package/src/api-public/controllers/user.js.map +1 -1
  80. package/src/api-public/services/auto-send-email.js.map +1 -1
  81. package/src/api-public/services/chat.js +3 -3
  82. package/src/api-public/services/chat.js.map +1 -1
  83. package/src/api-public/services/chat.ts +2 -3
  84. package/src/api-public/services/fb-message.js.map +5 -1
  85. package/src/api-public/services/filter-protect-data.js.map +1 -1
  86. package/src/api-public/services/line-message.js.map +1 -1
  87. package/src/api-public/services/monitor.js.map +1 -1
  88. package/src/api-public/services/notify.js.map +1 -1
  89. package/src/api-public/services/rebate.js.map +1 -1
  90. package/src/api-public/services/schedule.js.map +1 -1
  91. package/src/api-public/services/share-permission.js.map +1 -1
  92. package/src/api-public/services/shopping.js.map +1 -1
  93. package/src/api-public/services/user.js +67 -66
  94. package/src/api-public/services/user.js.map +1 -1
  95. package/src/api-public/services/user.ts +212 -182
  96. package/src/helper/glitter-util.js.map +1 -1
  97. package/src/modules/firebase.d.ts +1 -0
  98. package/src/modules/firebase.js +1 -1
  99. package/src/modules/firebase.js.map +1 -1
@@ -536,39 +536,6 @@ export class BgProject {
536
536
  function getDatalist() {
537
537
  return vm.dataList.map((dd) => {
538
538
  return [
539
- {
540
- key: EditorElem.checkBoxOnly({
541
- gvc: gvc,
542
- def: !vm.dataList.find((dd) => {
543
- return !dd.checked;
544
- }),
545
- callback: (result) => {
546
- vm.dataList.map((dd) => {
547
- dd.checked = result;
548
- });
549
- vmi.data = getDatalist();
550
- vmi.callback();
551
- gvc.notifyDataChange(filterID);
552
- callback(vm.dataList.filter((dd) => {
553
- return dd.checked;
554
- }));
555
- },
556
- }),
557
- value: EditorElem.checkBoxOnly({
558
- gvc: gvc,
559
- def: dd.checked,
560
- callback: (result) => {
561
- dd.checked = result;
562
- vmi.data = getDatalist();
563
- vmi.callback();
564
- gvc.notifyDataChange(filterID);
565
- callback(vm.dataList.filter((dd) => {
566
- return dd.checked;
567
- }));
568
- },
569
- style: 'height:25px;',
570
- }),
571
- },
572
539
  {
573
540
  key: '用戶名稱',
574
541
  value: `<span class="fs-7">${dd.userData.name}</span>`,
@@ -619,107 +586,79 @@ export class BgProject {
619
586
  自訂資料
620
587
  </button>
621
588
  </div>
622
- ${BgWidget.table({
623
- gvc: gvc,
624
- getData: (vd) => {
625
- vmi = vd;
626
- ApiUser.getUserList({
627
- page: vmi.page - 1,
628
- limit: 20,
629
- search: vm.query || undefined,
630
- }).then((data) => {
631
- vmi.pageSize = Math.ceil(data.response.total / 20);
632
- vm.dataList = data.response.data;
633
- vmi.data = getDatalist();
634
- vmi.loading = false;
635
- vmi.callback();
636
- });
637
- },
638
- rowClick: (data, index) => {
639
- if (type === 'select') {
640
- vm.dataList[index].checked = !vm.dataList[index].checked;
641
- vmi.data = getDatalist();
642
- vmi.callback();
643
- callback(vm.dataList.filter((dd) => {
644
- return dd.checked;
645
- }));
646
- }
647
- else {
648
- vm.data = vm.dataList[index];
649
- vm.type = 'replace';
650
- }
651
- },
652
- filter: html `
653
- ${BgWidget.searchPlace(gvc.event((e, event) => {
589
+ ${BgWidget.mainCard([
590
+ BgWidget.searchPlace(gvc.event((e, event) => {
654
591
  vm.query = e.value;
655
592
  gvc.notifyDataChange(id);
656
- }), vm.query || '', '搜尋所有用戶')}
657
- ${gvc.bindView(() => {
658
- return {
659
- bind: filterID,
660
- view: () => {
661
- if (!vm.dataList ||
662
- !vm.dataList.find((dd) => {
663
- return dd.checked;
664
- }) ||
665
- type === 'select') {
666
- return ``;
667
- }
668
- else {
593
+ }), vm.query || '', '搜尋所有用戶'),
594
+ BgWidget.tableV3({
595
+ gvc: gvc,
596
+ getData: (vmi) => {
597
+ const limit = 20;
598
+ ApiUser.getUserList({
599
+ page: vmi.page - 1,
600
+ limit: limit,
601
+ search: vm.query || undefined,
602
+ }).then((data) => {
603
+ vm.dataList = data.response.data;
604
+ vmi.pageSize = Math.ceil(data.response.total / limit);
605
+ vmi.originalData = vm.dataList;
606
+ vmi.tableData = getDatalist();
607
+ vmi.loading = false;
608
+ vmi.callback();
609
+ });
610
+ },
611
+ rowClick: (data, index) => {
612
+ if (type === 'select') {
613
+ vm.dataList[index].checked = !vm.dataList[index].checked;
614
+ vmi.data = getDatalist();
615
+ vmi.callback();
616
+ callback(vm.dataList.filter((dd) => {
617
+ return dd.checked;
618
+ }));
619
+ }
620
+ else {
621
+ vm.data = vm.dataList[index];
622
+ vm.type = 'replace';
623
+ }
624
+ },
625
+ filter: [
626
+ {
627
+ name: '批量移除',
628
+ event: () => {
669
629
  const dialog = new ShareDialog(gvc.glitter);
670
- const selCount = vm.dataList.filter((dd) => dd.checked).length;
671
- return BgWidget.selNavbar({
672
- count: selCount,
673
- buttonList: [
674
- BgWidget.selEventButton('批量移除', gvc.event(() => {
675
- dialog.checkYesOrNot({
676
- text: '是否確認刪除所選項目?',
677
- callback: (response) => {
678
- if (response) {
679
- dialog.dataLoading({ visible: true });
680
- ApiUser.deleteUser({
681
- id: vm.dataList
682
- .filter((dd) => {
683
- return dd.checked;
684
- })
685
- .map((dd) => {
686
- return dd.id;
687
- })
688
- .join(`,`),
689
- }).then((res) => {
690
- dialog.dataLoading({ visible: false });
691
- if (res.result) {
692
- vm.dataList = undefined;
693
- gvc.notifyDataChange(id);
694
- }
695
- else {
696
- dialog.errorMessage({ text: '刪除失敗' });
697
- }
698
- });
699
- }
700
- },
630
+ dialog.checkYesOrNot({
631
+ text: '是否確認刪除所選項目?',
632
+ callback: (response) => {
633
+ if (response) {
634
+ dialog.dataLoading({ visible: true });
635
+ ApiUser.deleteUser({
636
+ id: vm.dataList
637
+ .filter((dd) => {
638
+ return dd.checked;
639
+ })
640
+ .map((dd) => {
641
+ return dd.id;
642
+ })
643
+ .join(`,`),
644
+ }).then((res) => {
645
+ dialog.dataLoading({ visible: false });
646
+ if (res.result) {
647
+ vm.dataList = undefined;
648
+ gvc.notifyDataChange(id);
649
+ }
650
+ else {
651
+ dialog.errorMessage({ text: '刪除失敗' });
652
+ }
701
653
  });
702
- })),
703
- ],
654
+ }
655
+ },
704
656
  });
705
- }
706
- },
707
- divCreate: () => {
708
- return {
709
- class: `d-flex align-items-center p-2 py-3 ${!vm.dataList ||
710
- !vm.dataList.find((dd) => {
711
- return dd.checked;
712
- }) ||
713
- type === 'select'
714
- ? `d-none`
715
- : ``}`,
716
- style: `height:40px;gap: 10px;margin-top:10px;`,
717
- };
657
+ },
718
658
  },
719
- };
720
- })}
721
- `,
722
- })}
659
+ ],
660
+ }),
661
+ ].join(''))}
723
662
  `);
724
663
  }
725
664
  else if (vm.type == 'replace') {
@@ -1046,181 +985,125 @@ export class BgProject {
1046
985
  '審核通過的結果可能會因應用程式的完整性、商店條款、隱私權政策、以及平台政策等方面而有所不同,建議送審時,請再三進行確認',
1047
986
  '審核時間預計落在 7 到 14 個工作天',
1048
987
  ])}
1049
- ${BgWidget.container(BgWidget.mainCard(BgWidget.tableV2({
1050
- gvc: gvc,
1051
- getData: (vmi) => {
1052
- ApiApp.getAppRelease({
1053
- page: vmi.page - 1,
1054
- limit: 50,
1055
- search: vm.query || undefined,
1056
- type: type,
1057
- }).then((data) => {
1058
- vmi.pageSize = Math.ceil(data.response.total / 50);
1059
- vm.dataList = data.response.data;
1060
- function getDatalist() {
1061
- return data.response.data.map((dd) => {
1062
- return [
1063
- {
1064
- key: EditorElem.checkBoxOnly({
1065
- gvc: gvc,
1066
- def: !data.response.data.find((dd) => {
1067
- return !dd.checked;
1068
- }),
1069
- callback: (result) => {
1070
- data.response.data.map((dd) => {
1071
- dd.checked = result;
988
+ ${BgWidget.container(BgWidget.mainCard([
989
+ BgWidget.searchPlace(gvc.event((e, event) => {
990
+ vm.query = e.value;
991
+ gvc.notifyDataChange(id);
992
+ }), vm.query || '', '搜尋所有紀錄'),
993
+ BgWidget.tableV3({
994
+ gvc: gvc,
995
+ getData: (vmi) => {
996
+ const limit = 50;
997
+ ApiApp.getAppRelease({
998
+ page: vmi.page - 1,
999
+ limit: limit,
1000
+ search: vm.query || undefined,
1001
+ type: type,
1002
+ }).then((data) => {
1003
+ function getDatalist() {
1004
+ return data.response.data.map((dd) => {
1005
+ return [
1006
+ {
1007
+ key: 'APP資訊',
1008
+ value: html `<div style="min-width: 150px;">
1009
+ <img
1010
+ class="rounded border me-4 ${dd.content.logo || 'd-none'}"
1011
+ alt=""
1012
+ src="${dd.content.logo}"
1013
+ style="width:40px;height:40px;"
1014
+ />
1015
+ <span>${dd.content.name}</span>
1016
+ </div>`,
1017
+ },
1018
+ {
1019
+ key: '審核狀態',
1020
+ value: (() => {
1021
+ switch (dd.content.status) {
1022
+ case 'finish':
1023
+ return `<div class="badge badge-success fs-7" >審核通過</div>`;
1024
+ case 'error':
1025
+ return `<div class="badge bg-danger fs-7" >審核失敗</div>`;
1026
+ case 'wait':
1027
+ return `<div class="badge bg-warning fs-7" style="color:black;">等待審核</div>`;
1028
+ default:
1029
+ return `<div class="badge bg-secondary fs-7" >手動送審</div>`;
1030
+ }
1031
+ })(),
1032
+ },
1033
+ {
1034
+ key: '專案包',
1035
+ value: html `<i
1036
+ class="fa-solid fa-download fs-6 ms-3"
1037
+ onclick="${gvc.event((e, event) => {
1038
+ const dialog = new ShareDialog(gvc.glitter);
1039
+ dialog.dataLoading({ visible: true });
1040
+ (type === 'android_release' ? ApiApp.downloadAndroidRelease : ApiApp.downloadIOSRelease)({
1041
+ app_name: dd.content.name,
1042
+ bundle_id: dd.content.bundle_id,
1043
+ }).then((dd) => {
1044
+ dialog.dataLoading({ visible: false });
1045
+ if (dd.result) {
1046
+ dialog.successMessage({
1047
+ text: '下載成功,請前往資料夾查看。',
1048
+ });
1049
+ window.parent.glitter.openNewTab(dd.response.url);
1050
+ }
1051
+ else {
1052
+ dialog.errorMessage({ text: '下載失敗' });
1053
+ }
1072
1054
  });
1073
- vmi.data = getDatalist();
1074
- vmi.callback();
1075
- gvc.notifyDataChange(filterID);
1076
- },
1077
- }),
1078
- value: EditorElem.checkBoxOnly({
1079
- gvc: gvc,
1080
- def: dd.checked,
1081
- callback: (result) => {
1082
- dd.checked = result;
1083
- vmi.data = getDatalist();
1084
- vmi.callback();
1085
- gvc.notifyDataChange(filterID);
1086
- },
1087
- style: 'height:40px;',
1088
- }),
1089
- },
1090
- {
1091
- key: 'APP資訊',
1092
- value: html `<div style="min-width: 150px;">
1093
- <img
1094
- class="rounded border me-4 ${dd.content.logo || 'd-none'}"
1095
- alt=""
1096
- src="${dd.content.logo}"
1097
- style="width:40px;height:40px;"
1098
- />
1099
- <span>${dd.content.name}</span>
1100
- </div>`,
1101
- },
1102
- {
1103
- key: '審核狀態',
1104
- value: (() => {
1105
- switch (dd.content.status) {
1106
- case 'finish':
1107
- return `<div class="badge badge-success fs-7" >審核通過</div>`;
1108
- case 'error':
1109
- return `<div class="badge bg-danger fs-7" >審核失敗</div>`;
1110
- case 'wait':
1111
- return `<div class="badge bg-warning fs-7" style="color:black;">等待審核</div>`;
1112
- default:
1113
- return `<div class="badge bg-secondary fs-7" >手動送審</div>`;
1114
- }
1115
- })(),
1116
- },
1117
- {
1118
- key: '專案包',
1119
- value: `<i class="fa-solid fa-download fs-6 ms-3" onclick="${gvc.event((e, event) => {
1120
- const dialog = new ShareDialog(gvc.glitter);
1055
+ event.stopPropagation();
1056
+ })}"
1057
+ ></i>`,
1058
+ },
1059
+ ].map((dd) => {
1060
+ dd.value = `<div style="line-height:40px;">${dd.value}</div>`;
1061
+ return dd;
1062
+ });
1063
+ });
1064
+ }
1065
+ vm.dataList = data.response.data;
1066
+ vmi.pageSize = Math.ceil(data.response.total / limit);
1067
+ vmi.originalData = vm.dataList;
1068
+ vmi.tableData = getDatalist();
1069
+ vmi.loading = false;
1070
+ vmi.callback();
1071
+ });
1072
+ },
1073
+ rowClick: (data, index) => {
1074
+ replaceData = vm.dataList[index].content;
1075
+ vm.status = 'replace';
1076
+ },
1077
+ filter: [
1078
+ {
1079
+ name: '批量移除',
1080
+ event: (checkedData) => {
1081
+ const dialog = new ShareDialog(glitter);
1082
+ dialog.checkYesOrNot({
1083
+ text: '是否確認刪除所選項目?',
1084
+ callback: (response) => {
1085
+ if (response) {
1121
1086
  dialog.dataLoading({ visible: true });
1122
- (type === 'android_release' ? ApiApp.downloadAndroidRelease : ApiApp.downloadIOSRelease)({
1123
- app_name: dd.content.name,
1124
- bundle_id: dd.content.bundle_id,
1125
- }).then((dd) => {
1087
+ ApiShop.delete({
1088
+ id: checkedData.map((dd) => dd.id).join(`,`),
1089
+ }).then((res) => {
1126
1090
  dialog.dataLoading({ visible: false });
1127
- if (dd.result) {
1128
- dialog.successMessage({
1129
- text: '下載成功,請前往資料夾查看。',
1130
- });
1131
- window.parent.glitter.openNewTab(dd.response.url);
1091
+ if (res.result) {
1092
+ vm.dataList = undefined;
1093
+ gvc.notifyDataChange(id);
1132
1094
  }
1133
1095
  else {
1134
- dialog.errorMessage({ text: '下載失敗' });
1096
+ dialog.errorMessage({ text: '刪除失敗' });
1135
1097
  }
1136
1098
  });
1137
- event.stopPropagation();
1138
- })}"></i>`,
1099
+ }
1139
1100
  },
1140
- ].map((dd) => {
1141
- dd.value = `<div style="line-height:40px;">${dd.value}</div>`;
1142
- return dd;
1143
1101
  });
1144
- });
1145
- }
1146
- vmi.data = getDatalist();
1147
- vmi.loading = false;
1148
- vmi.callback();
1149
- });
1150
- },
1151
- rowClick: (data, index) => {
1152
- replaceData = vm.dataList[index].content;
1153
- vm.status = 'replace';
1154
- },
1155
- filter: html `
1156
- ${BgWidget.searchPlace(gvc.event((e, event) => {
1157
- vm.query = e.value;
1158
- gvc.notifyDataChange(id);
1159
- }), vm.query || '', '搜尋所有紀錄')}
1160
- ${gvc.bindView(() => {
1161
- return {
1162
- bind: filterID,
1163
- view: () => {
1164
- if (!vm.dataList ||
1165
- !vm.dataList.find((dd) => {
1166
- return dd.checked;
1167
- })) {
1168
- return ``;
1169
- }
1170
- else {
1171
- const dialog = new ShareDialog(gvc.glitter);
1172
- const selCount = vm.dataList.filter((dd) => dd.checked).length;
1173
- return BgWidget.selNavbar({
1174
- count: selCount,
1175
- buttonList: [
1176
- BgWidget.selEventButton('批量移除', gvc.event(() => {
1177
- dialog.checkYesOrNot({
1178
- text: '是否確認刪除所選項目?',
1179
- callback: (response) => {
1180
- if (response) {
1181
- dialog.dataLoading({ visible: true });
1182
- ApiShop.delete({
1183
- id: vm.dataList
1184
- .filter((dd) => {
1185
- return dd.checked;
1186
- })
1187
- .map((dd) => {
1188
- return dd.id;
1189
- })
1190
- .join(`,`),
1191
- }).then((res) => {
1192
- dialog.dataLoading({ visible: false });
1193
- if (res.result) {
1194
- vm.dataList = undefined;
1195
- gvc.notifyDataChange(id);
1196
- }
1197
- else {
1198
- dialog.errorMessage({ text: '刪除失敗' });
1199
- }
1200
- });
1201
- }
1202
- },
1203
- });
1204
- })),
1205
- ],
1206
- });
1207
- }
1208
- },
1209
- divCreate: () => {
1210
- return {
1211
- class: `d-flex align-items-center p-2 py-3 ${!vm.dataList ||
1212
- !vm.dataList.find((dd) => {
1213
- return dd.checked;
1214
- })
1215
- ? `d-none`
1216
- : ``}`,
1217
- style: `height:40px;gap: 10px;margin-top:10px;`,
1218
- };
1102
+ },
1219
1103
  },
1220
- };
1221
- })}
1222
- `,
1223
- })))}
1104
+ ],
1105
+ }),
1106
+ ].join('')))}
1224
1107
  `, BgWidget.getContainerWidth());
1225
1108
  case 'replace':
1226
1109
  return BgProject.appReleaseForm(vm, gvc, type, replaceData);