cloud-web-corejs 1.0.54-dev.786 → 1.0.54-dev.788

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 (158) hide show
  1. package/package.json +2 -1
  2. package/src/components/VabUpload/index.vue +1 -1
  3. package/src/components/baseInputExport/mixins.js +13 -2
  4. package/src/components/code-editor/async.js +29 -0
  5. package/src/components/code-editor/index.vue +65 -6
  6. package/src/components/excelImport/index.js +69 -7
  7. package/src/components/excelImport/mixins.js +841 -9
  8. package/src/components/fileLibrary/fileHistoryDialog.vue +1 -1
  9. package/src/components/fileLibrary/fileObjAuthEdit.vue +1 -1
  10. package/src/components/fileLibrary/filterDialog.vue +1 -1
  11. package/src/components/formDialog/README.md +324 -241
  12. package/src/components/formDialog/actionButtons.js +90 -0
  13. package/src/components/formDialog/index.js +48 -35
  14. package/src/components/formDialog/index.vue +802 -724
  15. package/src/components/formDrawer/drawer.vue +719 -0
  16. package/src/components/formDrawer/index.js +50 -0
  17. package/src/components/onlineTalk/talkUserDialog.vue +1 -1
  18. package/src/components/table/index.js +4 -0
  19. package/src/components/tempStorage/tempStorageDialog.vue +1 -1
  20. package/src/components/wf/addTaskUserdialog.vue +1 -1
  21. package/src/components/xform/docs/2026-08 /345/210/227/350/241/250/345/257/274/345/207/272/350/204/261/346/225/217/345/210/227/345/211/224/351/231/244/350/220/275/345/234/260/346/226/207/346/241/243.md" +165 -0
  22. package/src/components/xform/form-designer/form-widget/container-widget/data-table-widget.vue +1 -1
  23. package/src/components/xform/form-designer/form-widget/dialog/formDialog.vue +115 -4
  24. package/src/components/xform/form-designer/form-widget/dialog/formDrawer.vue +102 -5
  25. package/src/components/xform/form-designer/form-widget/dialog/formFieldDialog.vue +1 -1
  26. package/src/components/xform/form-designer/form-widget/dialog/vabSearchDialog.vue +1 -1
  27. package/src/components/xform/form-designer/form-widget/field-widget/form-item-wrapper.vue +18 -73
  28. package/src/components/xform/form-designer/form-widget/field-widget/script-input-widget.vue +3 -0
  29. package/src/components/xform/form-designer/setting-panel/action-button-config-dialog.vue +241 -0
  30. package/src/components/xform/form-designer/setting-panel/form-setting.vue +116 -0
  31. package/src/components/xform/form-designer/setting-panel/property-editor/container-detail/detail-editor.vue +6 -0
  32. package/src/components/xform/form-designer/widget-panel/widgetsConfig.js +1 -0
  33. package/src/components/xform/form-render/container-item/data-table-mixin.js +1480 -1460
  34. package/src/components/xform/form-render/container-item/detail-item.vue +11 -2
  35. package/src/components/xform/form-render/container-item/list-h5-item.vue +12 -0
  36. package/src/components/xform/form-render/indexMixin.js +5 -0
  37. package/src/components/xform/utils/textMaskUtil.js +186 -0
  38. package/src/index.js +505 -472
  39. package/src/store/config/index.js +224 -0
  40. package/src/store/modules/tagsView.js +4 -2
  41. package/src/utils/lazyPlugin.js +66 -0
  42. package/src/views/bd/project/branch/bd_branch/edit.vue +145 -0
  43. package/src/views/bd/project/branch/bd_branch/list.vue +72 -0
  44. package/src/views/bd/project/branch/bd_branch/menuKindDialog.vue +106 -0
  45. package/src/views/bd/project/branch/bd_branch/mixins/edit.js +189 -0
  46. package/src/views/bd/project/branch/bd_branch/mixins/list.js +124 -0
  47. package/src/views/bd/project/branch/bd_branch/mixins/menuKindDialog.js +85 -0
  48. package/src/views/bd/project/branch/form_script/list.vue +22 -0
  49. package/src/views/bd/project/branch/form_template/list.vue +21 -0
  50. package/src/views/bd/project/branch/menu_kind/list.vue +21 -0
  51. package/src/views/bd/project/common/form_script/list.vue +16 -0
  52. package/src/views/bd/project/common/form_template/list.vue +15 -0
  53. package/src/views/bd/project/common/menu_kind/list.vue +15 -0
  54. package/src/views/bd/project/core/branchContext.js +100 -0
  55. package/src/views/bd/project/core/branchPage.js +78 -0
  56. package/src/views/bd/project/core/branchPageWrap.vue +216 -0
  57. package/src/views/bd/project/core/branchScope.js +44 -0
  58. package/src/views/bd/project/core/branchSelect.vue +106 -0
  59. package/src/views/bd/project/core/httpBranchPatch.js +58 -0
  60. package/src/views/bd/project/datatable/menu_kind/list.vue +15 -0
  61. package/src/views/bd/project/datatable/table_model/list.vue +15 -0
  62. package/src/views/bd/setting/bd_attach_setting/dialog.vue +1 -1
  63. package/src/views/bd/setting/bd_attach_setting/list.vue +1 -1
  64. package/src/views/bd/setting/bd_company_env/dialog.vue +1 -1
  65. package/src/views/bd/setting/bd_company_env/list.vue +1 -1
  66. package/src/views/bd/setting/formVersion/ftHistoryDialog.vue +1 -1
  67. package/src/views/bd/setting/form_import_log/list.vue +1 -1
  68. package/src/views/bd/setting/form_script/dialog.vue +1 -1
  69. package/src/views/bd/setting/form_script/form_list.vue +1 -1
  70. package/src/views/bd/setting/form_script/list.vue +1 -1
  71. package/src/views/bd/setting/form_script/list1.vue +1 -1
  72. package/src/views/bd/setting/form_template/dialog.vue +1 -1
  73. package/src/views/bd/setting/form_template/formDesignerDialog.vue +1 -0
  74. package/src/views/bd/setting/form_template/ftHistoryDialog.vue +1 -1
  75. package/src/views/bd/setting/form_template/itemList.vue +1 -1
  76. package/src/views/bd/setting/form_template/list.vue +3 -3
  77. package/src/views/bd/setting/form_template/mixins/edit.js +3 -3
  78. package/src/views/bd/setting/form_template/mixins/list.js +3 -3
  79. package/src/views/bd/setting/form_template/mixins/list2.js +3 -3
  80. package/src/views/bd/setting/form_template/mixins/wf_list.js +3 -3
  81. package/src/views/bd/setting/form_template/wf_list.vue +3 -3
  82. package/src/views/bd/setting/logic_param/list.vue +1 -1
  83. package/src/views/bd/setting/menu_kind/dialog.vue +1 -1
  84. package/src/views/bd/setting/menu_kind/list.vue +1 -1
  85. package/src/views/bd/setting/push_data/list.vue +1 -1
  86. package/src/views/bd/setting/push_data_h/list.vue +1 -1
  87. package/src/views/bd/setting/request_async_setting/list.vue +1 -1
  88. package/src/views/bd/setting/request_setting/list.vue +1 -1
  89. package/src/views/bd/setting/table_model/dialog.vue +1 -1
  90. package/src/views/bd/setting/table_model/list.vue +1 -1
  91. package/src/views/bd/setting/table_model/zdDialog.vue +1 -1
  92. package/src/views/support/export_template/list.vue +1 -1
  93. package/src/views/user/access_log/list.vue +1 -1
  94. package/src/views/user/access_log/list2.vue +1 -1
  95. package/src/views/user/api_request/list.vue +1 -1
  96. package/src/views/user/area/dialog.vue +1 -1
  97. package/src/views/user/area/list.vue +1 -1
  98. package/src/views/user/bill_setting/list.vue +1 -1
  99. package/src/views/user/bill_setting/userDialog.vue +1 -1
  100. package/src/views/user/code_rules/list.vue +1 -1
  101. package/src/views/user/common_attribute/list.vue +1 -1
  102. package/src/views/user/common_script/list.vue +1 -1
  103. package/src/views/user/company_info/dialog.vue +1 -1
  104. package/src/views/user/country/dialog.vue +1 -1
  105. package/src/views/user/country/list.vue +1 -1
  106. package/src/views/user/data_type_setting/dialog.vue +1 -1
  107. package/src/views/user/extend_datasource/dialog.vue +1 -1
  108. package/src/views/user/extend_datasource/list.vue +1 -1
  109. package/src/views/user/fieldTranslation/list.vue +1 -1
  110. package/src/views/user/field_values_invisible/list.vue +1 -1
  111. package/src/views/user/file_type/list.vue +1 -1
  112. package/src/views/user/file_view_area/list.vue +1 -1
  113. package/src/views/user/form/form_template/dialog.vue +1 -1
  114. package/src/views/user/form/form_template/itemList.vue +1 -1
  115. package/src/views/user/form/form_template/list.vue +1 -1
  116. package/src/views/user/form/form_template_field/dialog.vue +1 -1
  117. package/src/views/user/form/form_type/dialog.vue +1 -1
  118. package/src/views/user/form/form_type/list.vue +1 -1
  119. package/src/views/user/form/report_requestaccess/dialog.vue +1 -1
  120. package/src/views/user/form/report_requestaccess/list.vue +1 -1
  121. package/src/views/user/form/vform/designer.vue +51 -22
  122. package/src/views/user/groups/dialog.vue +1 -1
  123. package/src/views/user/groups/list.vue +1 -1
  124. package/src/views/user/lang_tag/dialog.vue +1 -1
  125. package/src/views/user/lang_tag/list.vue +1 -1
  126. package/src/views/user/language_setting/list.vue +1 -1
  127. package/src/views/user/menu/list.vue +1 -1
  128. package/src/views/user/mobile_menu/list.vue +1 -1
  129. package/src/views/user/notify_message/list.vue +1 -1
  130. package/src/views/user/notify_template/list.vue +1 -1
  131. package/src/views/user/notify_template/list2.vue +1 -1
  132. package/src/views/user/oplog/list.vue +1 -1
  133. package/src/views/user/position/dialog.vue +1 -1
  134. package/src/views/user/position/list.vue +1 -1
  135. package/src/views/user/project_tag/dialog.vue +1 -1
  136. package/src/views/user/project_tag/list.vue +1 -1
  137. package/src/views/user/push_setting/list.vue +1 -1
  138. package/src/views/user/request_setting/list.vue +1 -1
  139. package/src/views/user/role/dialog.vue +1 -1
  140. package/src/views/user/role/list.vue +1 -1
  141. package/src/views/user/sale_org/dialog.vue +1 -1
  142. package/src/views/user/sale_org/list.vue +1 -1
  143. package/src/views/user/system_notice/list.vue +1 -1
  144. package/src/views/user/system_parameter/list.vue +1 -1
  145. package/src/views/user/user/dialog.vue +1 -1
  146. package/src/views/user/user/form_dialog.vue +1 -1
  147. package/src/views/user/user/form_list.vue +1 -1
  148. package/src/views/user/user/list.vue +2 -2
  149. package/src/views/user/user_log_classify/list.vue +1 -1
  150. package/src/views/user/wf/wfReport/index.vue +2 -2
  151. package/src/views/user/wf/wf_auto_submit_data/list.vue +2 -2
  152. package/src/views/user/wf/wf_manage/list.vue +2 -2
  153. package/src/views/user/wf/wf_manage/list2.vue +2 -2
  154. package/src/views/user/wf/wf_obj_config/dialog.vue +1 -1
  155. package/src/views/user/wf/wf_obj_config/list.vue +1 -1
  156. package/src/views/user/wf/wf_obj_config/list_form.vue +1 -1
  157. package/src/views/user/wf/wf_transfer_setting/list.vue +1 -1
  158. package/src/views/user/workbench_menu/list.vue +1 -1
