cloud-web-corejs 1.0.258 → 1.0.259

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 (248) hide show
  1. package/package.json +32 -25
  2. package/src/components/VabUpload/fileLibraryDialog.vue +296 -0
  3. package/src/components/VabUpload/index.js +22 -2
  4. package/src/components/VabUpload/index.vue +242 -231
  5. package/src/components/VabUpload/mixins/fileLibraryDialog.js +1112 -0
  6. package/src/components/VabUpload/mixins.js +1971 -1829
  7. package/src/components/VabUpload/privateProfileDialog.vue +2 -2
  8. package/src/components/baseArea/index.vue +1628 -0
  9. package/src/components/baseInputExport/mixins.js +48 -31
  10. package/src/components/baseInputNumber/index.vue +9 -9
  11. package/src/components/baseTabs/index.vue +16 -8
  12. package/src/components/code-editor/async.js +29 -0
  13. package/src/components/code-editor/index.vue +93 -4
  14. package/src/components/errorMsg/index.js +10 -9
  15. package/src/components/errorMsg/mixins.js +25 -23
  16. package/src/components/excelExport/exportFieldDialog.vue +40 -18
  17. package/src/components/excelExport/index.js +62 -3
  18. package/src/components/excelExport/index.vue +2 -1
  19. package/src/components/excelExport/mixins.js +496 -340
  20. package/src/components/excelImport/index.js +69 -7
  21. package/src/components/excelImport/mixins.js +841 -9
  22. package/src/components/fileLibrary/categoryMoveDialog.vue +109 -109
  23. package/src/components/fileLibrary/fileHistoryDialog.vue +1 -1
  24. package/src/components/fileLibrary/fileObjAuthDialog.vue +297 -298
  25. package/src/components/fileLibrary/fileObjAuthEdit.vue +1 -1
  26. package/src/components/fileLibrary/filterDialog.vue +1 -1
  27. package/src/components/fileLibrary/index.vue +1109 -1110
  28. package/src/components/fileLibrary/mixins/indexMixins.js +10 -0
  29. package/src/components/fileLibrary/propertiesDialog.vue +190 -190
  30. package/src/components/fileLibrary/recycleBinDialog.vue +237 -236
  31. package/src/components/formOplog/mixins.js +85 -80
  32. package/src/components/hiprint/view/design/index.vue +7 -2
  33. package/src/components/jsonImport/exportUtil.js +106 -0
  34. package/src/components/jsonImport/index.js +75 -50
  35. package/src/components/jsonImport/mixins.js +350 -348
  36. package/src/components/langImport/mixins.js +502 -500
  37. package/src/components/micro-view-host/contract.js +66 -0
  38. package/src/components/micro-view-host/index.vue +148 -0
  39. package/src/components/mobile/file/index.vue +10 -0
  40. package/src/components/mobile/wf/mixins/wfModifyDialogMixin.js +51 -47
  41. package/src/components/obsUpload/index.vue +234 -231
  42. package/src/components/obsUpload/mixins.js +1542 -1476
  43. package/src/components/onlineTalk/talkUserDialog.vue +1 -1
  44. package/src/components/table/CellSlot.vue +12 -10
  45. package/src/components/table/config.js +74 -1
  46. package/src/components/table/index.js +1208 -1
  47. package/src/components/table/tableFormMixin.js +285 -1
  48. package/src/components/table/util/index.js +38 -40
  49. package/src/components/table/vxeFilter/index.js +153 -2
  50. package/src/components/table/vxeFilter/mixin.js +305 -3
  51. package/src/components/tempStorage/tempStorageDialog.vue +1 -1
  52. package/src/components/vb-tabs/x-tabs.vue +10 -5
  53. package/src/components/wf/addTaskUserdialog.vue +1 -1
  54. package/src/components/wf/mixins/setCandidateDialog.js +217 -217
  55. package/src/components/wf/mixins/setCandidateDialog2.js +252 -252
  56. package/src/components/wf/wf.js +2224 -2203
  57. package/src/components/wf/wfUtil.js +2 -1
  58. 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" +173 -0
  59. package/src/components/xform/form-designer/designer.js +1 -0
  60. package/src/components/xform/form-designer/form-widget/container-widget/containerMixin.js +110 -1
  61. package/src/components/xform/form-designer/form-widget/container-widget/data-table-mixin.js +282 -1
  62. package/src/components/xform/form-designer/form-widget/field-widget/area-select-widget.vue +272 -0
  63. package/src/components/xform/form-designer/form-widget/field-widget/autocomplete-widget.vue +119 -0
  64. package/src/components/xform/form-designer/form-widget/field-widget/fieldMixin.js +14 -0
  65. package/src/components/xform/form-designer/form-widget/field-widget/form-item-wrapper.vue +18 -73
  66. package/src/components/xform/form-designer/form-widget/field-widget/mixins/autocomplete-mixin.js +451 -0
  67. package/src/components/xform/form-designer/form-widget/field-widget/mixins/date-limit-mixin.js +157 -0
  68. package/src/components/xform/form-designer/form-widget/field-widget/mixins/utc-transform-mixin.js +75 -0
  69. package/src/components/xform/form-designer/form-widget/field-widget/save_submit_wf_button-widget.vue +112 -0
  70. package/src/components/xform/form-designer/form-widget/field-widget/script-input-widget.vue +149 -0
  71. package/src/components/xform/form-designer/form-widget/indexMixin.js +179 -1
  72. package/src/components/xform/form-designer/indexMixin.js +823 -1
  73. package/src/components/xform/form-designer/refMixinDesign.js +27 -1
  74. package/src/components/xform/form-designer/setting-panel/action-button-config-dialog.vue +241 -0
  75. package/src/components/xform/form-designer/setting-panel/form-dynamicField-setting.vue +601 -0
  76. package/src/components/xform/form-designer/setting-panel/form-setting.vue +6 -0
  77. package/src/components/xform/form-designer/setting-panel/index.vue +314 -309
  78. package/src/components/xform/form-designer/setting-panel/indexMixin.js +324 -1
  79. package/src/components/xform/form-designer/setting-panel/property-editor/container-data-table/data-table-editor.vue +8 -7
  80. package/src/components/xform/form-designer/setting-panel/property-editor/container-list-h5/list-h5-editor.vue +8 -7
  81. package/src/components/xform/form-designer/setting-panel/property-editor/container-table/table-dynamicField-editor.vue +344 -0
  82. package/src/components/xform/form-designer/setting-panel/property-editor/dropdownFlag-editor.vue +2 -2
  83. package/src/components/xform/form-designer/setting-panel/property-editor/field-area-select/areaDataType-editor.vue +25 -0
  84. package/src/components/xform/form-designer/setting-panel/property-editor/field-area-select/areaMinLevel-editor.vue +50 -0
  85. package/src/components/xform/form-designer/setting-panel/property-editor/field-area-select/areaName-editor.vue +20 -0
  86. package/src/components/xform/form-designer/setting-panel/property-editor/field-autocomplete/autocomplete-vabSearchName-editor.vue +199 -0
  87. package/src/components/xform/form-designer/setting-panel/property-editor/field-baseAttachment/baseAttachment-fileTypes-editor.vue +23 -0
  88. package/src/components/xform/form-designer/setting-panel/property-editor/field-cascader/showAllLevels-editor.vue +21 -0
  89. package/src/components/xform/form-designer/setting-panel/property-editor/field-date/date-dateLimit-editor.vue +157 -0
  90. package/src/components/xform/form-designer/setting-panel/property-editor/field-script-input/script-input-editor.vue +55 -0
  91. package/src/components/xform/form-designer/setting-panel/property-editor/field-vabUpload/vabUpload-fileTypes-editor.vue +23 -0
  92. package/src/components/xform/form-designer/setting-panel/property-editor/fileTypesEditorMixin.js +116 -0
  93. package/src/components/xform/form-designer/setting-panel/property-editor/fileTypesSelect.vue +176 -0
  94. package/src/components/xform/form-designer/setting-panel/property-editor/textFlag-editor.vue +3 -3
  95. package/src/components/xform/form-designer/setting-panel/property-editor/utcTransformEnabled-editor.vue +19 -0
  96. package/src/components/xform/form-designer/setting-panel/widgetPropertyDialogMixin.js +186 -0
  97. package/src/components/xform/form-designer/toolbar-panel/indexMixin.js +566 -1
  98. package/src/components/xform/form-designer/widget-panel/indexMixin.js +290 -1
  99. package/src/components/xform/form-render/compareDelList.vue +83 -0
  100. package/src/components/xform/form-render/compareView.vue +76 -0
  101. package/src/components/xform/form-render/container-item/containerItemMixin.js +378 -1
  102. package/src/components/xform/form-render/container-item/data-table-mixin.js +35 -0
  103. package/src/components/xform/form-render/container-item/detail-item.vue +41 -0
  104. package/src/components/xform/form-render/container-item/dynamicFieldEngine.js +285 -0
  105. package/src/components/xform/form-render/container-item/dynamicFieldMixin.js +416 -0
  106. package/src/components/xform/form-render/container-item/list-h5-item.vue +12 -0
  107. package/src/components/xform/form-render/dynamicDialogRender.js +195 -1
  108. package/src/components/xform/form-render/dynamicDrawerRender.js +229 -0
  109. package/src/components/xform/form-render/formDynamicFieldMixin.js +131 -0
  110. package/src/components/xform/form-render/refMixin.js +29 -1
  111. package/src/components/xform/mixins/scriptHttp.js +172 -1
  112. package/src/components/xform/utils/dynamicSchemaUtil.js +361 -0
  113. package/src/components/xform/utils/tableCellValidateUtil.js +148 -0
  114. package/src/components/xform/utils/textMaskUtil.js +179 -0
  115. package/src/components/xform/utils/treeTableUtil.js +1265 -0
  116. package/src/components/xform/utils/util.js +1 -0
  117. package/src/components/xform/utils/validators.js +133 -1
  118. package/src/directive/LimitNumber/index.js +143 -124
  119. package/src/microRouter/index.js +447 -0
  120. package/src/mixins/tableTree/index.js +77 -14
  121. package/src/permission.js +132 -107
  122. package/src/public-path.js +38 -0
  123. package/src/router/index.js +3 -3
  124. package/src/store/modules/micro.js +57 -0
  125. package/src/store/modules/permission.js +535 -371
  126. package/src/store/modules/tagsView.js +38 -21
  127. package/src/store/modules/user.js +409 -370
  128. package/src/utils/aes.js +9 -3
  129. package/src/utils/auth.js +1 -1
  130. package/src/utils/componentDialog.js +162 -40
  131. package/src/utils/global.js +35 -34
  132. package/src/utils/index.js +579 -579
  133. package/src/utils/keepAlive.js +8 -4
  134. package/src/utils/lazyPlugin.js +66 -0
  135. package/src/utils/menuAdapter.js +277 -0
  136. package/src/utils/repeatOpen.js +48 -0
  137. package/src/utils/request.js +417 -395
  138. package/src/utils/resolveViewComponent.js +203 -0
  139. package/src/utils/vab.js +14 -3
  140. package/src/utils/validate.js +104 -106
  141. package/src/views/bd/setting/bd_attach_setting/dialog.vue +1 -1
  142. package/src/views/bd/setting/bd_attach_setting/list.vue +1 -1
  143. package/src/views/bd/setting/bd_company_env/dialog.vue +1 -1
  144. package/src/views/bd/setting/bd_company_env/list.vue +1 -1
  145. package/src/views/bd/setting/formVersion/ftHistoryDialog.vue +488 -489
  146. package/src/views/bd/setting/form_import_log/list.vue +1 -1
  147. package/src/views/bd/setting/form_script/dialog.vue +1 -1
  148. package/src/views/bd/setting/form_script/form_list.vue +174 -166
  149. package/src/views/bd/setting/form_script/list.vue +1 -1
  150. package/src/views/bd/setting/form_script/list1.vue +1 -1
  151. package/src/views/bd/setting/form_script/mixins/form_list.js +330 -322
  152. package/src/views/bd/setting/form_template/dialog.vue +1 -1
  153. package/src/views/bd/setting/form_template/formDesignerDialog.vue +172 -171
  154. package/src/views/bd/setting/form_template/ftHistoryDialog.vue +1 -1
  155. package/src/views/bd/setting/form_template/itemList.vue +1 -1
  156. package/src/views/bd/setting/form_template/list.vue +3 -3
  157. package/src/views/bd/setting/form_template/mixins/edit.js +3 -3
  158. package/src/views/bd/setting/form_template/mixins/list.js +3 -3
  159. package/src/views/bd/setting/form_template/mixins/list2.js +3 -3
  160. package/src/views/bd/setting/form_template/mixins/wf_list.js +3 -3
  161. package/src/views/bd/setting/form_template/wfObjConfigDialog.vue +253 -254
  162. package/src/views/bd/setting/form_template/wf_list.vue +3 -3
  163. package/src/views/bd/setting/logic_param/edit.vue +20 -20
  164. package/src/views/bd/setting/logic_param/list.vue +1 -1
  165. package/src/views/bd/setting/menu_kind/dialog.vue +1 -1
  166. package/src/views/bd/setting/menu_kind/list.vue +1 -1
  167. package/src/views/bd/setting/push_data/list.vue +1 -1
  168. package/src/views/bd/setting/push_data_h/list.vue +1 -1
  169. package/src/views/bd/setting/request_async_setting/list.vue +1 -1
  170. package/src/views/bd/setting/request_setting/list.vue +1 -1
  171. package/src/views/bd/setting/table_model/dialog.vue +1 -1
  172. package/src/views/bd/setting/table_model/list.vue +1 -1
  173. package/src/views/bd/setting/table_model/zdDialog.vue +1 -1
  174. package/src/views/user/access_log/list.vue +1 -1
  175. package/src/views/user/access_log/list2.vue +1 -1
  176. package/src/views/user/api_request/list.vue +1 -1
  177. package/src/views/user/area/dialog.vue +1 -1
  178. package/src/views/user/area/list.vue +1 -1
  179. package/src/views/user/bill_setting/list.vue +1 -1
  180. package/src/views/user/bill_setting/userDialog.vue +1 -1
  181. package/src/views/user/code_rules/list.vue +1 -1
  182. package/src/views/user/commMenu/index.vue +2 -2
  183. package/src/views/user/common_attribute/list.vue +2 -2
  184. package/src/views/user/common_script/list.vue +1 -1
  185. package/src/views/user/company_info/dialog.vue +1 -1
  186. package/src/views/user/country/dialog.vue +1 -1
  187. package/src/views/user/country/list.vue +1 -1
  188. package/src/views/user/data_type_setting/dialog.vue +1 -1
  189. package/src/views/user/extend_datasource/dialog.vue +4 -1
  190. package/src/views/user/extend_datasource/edit.vue +2 -1
  191. package/src/views/user/extend_datasource/list.vue +4 -1
  192. package/src/views/user/fieldTranslation/list.vue +1 -1
  193. package/src/views/user/field_values_invisible/list.vue +1 -1
  194. package/src/views/user/file_type/list.vue +1 -1
  195. package/src/views/user/file_view_area/list.vue +1 -1
  196. package/src/views/user/file_view_ins/list.vue +22 -1
  197. package/src/views/user/form/view/list.vue +64 -1
  198. package/src/views/user/groups/dialog.vue +1 -1
  199. package/src/views/user/groups/list.vue +1 -1
  200. package/src/views/user/home/default.vue +2 -2
  201. package/src/views/user/home/default2.vue +1158 -1148
  202. package/src/views/user/home/index.vue +3 -10
  203. package/src/views/user/lang_tag/dialog.vue +1 -1
  204. package/src/views/user/lang_tag/list.vue +1 -1
  205. package/src/views/user/language_setting/list.vue +1 -1
  206. package/src/views/user/login/default.vue +0 -8
  207. package/src/views/user/login/indexMixin.js +547 -556
  208. package/src/views/user/menu/list.vue +25 -2
  209. package/src/views/user/menuFallback/index.vue +123 -0
  210. package/src/views/user/mobile_menu/list.vue +1 -1
  211. package/src/views/user/notify_message/dialog.vue +22 -1
  212. package/src/views/user/notify_message/list.vue +1 -1
  213. package/src/views/user/notify_template/list.vue +1 -1
  214. package/src/views/user/notify_template/list2.vue +1 -1
  215. package/src/views/user/oplog/list.vue +1 -1
  216. package/src/views/user/outLink/form_view.vue +5 -14
  217. package/src/views/user/outLink/index.vue +6 -1
  218. package/src/views/user/outLink/view.vue +5 -13
  219. package/src/views/user/position/dialog.vue +1 -1
  220. package/src/views/user/position/list.vue +1 -1
  221. package/src/views/user/project_tag/dialog.vue +1 -1
  222. package/src/views/user/project_tag/list.vue +1 -1
  223. package/src/views/user/push_setting/list.vue +1 -1
  224. package/src/views/user/request_setting/list.vue +1 -1
  225. package/src/views/user/role/dialog.vue +1 -1
  226. package/src/views/user/role/list.vue +1 -1
  227. package/src/views/user/sale_org/dialog.vue +1 -1
  228. package/src/views/user/sale_org/list.vue +1 -1
  229. package/src/views/user/system_notice/list.vue +1 -1
  230. package/src/views/user/system_parameter/list.vue +1 -1
  231. package/src/views/user/user/dialog.vue +1 -1
  232. package/src/views/user/user/edit.vue +306 -159
  233. package/src/views/user/user/form_dialog.vue +1 -1
  234. package/src/views/user/user/form_list.vue +1 -1
  235. package/src/views/user/user/list.vue +2 -2
  236. package/src/views/user/user_log_classify/list.vue +1 -1
  237. package/src/views/user/wf/iframe/index.vue +6 -1
  238. package/src/views/user/wf/iframe/index2.vue +6 -1
  239. package/src/views/user/wf/wfReport/index.vue +12 -6
  240. package/src/views/user/wf/wf_auto_submit_data/list.vue +2 -2
  241. package/src/views/user/wf/wf_manage/list.vue +97 -24
  242. package/src/views/user/wf/wf_manage/list2.vue +875 -0
  243. package/src/views/user/wf/wf_manage/wfContentDialog.vue +23 -1
  244. package/src/views/user/wf/wf_obj_config/dialog.vue +1 -1
  245. package/src/views/user/wf/wf_obj_config/list.vue +1 -1
  246. package/src/views/user/wf/wf_obj_config/list_form.vue +1 -1
  247. package/src/views/user/wf/wf_transfer_setting/list.vue +1 -1
  248. package/src/views/user/workbench_menu/list.vue +1 -1
@@ -0,0 +1,601 @@
1
+ <template>
2
+ <div class="form-dynamic-field-setting">
3
+ <el-form-item label="启用动态字段">
4
+ <el-switch v-model="formConfig.dynamicFieldEnabled"></el-switch>
5
+ <div class="tip-text">
6
+ 根据表单数据/后台脚本动态控制整个表单内任意字段、容器的显隐等状态
7
+ </div>
8
+ </el-form-item>
9
+
10
+ <template v-if="formConfig.dynamicFieldEnabled">
11
+ <el-form-item label="数据来源">
12
+ <el-radio-group v-model="formConfig.dynamicFieldSourceType" size="mini">
13
+ <el-radio-button label="local">本地规则</el-radio-button>
14
+ <el-radio-button label="script">后台脚本</el-radio-button>
15
+ </el-radio-group>
16
+ </el-form-item>
17
+
18
+ <template v-if="formConfig.dynamicFieldSourceType === 'local'">
19
+ <el-form-item label="字段规则">
20
+ <el-button
21
+ type="primary"
22
+ plain
23
+ size="mini"
24
+ icon="el-icon-setting"
25
+ @click="openRuleDialog"
26
+ >
27
+ 配置规则({{ (formConfig.dynamicFieldRules || []).length }})
28
+ </el-button>
29
+ </el-form-item>
30
+ </template>
31
+
32
+ <template v-if="formConfig.dynamicFieldSourceType === 'script'">
33
+ <el-form-item label="脚本编码">
34
+ <el-input
35
+ v-model="formConfig.dynamicFieldScriptCode"
36
+ size="mini"
37
+ placeholder="scriptCode 或 formCode/scriptCode"
38
+ ></el-input>
39
+ </el-form-item>
40
+ <el-form-item label="额外参数">
41
+ <a
42
+ href="javascript:void(0);"
43
+ class="a-link link-oneLind"
44
+ @click="editDynamicFieldScriptParam"
45
+ >
46
+ <span>{{ formConfig.dynamicFieldScriptParam }}</span>
47
+ <i class="el-icon-edit"></i>
48
+ </a>
49
+ <div class="tip-text">
50
+ 格式: return { stage:
51
+ formModel.status }
52
+ </div>
53
+ </el-form-item>
54
+ <el-form-item label="触发字段">
55
+ <el-select
56
+ v-model="formConfig.dynamicFieldTriggerFields"
57
+ multiple
58
+ filterable
59
+ size="mini"
60
+ style="width: 100%"
61
+ placeholder="字段值变化时重新请求后台"
62
+ >
63
+ <el-option
64
+ v-for="(n, idx) in treeOptions"
65
+ :key="n.value + '#' + idx"
66
+ :value="n.value"
67
+ :label="optPlainLabel(n)"
68
+ :disabled="n.isContainer"
69
+ >
70
+ <span
71
+ :style="{ paddingLeft: n.depth * 14 + 'px' }"
72
+ :class="{ 'opt-container': n.isContainer }"
73
+ >
74
+ <span v-if="n.isContainer" class="opt-tag"
75
+ >[{{ containerTypeLabel(n.type) }}]</span
76
+ >{{ n.baseLabel }}
77
+ </span>
78
+ </el-option>
79
+ </el-select>
80
+ <div class="tip-text">为空时仅在初始化时请求一次后台脚本</div>
81
+ </el-form-item>
82
+ <div class="tip-text">
83
+ 后台返回 fieldStates 的 key
84
+ 可为字段名,也可为「命名容器」名以控制其显隐(容器仅 visible 生效)
85
+ </div>
86
+ </template>
87
+ </template>
88
+
89
+ <el-dialog
90
+ title="表单动态字段规则"
91
+ :visible.sync="ruleDialogVisible"
92
+ :append-to-body="true"
93
+ width="760px"
94
+ custom-class="dynamic-field-rule-dialog"
95
+ >
96
+ <div class="rule-list">
97
+ <div
98
+ v-for="(rule, rIdx) in editingRules"
99
+ :key="rule.id"
100
+ class="rule-card"
101
+ >
102
+ <div class="rule-card-header">
103
+ <span class="rule-title">规则 {{ rIdx + 1 }}</span>
104
+ <el-button
105
+ type="text"
106
+ icon="el-icon-delete"
107
+ class="danger-text"
108
+ @click="removeRule(rIdx)"
109
+ >
110
+ 删除规则
111
+ </el-button>
112
+ </div>
113
+
114
+ <div class="rule-section">
115
+ <div class="rule-section-title">
116
+ <span>当满足</span>
117
+ <el-radio-group v-model="rule.logic" size="mini">
118
+ <el-radio-button label="and">全部条件</el-radio-button>
119
+ <el-radio-button label="or">任一条件</el-radio-button>
120
+ </el-radio-group>
121
+ </div>
122
+ <div
123
+ v-for="(cond, cIdx) in rule.conditions"
124
+ :key="cIdx"
125
+ class="rule-row"
126
+ >
127
+ <el-select
128
+ v-model="cond.field"
129
+ filterable
130
+ size="mini"
131
+ placeholder="字段"
132
+ class="cell-field"
133
+ >
134
+ <el-option
135
+ v-for="(n, idx) in treeOptions"
136
+ :key="n.value + '#' + idx"
137
+ :value="n.value"
138
+ :label="optPlainLabel(n)"
139
+ :disabled="n.isContainer"
140
+ >
141
+ <span
142
+ :style="{ paddingLeft: n.depth * 14 + 'px' }"
143
+ :class="{ 'opt-container': n.isContainer }"
144
+ >
145
+ <span v-if="n.isContainer" class="opt-tag"
146
+ >[{{ containerTypeLabel(n.type) }}]</span
147
+ >{{ n.baseLabel }}
148
+ </span>
149
+ </el-option>
150
+ </el-select>
151
+ <el-select
152
+ v-model="cond.operator"
153
+ size="mini"
154
+ placeholder="操作符"
155
+ class="cell-op"
156
+ >
157
+ <el-option
158
+ v-for="op in operatorOptions"
159
+ :key="op.value"
160
+ :label="op.label"
161
+ :value="op.value"
162
+ ></el-option>
163
+ </el-select>
164
+ <el-input
165
+ v-model="cond.value"
166
+ size="mini"
167
+ placeholder="值"
168
+ class="cell-value"
169
+ :disabled="op_noValue(cond.operator)"
170
+ ></el-input>
171
+ <el-button
172
+ type="text"
173
+ icon="el-icon-remove-outline"
174
+ class="danger-text"
175
+ @click="removeCondition(rule, cIdx)"
176
+ ></el-button>
177
+ </div>
178
+ <el-button
179
+ type="text"
180
+ icon="el-icon-plus"
181
+ @click="addCondition(rule)"
182
+ >添加条件</el-button
183
+ >
184
+ </div>
185
+
186
+ <div class="rule-section">
187
+ <div class="rule-section-title"><span>则设置字段/容器</span></div>
188
+ <div
189
+ v-for="(t, tIdx) in rule.targets"
190
+ :key="tIdx"
191
+ class="rule-row target-row"
192
+ >
193
+ <el-select
194
+ v-model="t.field"
195
+ filterable
196
+ size="mini"
197
+ placeholder="目标字段/容器"
198
+ class="cell-field"
199
+ >
200
+ <el-option
201
+ v-for="(n, idx) in treeOptions"
202
+ :key="n.value + '#' + idx"
203
+ :value="n.value"
204
+ :label="optPlainLabel(n)"
205
+ :disabled="n.isContainer && !n.hasName"
206
+ >
207
+ <span
208
+ :style="{ paddingLeft: n.depth * 14 + 'px' }"
209
+ :class="{ 'opt-container': n.isContainer }"
210
+ >
211
+ <span v-if="n.isContainer" class="opt-tag"
212
+ >[{{ containerTypeLabel(n.type) }}]</span
213
+ >{{ n.baseLabel }}
214
+ </span>
215
+ </el-option>
216
+ </el-select>
217
+ <span class="target-attr">
218
+ <span class="attr-label">显示</span>
219
+ <el-select
220
+ v-model="t.visible"
221
+ size="mini"
222
+ class="cell-tri"
223
+ clearable
224
+ placeholder="不变"
225
+ >
226
+ <el-option label="显示" :value="true"></el-option>
227
+ <el-option label="隐藏" :value="false"></el-option>
228
+ </el-select>
229
+ </span>
230
+ <span class="target-attr">
231
+ <span class="attr-label">必填</span>
232
+ <el-select
233
+ v-model="t.required"
234
+ size="mini"
235
+ class="cell-tri"
236
+ clearable
237
+ placeholder="不变"
238
+ >
239
+ <el-option label="必填" :value="true"></el-option>
240
+ <el-option label="非必填" :value="false"></el-option>
241
+ </el-select>
242
+ </span>
243
+ <span class="target-attr">
244
+ <span class="attr-label">只读</span>
245
+ <el-select
246
+ v-model="t.readonly"
247
+ size="mini"
248
+ class="cell-tri"
249
+ clearable
250
+ placeholder="不变"
251
+ >
252
+ <el-option label="只读" :value="true"></el-option>
253
+ <el-option label="可编辑" :value="false"></el-option>
254
+ </el-select>
255
+ </span>
256
+ <span class="target-attr">
257
+ <span class="attr-label">禁用</span>
258
+ <el-select
259
+ v-model="t.disabled"
260
+ size="mini"
261
+ class="cell-tri"
262
+ clearable
263
+ placeholder="不变"
264
+ >
265
+ <el-option label="禁用" :value="true"></el-option>
266
+ <el-option label="启用" :value="false"></el-option>
267
+ </el-select>
268
+ </span>
269
+ <el-button
270
+ type="text"
271
+ icon="el-icon-remove-outline"
272
+ class="danger-text"
273
+ @click="removeTarget(rule, tIdx)"
274
+ ></el-button>
275
+ </div>
276
+ <el-button type="text" icon="el-icon-plus" @click="addTarget(rule)"
277
+ >添加目标字段</el-button
278
+ >
279
+ <div class="tip-text">
280
+ 目标为容器时仅「显示」生效,必填/只读/禁用将被忽略
281
+ </div>
282
+ </div>
283
+ </div>
284
+
285
+ <el-button
286
+ type="primary"
287
+ plain
288
+ icon="el-icon-plus"
289
+ size="mini"
290
+ @click="addRule"
291
+ style="width: 100%"
292
+ >
293
+ 添加规则
294
+ </el-button>
295
+ </div>
296
+
297
+ <div slot="footer">
298
+ <el-button size="mini" @click="ruleDialogVisible = false"
299
+ >取消</el-button
300
+ >
301
+ <el-button size="mini" type="primary" @click="saveRules"
302
+ >确定</el-button
303
+ >
304
+ </div>
305
+ </el-dialog>
306
+
307
+ <el-dialog
308
+ title="额外参数"
309
+ :visible.sync="scriptParamDialogVisible"
310
+ v-if="scriptParamDialogVisible"
311
+ :show-close="true"
312
+ custom-class="dialog-style list-dialog"
313
+ v-dialog-drag
314
+ :close-on-click-modal="false"
315
+ :close-on-press-escape="false"
316
+ :destroy-on-close="true"
317
+ :append-to-body="true"
318
+ :modal-append-to-body="true"
319
+ >
320
+ <div class="cont">
321
+ <code-editor
322
+ :mode="'javascript'"
323
+ :readonly="false"
324
+ v-model="editingScriptParam"
325
+ ref="scriptParamEditor"
326
+ ></code-editor>
327
+ </div>
328
+ <div slot="footer" class="dialog-footer">
329
+ <el-button
330
+ @click="scriptParamDialogVisible = false"
331
+ class="button-sty"
332
+ icon="el-icon-close"
333
+ >
334
+ {{ i18nt("designer.hint.cancel") }}
335
+ </el-button>
336
+ <el-button
337
+ type="primary"
338
+ @click="saveDynamicFieldScriptParam"
339
+ class="button-sty"
340
+ icon="el-icon-check"
341
+ >
342
+ {{ i18nt("designer.hint.confirm") }}
343
+ </el-button>
344
+ </div>
345
+ </el-dialog>
346
+ </div>
347
+ </template>
348
+
349
+ <script>
350
+ import i18n from "../../../../components/xform/utils/i18n";
351
+ import { buildWidgetTreeOptions } from "../../../../components/xform/form-render/container-item/dynamicFieldEngine";
352
+
353
+ const NO_VALUE_OPERATORS = ["empty", "notEmpty"];
354
+
355
+ export default {
356
+ name: "form-dynamicField-setting",
357
+ mixins: [i18n],
358
+ props: {
359
+ designer: Object,
360
+ formConfig: Object,
361
+ },
362
+ data() {
363
+ return {
364
+ ruleDialogVisible: false,
365
+ scriptParamDialogVisible: false,
366
+ editingScriptParam: "",
367
+ editingRules: [],
368
+ operatorOptions: [
369
+ { label: "等于", value: "eq" },
370
+ { label: "不等于", value: "ne" },
371
+ { label: "大于", value: "gt" },
372
+ { label: "小于", value: "lt" },
373
+ { label: "大于等于", value: "ge" },
374
+ { label: "小于等于", value: "le" },
375
+ { label: "属于(逗号分隔)", value: "in" },
376
+ { label: "不属于(逗号分隔)", value: "nin" },
377
+ { label: "包含", value: "includes" },
378
+ { label: "为空", value: "empty" },
379
+ { label: "不为空", value: "notEmpty" },
380
+ ],
381
+ };
382
+ },
383
+ computed: {
384
+ // 带层级的字段/容器候选(整个表单)
385
+ treeOptions() {
386
+ return buildWidgetTreeOptions(
387
+ (this.designer && this.designer.widgetList) || []
388
+ );
389
+ },
390
+ },
391
+ methods: {
392
+ op_noValue(operator) {
393
+ return NO_VALUE_OPERATORS.indexOf(operator) > -1;
394
+ },
395
+ // 选中态/过滤用的纯文本标签
396
+ optPlainLabel(n) {
397
+ if (n.isContainer) {
398
+ return "[" + this.containerTypeLabel(n.type) + "] " + n.baseLabel;
399
+ }
400
+ return n.baseLabel;
401
+ },
402
+ containerTypeLabel(type) {
403
+ const map = {
404
+ grid: "栅格",
405
+ table: "表格布局",
406
+ "h5-table": "H5表格",
407
+ tab: "标签页",
408
+ "tab-pane": "标签项",
409
+ card: "卡片",
410
+ "vf-box": "区块",
411
+ panel: "面板",
412
+ detail: "单据详情",
413
+ "detail-pane": "详情面板",
414
+ "detail-h5": "H5详情",
415
+ "h5-card": "H5卡片",
416
+ "h5-card-pane": "H5卡片面板",
417
+ "sub-form": "子表单",
418
+ "grid-sub-form": "网格子表单",
419
+ };
420
+ return map[type] || type;
421
+ },
422
+ genId() {
423
+ return "fdr_" + Date.now() + "_" + Math.floor(Math.random() * 10000);
424
+ },
425
+ editDynamicFieldScriptParam() {
426
+ this.editingScriptParam = this.formConfig.dynamicFieldScriptParam || "";
427
+ this.scriptParamDialogVisible = true;
428
+ },
429
+ saveDynamicFieldScriptParam() {
430
+ const codeHints = this.$refs.scriptParamEditor.getEditorAnnotations();
431
+ let syntaxErrorFlag = false;
432
+ if (codeHints && codeHints.length > 0) {
433
+ codeHints.forEach((chItem) => {
434
+ if (chItem.type === "error") {
435
+ syntaxErrorFlag = true;
436
+ }
437
+ });
438
+ if (syntaxErrorFlag) {
439
+ this.$message.error(
440
+ this.i18nt("designer.setting.syntaxCheckWarning")
441
+ );
442
+ return;
443
+ }
444
+ }
445
+ this.formConfig.dynamicFieldScriptParam = this.editingScriptParam;
446
+ this.scriptParamDialogVisible = false;
447
+ },
448
+ openRuleDialog() {
449
+ this.editingRules = JSON.parse(
450
+ JSON.stringify(this.formConfig.dynamicFieldRules || [])
451
+ );
452
+ this.editingRules.forEach((rule) => {
453
+ if (!rule.id) rule.id = this.genId();
454
+ if (!rule.logic) rule.logic = "and";
455
+ if (!rule.conditions) rule.conditions = [];
456
+ if (!rule.targets) rule.targets = [];
457
+ });
458
+ this.ruleDialogVisible = true;
459
+ },
460
+ addRule() {
461
+ this.editingRules.push({
462
+ id: this.genId(),
463
+ logic: "and",
464
+ conditions: [{ field: "", operator: "eq", value: "" }],
465
+ targets: [
466
+ {
467
+ field: "",
468
+ visible: undefined,
469
+ required: undefined,
470
+ readonly: undefined,
471
+ disabled: undefined,
472
+ },
473
+ ],
474
+ });
475
+ },
476
+ removeRule(idx) {
477
+ this.editingRules.splice(idx, 1);
478
+ },
479
+ addCondition(rule) {
480
+ rule.conditions.push({ field: "", operator: "eq", value: "" });
481
+ },
482
+ removeCondition(rule, idx) {
483
+ rule.conditions.splice(idx, 1);
484
+ },
485
+ addTarget(rule) {
486
+ rule.targets.push({
487
+ field: "",
488
+ visible: undefined,
489
+ required: undefined,
490
+ readonly: undefined,
491
+ disabled: undefined,
492
+ });
493
+ },
494
+ removeTarget(rule, idx) {
495
+ rule.targets.splice(idx, 1);
496
+ },
497
+ saveRules() {
498
+ this.formConfig.dynamicFieldRules = JSON.parse(
499
+ JSON.stringify(this.editingRules)
500
+ );
501
+ this.ruleDialogVisible = false;
502
+ },
503
+ },
504
+ };
505
+ </script>
506
+
507
+ <style lang="scss" scoped>
508
+ .tip-text {
509
+ font-size: 12px;
510
+ color: #909399;
511
+ line-height: 1.4;
512
+ margin-top: 2px;
513
+ }
514
+
515
+ .rule-list {
516
+ max-height: 56vh;
517
+ overflow-y: auto;
518
+ }
519
+
520
+ .rule-card {
521
+ border: 1px solid #ebeef5;
522
+ border-radius: 4px;
523
+ padding: 10px 12px;
524
+ margin-bottom: 12px;
525
+ background: #fafafa;
526
+ }
527
+
528
+ .rule-card-header {
529
+ display: flex;
530
+ justify-content: space-between;
531
+ align-items: center;
532
+ margin-bottom: 6px;
533
+
534
+ .rule-title {
535
+ font-weight: bold;
536
+ font-size: 13px;
537
+ }
538
+ }
539
+
540
+ .rule-section {
541
+ margin-top: 6px;
542
+ }
543
+
544
+ .rule-section-title {
545
+ display: flex;
546
+ align-items: center;
547
+ gap: 8px;
548
+ font-size: 13px;
549
+ color: #606266;
550
+ margin-bottom: 6px;
551
+ }
552
+
553
+ .rule-row {
554
+ display: flex;
555
+ align-items: center;
556
+ gap: 6px;
557
+ margin-bottom: 6px;
558
+ flex-wrap: wrap;
559
+ }
560
+
561
+ .cell-field {
562
+ width: 180px;
563
+ }
564
+
565
+ .cell-op {
566
+ width: 120px;
567
+ }
568
+
569
+ .cell-value {
570
+ width: 130px;
571
+ }
572
+
573
+ .cell-tri {
574
+ width: 92px;
575
+ }
576
+
577
+ .target-attr {
578
+ display: flex;
579
+ align-items: center;
580
+ gap: 2px;
581
+
582
+ .attr-label {
583
+ font-size: 12px;
584
+ color: #909399;
585
+ }
586
+ }
587
+
588
+ .danger-text {
589
+ color: #f56c6c;
590
+ }
591
+
592
+ .opt-container {
593
+ color: #409eff;
594
+ }
595
+
596
+ .opt-tag {
597
+ color: #909399;
598
+ font-size: 12px;
599
+ margin-right: 4px;
600
+ }
601
+ </style>
@@ -123,6 +123,12 @@
123
123
  <el-form-item :label="i18nt('新增页面表单名称')">
124
124
  {{ formConfig.addFormName }}
125
125
  </el-form-item>
126
+ <el-form-item :label="i18nt('详情翻单按钮')">
127
+ <el-switch v-model="formConfig.billNavEnabled"></el-switch>
128
+ <span style="margin-left: 8px; color: #999; font-size: 12px">
129
+ 编辑态页签显示「上一单/下一单」
130
+ </span>
131
+ </el-form-item>
126
132
  </el-collapse-item>
127
133
  <el-collapse-item name="3" title="流程信息">
128
134
  <el-form-item :label="i18nt('启用流程')">