@@ -253,6 +253,10 @@ import {
253
253
  isVabsearchMultiWidget,
254
254
  } from "../../../../../components/xform/utils/util";
255
255
  import compareView from "../../../../../components/xform/form-render/compareView.vue";
256
+ import {
257
+ compareToList,
258
+ resolveTextMaskFlag,
259
+ } from "../../../../../components/xform/utils/textMaskUtil";
256
260
 
257
261
  export default {
258
262
  name: "form-item-wrapper",
@@ -680,81 +684,22 @@ export default {
680
684
  let formConfig = fJson.formConfig;
681
685
  if (formConfig.isLoadEntity && !formRef.dataId) return;
682
686
 
683
- let bdService = formRef.bdService;
684
- let companyCode = this.$store.getters.companyCode;
685
- let loginAccount = this.$store.getters.loginAccount;
686
-
687
- let userSaleOrgDTOs = formRef.userSaleOrgDTOs;
688
- let userRoleDTOs = formRef.userRoleDTOs;
689
-
690
- let saleOrgCodeList = userSaleOrgDTOs.map((item) => item.sn);
691
- let roleCodeList = userRoleDTOs.map((item) => item.roleCode);
692
-
693
- let optionModel = this.field.options;
694
-
695
- let flag = 0; //0 原本组件,1明文文本,2密文文本
696
- /*if (optionModel.showTextEnabled) {
697
- flag = 1;
698
- } else if (optionModel.showEncryptTextEnabled) {
699
- flag = 2;
700
- } else if (optionModel.showLinkTextEnabled) {
701
- flag = 3;
702
- }*/
703
- if (optionModel.userTextRuleEnabled) {
704
- let userTextRuleConfig = optionModel.userTextRuleConfig || [];
705
- userTextRuleConfig.forEach((item) => {
706
- let type = item.type ?? null;
707
- if (type !== null && type !== "") {
708
- let companyCodeStr = item.companyCodes;
709
- let companyCodes = companyCodeStr
710
- ? companyCodeStr.split(",").filter((item) => !!item)
711
- : [];
712
- /*
713
-
714
- let loginAccountStr = item.loginAccounts;
715
- let loginAccounts = loginAccountStr ? loginAccountStr.split(",").filter(item => !!item) : [];
716
-
717
- let saleOrgCodeStr = item.saleOrgCodes;
718
- let saleOrgCodes = saleOrgCodeStr ? saleOrgCodeStr.split(",").filter(item => !!item) : [];
719
- */
720
-
721
- let roleCodeStr = item.roleCodes;
722
- let roleCodes = roleCodeStr
723
- ? roleCodeStr.split(",").filter((item) => !!item)
724
- : [];
725
-
726
- let flag1 = !item.serveName || item.serveName == bdService;
727
- let flag2 =
728
- !companyCodes.length || companyCodes.includes(companyCode);
729
- // let flag3 = !loginAccounts.length || loginAccounts.includes(loginAccount)
730
- // let flag4 = this.compareToList(saleOrgCodes, saleOrgCodeList)
731
- if (flag1 && flag2) {
732
- this.encryptFormula = item.encryptFormula;
733
- let flag5 = this.compareToList(roleCodes, roleCodeList);
734
- if (flag5) {
735
- //匹配角色
736
- if (type == 2) flag = 2; //type=2时加密
737
- } else {
738
- //角色不匹配
739
- if (type == 1) flag = 2;
740
- }
741
- }
742
- }
743
- });
744
- }
745
- this.field.options.widgetTextFlag = flag;
746
- // this.showType = flag;
687
+ let userRoleDTOs = formRef.userRoleDTOs || [];
688
+ // 判定逻辑与导出侧(数据表格按列剔除)共用 textMaskUtil,
689
+ // 否则会出现界面打码、导出放行两套结论
690
+ let { masked, encryptFormula } = resolveTextMaskFlag(this.field.options, {
691
+ bdService: formRef.bdService,
692
+ companyCode: this.$store.getters.companyCode,
693
+ roleCodeList: userRoleDTOs.map((item) => item.roleCode),
694
+ });
695
+
696
+ this.encryptFormula = encryptFormula;
697
+ //0 原本组件,1明文文本,2密文文本
698
+ this.field.options.widgetTextFlag = masked ? 2 : 0;
747
699
  },
700
+ /* 实现已移入 textMaskUtil,此处保留方法名供下游调用(同名的是导入的模块函数) */
748
701
  compareToList(list1, list2) {
749
- if (!list1.length) {
750
- return true;
751
- }
752
- if (!list2.length) {
753
- return false;
754
- }
755
- return list1.some((item) => {
756
- return list2.some((item2) => item == item2);
757
- });
702
+ return compareToList(list1, list2);
758
703
  },
759
704
  isShowWidget() {
760
705
  let widgetTextFlag = this.field.options.widgetTextFlag;
@@ -38,6 +38,7 @@ import FormItemWrapper from "./form-item-wrapper";
38
38
  import emitter from "../../../utils/emitter";
39
39
  import i18n from "../../../utils/i18n";
40
40
  import fieldMixin from "./fieldMixin";
41
+ import createCodeEditorAsyncComponent from "../../../../code-editor/async";
41
42
 
42
43
  export default {
43
44
  name: "script-input-widget",
@@ -68,6 +69,8 @@ export default {
68
69
  },
69
70
  components: {
70
71
  FormItemWrapper,
72
+ // 不依赖 src/index.js 的全局注册,避免宿主应用未注册时整块消失
73
+ CodeEditor: createCodeEditorAsyncComponent,
71
74
  },
72
75
  inject: ["refList", "globalOptionData", "globalModel"],
73
76
  data() {
@@ -0,0 +1,241 @@
1
+ <template>
2
+ <el-dialog
3
+ title="操作按钮配置"
4
+ :visible.sync="dialogVisible"
5
+ custom-class="dialog-style list-dialog"
6
+ :show-close="true"
7
+ append-to-body
8
+ :close-on-click-modal="false"
9
+ :close-on-press-escape="false"
10
+ :destroy-on-close="true"
11
+ width="560px"
12
+ v-dialog-drag
13
+ @close="handleClose"
14
+ >
15
+ <div class="cont">
16
+ <el-form label-width="130px" class="action-button-config-form">
17
+ <el-form-item label="按钮标识(code)">
18
+ <el-input
19
+ v-model="model.code"
20
+ class="all-width"
21
+ placeholder="必填,resolve 时用于区分按钮"
22
+ clearable
23
+ ></el-input>
24
+ </el-form-item>
25
+ <el-form-item label="按钮文字">
26
+ <el-input v-model="model.label" class="all-width" clearable></el-input>
27
+ </el-form-item>
28
+ <el-form-item label="按钮类型">
29
+ <el-select v-model="model.type" class="all-width" clearable>
30
+ <el-option
31
+ v-for="item in typeOptions"
32
+ :key="item"
33
+ :label="item"
34
+ :value="item"
35
+ />
36
+ </el-select>
37
+ </el-form-item>
38
+ <el-form-item label="朴素按钮(plain)">
39
+ <el-switch v-model="model.plain"></el-switch>
40
+ </el-form-item>
41
+ <el-form-item label="图标(icon)">
42
+ <el-input
43
+ v-model="model.icon"
44
+ class="all-width"
45
+ placeholder="如 el-icon-check"
46
+ clearable
47
+ ></el-input>
48
+ </el-form-item>
49
+ <el-form-item label="权限唯一名称">
50
+ <el-input
51
+ v-model="model.authName"
52
+ class="all-width"
53
+ placeholder="留空则不校验权限(默认放行)"
54
+ clearable
55
+ >
56
+ <el-tooltip
57
+ slot="suffix"
58
+ :enterable="false"
59
+ effect="dark"
60
+ content="随机生成"
61
+ placement="top"
62
+ >
63
+ <i
64
+ class="el-input__icon el-icon-refresh-right"
65
+ @click="createRandomAuthName"
66
+ ></i>
67
+ </el-tooltip>
68
+ </el-input>
69
+ </el-form-item>
70
+ <el-form-item label="权限编码" v-if="authCode">
71
+ <div class="auth-code-text">
72
+ <el-tooltip effect="light" content="复制">
73
+ <a
74
+ class="a-link"
75
+ style="color: unset"
76
+ @click="copyAuthCode(authCode, $event)"
77
+ >
78
+ <span
79
+ ><i
80
+ class="el-icon-copy-document"
81
+ style="margin-right: 2px"
82
+ ></i
83
+ >{{ authCode }}</span
84
+ >
85
+ </a>
86
+ </el-tooltip>
87
+ </div>
88
+ </el-form-item>
89
+ <el-form-item label="点击前校验表单">
90
+ <el-switch v-model="model.needValidate"></el-switch>
91
+ </el-form-item>
92
+ <el-form-item label="执行成功后关闭">
93
+ <el-switch v-model="model.closeAfter"></el-switch>
94
+ </el-form-item>
95
+ <el-form-item label="显隐条件脚本">
96
+ <a
97
+ href="javascript:void(0);"
98
+ class="a-link link-oneLind"
99
+ @click="editButtonScript('visible', visibleParams)"
100
+ >
101
+ <span>{{ model.visible }}</span>
102
+ <i class="el-icon-edit"></i>
103
+ </a>
104
+ </el-form-item>
105
+ <el-form-item label="点击事件脚本">
106
+ <a
107
+ href="javascript:void(0);"
108
+ class="a-link link-oneLind"
109
+ @click="editButtonScript('onClick', clickParams)"
110
+ >
111
+ <span>{{ model.onClick }}</span>
112
+ <i class="el-icon-edit"></i>
113
+ </a>
114
+ </el-form-item>
115
+ </el-form>
116
+ </div>
117
+ <div slot="footer" class="dialog-footer">
118
+ <el-button class="button-sty" icon="el-icon-close" @click="handleClose">
119
+ {{ i18nt("designer.hint.cancel") }}
120
+ </el-button>
121
+ <el-button
122
+ type="primary"
123
+ class="button-sty"
124
+ icon="el-icon-check"
125
+ @click="handleConfirm"
126
+ >
127
+ {{ i18nt("designer.hint.confirm") }}
128
+ </el-button>
129
+ </div>
130
+ </el-dialog>
131
+ </template>
132
+
133
+ <script>
134
+ import i18n from "../../../../components/xform/utils/i18n";
135
+ import eventMixin from "./property-editor/event-handler/eventMixin";
136
+ import { generateId } from "../../../../components/xform/utils/util";
137
+ import Clipboard from "clipboard";
138
+
139
+ export default {
140
+ name: "action-button-config-dialog",
141
+ mixins: [i18n, eventMixin],
142
+ props: {
143
+ visible: {
144
+ type: Boolean,
145
+ default: false,
146
+ },
147
+ // 编辑中的按钮对象(父级传克隆副本,确认时整体回传)
148
+ button: {
149
+ type: Object,
150
+ required: true,
151
+ },
152
+ formCode: {
153
+ type: String,
154
+ default: "",
155
+ },
156
+ },
157
+ data() {
158
+ return {
159
+ // 本地编辑副本:不直改 prop,确认时整体回传
160
+ model: { ...this.button },
161
+ typeOptions: ["primary", "success", "warning", "danger", "info", "text"],
162
+ // 脚本注入参数与 actionButtons.js 执行时一致
163
+ clickParams: ["formData", "dialog", "done", "selection"],
164
+ visibleParams: ["button"],
165
+ };
166
+ },
167
+ computed: {
168
+ dialogVisible: {
169
+ get() {
170
+ return this.visible;
171
+ },
172
+ set(val) {
173
+ this.$emit("update:visible", val);
174
+ },
175
+ },
176
+ authCode() {
177
+ if (!this.model.authName || !this.formCode) {
178
+ return "";
179
+ }
180
+ return this.formCode + ":" + this.model.authName;
181
+ },
182
+ },
183
+ methods: {
184
+ createRandomAuthName() {
185
+ this.$set(this.model, "authName", "actionBtn" + generateId());
186
+ this.$message.success("生成成功");
187
+ },
188
+ editButtonScript(field, params) {
189
+ this.editEventHandler(field, params, {
190
+ customCode: () => this.model[field] || "",
191
+ callback: (code) => {
192
+ this.$set(this.model, field, code);
193
+ },
194
+ });
195
+ },
196
+ copyAuthCode(content, clickEvent) {
197
+ const clipboard = new Clipboard(clickEvent.target, {
198
+ text: () => content,
199
+ });
200
+ clipboard.on("success", () => {
201
+ this.$message.success("复制成功");
202
+ clipboard.destroy();
203
+ });
204
+ clipboard.on("error", () => {
205
+ this.$message.error("复制失败");
206
+ clipboard.destroy();
207
+ });
208
+ clipboard.onClick(clickEvent);
209
+ },
210
+ handleClose() {
211
+ this.dialogVisible = false;
212
+ },
213
+ handleConfirm() {
214
+ if (!this.model.code) {
215
+ this.$message.error("按钮标识(code)不能为空");
216
+ return;
217
+ }
218
+ this.$emit("confirm", { ...this.model });
219
+ this.dialogVisible = false;
220
+ },
221
+ },
222
+ };
223
+ </script>
224
+
225
+ <style scoped lang="scss">
226
+ .action-button-config-form {
227
+ ::v-deep .el-form-item {
228
+ margin-bottom: 12px;
229
+ }
230
+ ::v-deep .el-form-item__label {
231
+ line-height: 28px;
232
+ }
233
+ ::v-deep .el-form-item__content {
234
+ line-height: 28px;
235
+ }
236
+ .auth-code-text {
237
+ word-break: break-all;
238
+ line-height: 1.5;
239
+ }
240
+ }
241
+ </style>
@@ -139,6 +139,55 @@
139
139
  </span>
140
140
  </el-form-item>
141
141
  </el-collapse-item>
142
+ <el-collapse-item name="actionButtons" title="操作按钮">
143
+ <!-- formDialog/formDrawer 按 formCode 打开时的底部按钮(formConfig.actionButtons),
144
+ 未配置则回退默认取消/确定;权限编码 = formCode:authName(禁用清单机制,默认放行) -->
145
+ <el-form-item label-width="0">
146
+ <draggable
147
+ tag="ul"
148
+ class="draggable-box"
149
+ v-if="actionButtons.length"
150
+ :list="actionButtons"
151
+ v-bind="{ group: 'actionBtnGroup', ghostClass: 'ghost', handle: '.drag-option' }"
152
+ >
153
+ <li
154
+ v-for="(btn, btnIdx) in actionButtons"
155
+ :key="btnIdx"
156
+ class="col-item action-button-item"
157
+ >
158
+ <i class="el-icon-s-operation drag-option"></i>
159
+ <span class="action-button-label">{{
160
+ btn.label || btn.code
161
+ }}</span>
162
+ <el-button
163
+ circle
164
+ plain
165
+ size="mini"
166
+ icon="el-icon-edit"
167
+ @click="editActionButton(btnIdx)"
168
+ ></el-button>
169
+ <el-button
170
+ circle
171
+ plain
172
+ size="mini"
173
+ type="danger"
174
+ icon="el-icon-minus"
175
+ @click="removeActionButton(btnIdx)"
176
+ ></el-button>
177
+ </li>
178
+ </draggable>
179
+ <div>
180
+ <el-button
181
+ type="text"
182
+ icon="el-icon-circle-plus-outline"
183
+ class="add-option"
184
+ @click="addActionButton"
185
+ >
186
+ {{ i18nt("添加按钮") }}
187
+ </el-button>
188
+ </div>
189
+ </el-form-item>
190
+ </el-collapse-item>
142
191
  <el-collapse-item name="3" title="流程信息">
143
192
  <el-form-item :label="i18nt('启用流程')">
144
193
  <el-switch
@@ -955,6 +1004,14 @@
955
1004
  @confirm="confirmBdCompanyEnvDialog2"
956
1005
  :multi="false"
957
1006
  />
1007
+
1008
+ <actionButtonConfigDialog
1009
+ v-if="showActionButtonDialog && currentActionButton"
1010
+ :visible.sync="showActionButtonDialog"
1011
+ :button="currentActionButton"
1012
+ :form-code="currentFormCode"
1013
+ @confirm="confirmActionButton"
1014
+ />
958
1015
  </div>
959
1016
  </template>
960
1017
 
@@ -970,6 +1027,7 @@ import wfObjConfigDialog from "./wfObjConfigDialog.vue";
970
1027
  import bdCompanyEnvDialog from "@base/views/bd/setting/bd_company_env/dialog";
971
1028
  import Draggable from "vuedraggable";
972
1029
  import formDynamicFieldSetting from "./form-dynamicField-setting.vue";
1030
+ import actionButtonConfigDialog from "./action-button-config-dialog.vue";
973
1031
 
974
1032
  export default {
975
1033
  name: "form-setting",
@@ -980,6 +1038,7 @@ export default {
980
1038
  bdCompanyEnvDialog,
981
1039
  Draggable,
982
1040
  formDynamicFieldSetting,
1041
+ actionButtonConfigDialog,
983
1042
  },
984
1043
  props: {
985
1044
  designer: Object,
@@ -1056,6 +1115,10 @@ export default {
1056
1115
  showBdCompanyEnvDialog1: false,
1057
1116
  showBdCompanyEnvDialog2: false,
1058
1117
 
1118
+ showActionButtonDialog: false,
1119
+ currentActionButton: null,
1120
+ currentActionButtonIndex: -1,
1121
+
1059
1122
  globalConfigParams: ["dataId", "formCode"],
1060
1123
 
1061
1124
  tip1: `流程主题表达式设置说明。
@@ -1104,6 +1167,19 @@ $\{wf.starterName\}提交的$\{pm_product_project.product_code\}$\{pm_product_pr
1104
1167
  this.designer.emitEvent("form-css-updated", deepClone(this.cssClassList));
1105
1168
  });
1106
1169
  },
1170
+ computed: {
1171
+ // formDialog/formDrawer 底部操作按钮配置(存 formConfig,随模板保存)
1172
+ actionButtons() {
1173
+ return this.formConfig.actionButtons || [];
1174
+ },
1175
+ currentFormCode() {
1176
+ const reportTemplate =
1177
+ this.designer && this.designer.vueInstance
1178
+ ? this.designer.vueInstance.reportTemplate
1179
+ : null;
1180
+ return (reportTemplate && reportTemplate.formCode) || "";
1181
+ },
1182
+ },
1107
1183
  mounted() {
1108
1184
  /* SettingPanel和FormWidget为兄弟组件, 在FormWidget加载formConfig时,
1109
1185
  此处SettingPanel可能无法获取到formConfig.cssCode, 故加个延时函数! */
@@ -1116,6 +1192,46 @@ $\{wf.starterName\}提交的$\{pm_product_project.product_code\}$\{pm_product_pr
1116
1192
  this.getListByObjTypeCode();
1117
1193
  },
1118
1194
  methods: {
1195
+ ensureActionButtons() {
1196
+ if (!Array.isArray(this.formConfig.actionButtons)) {
1197
+ this.$set(this.formConfig, "actionButtons", []);
1198
+ }
1199
+ return this.formConfig.actionButtons;
1200
+ },
1201
+ addActionButton() {
1202
+ this.currentActionButtonIndex = -1;
1203
+ this.currentActionButton = {
1204
+ code: "",
1205
+ label: "",
1206
+ type: "primary",
1207
+ plain: false,
1208
+ icon: "",
1209
+ authName: "",
1210
+ needValidate: false,
1211
+ closeAfter: true,
1212
+ visible: "",
1213
+ onClick: "",
1214
+ };
1215
+ this.showActionButtonDialog = true;
1216
+ },
1217
+ editActionButton(index) {
1218
+ this.currentActionButtonIndex = index;
1219
+ this.currentActionButton = deepClone(this.formConfig.actionButtons[index]);
1220
+ this.showActionButtonDialog = true;
1221
+ },
1222
+ removeActionButton(index) {
1223
+ this.formConfig.actionButtons.splice(index, 1);
1224
+ },
1225
+ confirmActionButton(btn) {
1226
+ const list = this.ensureActionButtons();
1227
+ if (this.currentActionButtonIndex > -1) {
1228
+ this.$set(list, this.currentActionButtonIndex, btn);
1229
+ } else {
1230
+ list.push(btn);
1231
+ }
1232
+ this.currentActionButton = null;
1233
+ this.currentActionButtonIndex = -1;
1234
+ },
1119
1235
  showEventCollapse() {
1120
1236
  if (this.designerConfig["eventCollapse"] === undefined) {
1121
1237
  return true;
@@ -6,6 +6,12 @@
6
6
  <el-form-item :label="i18nt('隐藏导航')">
7
7
  <el-switch v-model="optionModel.hideNav"></el-switch>
8
8
  </el-form-item>
9
+ <el-form-item :label="i18nt('隐藏标题栏')">
10
+ <el-switch v-model="optionModel.hideHeader"></el-switch>
11
+ <span style="margin-left: 8px; color: #999; font-size: 12px">
12
+ 整条标题栏不渲染(含标题、翻单/流程按钮及拖入的按钮控件)
13
+ </span>
14
+ </el-form-item>
9
15
  <el-form-item :label="i18nt('designer.setting.colsOfGrid')"></el-form-item>
10
16
  <el-form-item label-width="0">
11
17
  <draggable tag="ul" class="draggable-box" :list="selectedWidget.panes"
@@ -445,6 +445,7 @@ export const containers = [
445
445
  label: "单据详情",
446
446
  detailContainer: true,
447
447
  hideNav: false,
448
+ hideHeader: false,
448
449
  // colHeight: null,
449
450
  customClass: "",
450
451
  wfEnabled: false,