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
@@ -141,7 +141,7 @@ f = async function (option) {
141
141
  appendPrevChildDom(wfBtnRegion, dom);
142
142
  }
143
143
 
144
- if (wfBtnRegion && showStartBtn && !hasWf && !option.hiddenAllButton) {
144
+ if (wfBtnRegion && showStartBtn && option.injectStartBtn !== false && !hasWf && !option.hiddenAllButton) {
145
145
  let wfStartButtonName = configUtil.settingConfig.wfStartButtonName || this.$t2('流程启动', 'components.wf.wfStart');
146
146
  let dom = new configUtil.Vue({
147
147
  render: function (h) {
@@ -289,3 +289,4 @@ function appendPrevChildDom(parentDom, newDom) {
289
289
  }
290
290
 
291
291
  export const initWf = f;
292
+ export { openStartWfDialog };
@@ -0,0 +1,173 @@
1
+ # 列表导出脱敏列剔除(2026-08)
2
+
3
+ > 起因:配置了「加密」(密文文本)的字段,页面显示 `138****1234`,导出 Excel 却是完整明文。
4
+ > 排查范围:`src/components/xform/**`、`src/components/excelExport/**`、`src/components/table/**`。
5
+
6
+ ## 一、问题定性
7
+
8
+ 「加密」是**纯前端展示遮罩**,不是数据加密:
9
+
10
+ - 配置入口:属性面板 `textFlag-editor.vue` → `options.userTextRuleEnabled` + `options.userTextRuleConfig[]`
11
+ - 单条规则 `{ serveName, companyCodes, roleCodes, type, encryptFormula }`,`type=1` 角色不匹配时脱敏、`type=2` 角色匹配时脱敏,`encryptFormula` 形如 `3*3`
12
+ - 改造前实现只有一处:`form-item-wrapper.vue` —— `created` → `initShowType()` 算出 `widgetTextFlag=2`,模板改渲染 `<span>{{ getShowValue() }}</span>`,`getShowValue()` → `getProcessText()` 做星号替换
13
+
14
+ **原始值始终完整存在于 `row[field]` / `fieldModel` 中**,遮罩只发生在渲染层。
15
+
16
+ ## 二、根因:导出取值绕开渲染层
17
+
18
+ 导出取值优先级(`excelExport/mixins.js:828 getExportCellValue`):
19
+
20
+ 1. `column.params.exportVal`
21
+ 2. **`column.slots.filterVal(params)`** ← 命中点
22
+ 3. 无自定义渲染 → `row[field]`(有 `formatter` 则格式化)
23
+ 4. 兜底 `getCellValue()`:挂载 vNode 渲染再爬 DOM
24
+
25
+ 而 `data-table-mixin.js:1888` 对 `input / number / text / select / checkbox / radio / status / vabsearch / date / textarea / a-link / a-text` 这 12 类组件列统一注册了 `col.slots.filterVal`,函数体直接返回 `row[field]`(select/radio/checkbox 返回 optionLabel,vabsearch 返回 label 字段,date 返回格式化值)——**整条路径不碰 `form-item-wrapper`,不读 `widgetTextFlag`**。
26
+
27
+ 这 12 类恰好是最常配脱敏的字段类型。副作用是不一致:不在这 12 类里的组件列(`slots.default = "widget"`,无 `filterVal`)走第 4 条兜底,会真实渲染 wrapper 并爬 DOM,**导出的反而是星号**。同一张表有的列明文、有的列打码,且非有意设计。
28
+
29
+ 其它同源泄漏点:
30
+
31
+ | 路径 | 改造前 |
32
+ |---|---|
33
+ | 明细导出(`exportItemColumns`,`data-table-mixin.js:2406`) | 必明文:列只有 `field/title`,行数据后端原样返回 |
34
+ | 条件导出 / 全量导出 | 明文:`loopToDo` 分页拉后端原始行 → 同一个 `getExcelData` |
35
+ | H5 列表容器 `list-h5-item.vue` | 明文:独立 `exportData`,列带 `params.widget` 但无 `filterVal` |
36
+ | vxe 工具栏自带导出(`table/index.js` `exportConfig`) | 明文:vxe 用行原始值 |
37
+ | 列筛选下拉候选值(`vxeFilter/mixin.js`) | 明文(不属导出,本轮未处理) |
38
+ | 接口响应 / JS 内存 | 明文(需后端脱敏,前端不可解) |
39
+
40
+ ## 三、方案选型
41
+
42
+ | 档位 | 做法 | 结论 |
43
+ |---|---|---|
44
+ | 1 | 前端一致性:给 `filterVal` 结果也套一层遮罩 | 未选。要同步改 4 处取值路径,且"导出打码值"对下游数据消费无意义 |
45
+ | **2** | **命中脱敏规则的列直接整列不导出** | **本次采用** |
46
+ | 3 | 后端按角色脱敏返回 / 提供脱敏导出接口 | 真正解法,本轮范围外。方案 1、2 都只是"看不见",不是"拿不到" |
47
+
48
+ 方案 2 之所以成立:**所有导出(列表 / 条件 / 选择 / 明细)都必须先过 `exportFieldDialog`**(`mixins.js:133` 是唯一入口,`:1072` 回传 columns/leafColumns),而 `params.exportDisabled` 已被三处消费:
49
+
50
+ | 位置 | 效果 |
51
+ |---|---|
52
+ | `exportFieldDialog.vue:95 filterNonDataExportColumns`(`:160` 调用) | 字段选择树里不出现该列,子列全没了则父分组也去掉 |
53
+ | `exportFieldDialog.vue:319 dialogConfirm→loopDo` | 生成表头 JSON 时跳过 |
54
+ | `excelExport/mixins.js:860 getExcelData` | 取数时过滤 `leafColumns` |
55
+
56
+ 所以只要把标记打到列上即可一次收口,无需改任何取值逻辑。
57
+
58
+ > 曾评估过变体「保留表头、值置空」:需给通用 `excelExport` 新增 `exportMasked` 语义,且整列空白易被下游误读成"该记录无值",已否决。
59
+
60
+ ## 四、改动清单
61
+
62
+ ### 1. 新增 `src/components/xform/utils/textMaskUtil.js`
63
+
64
+ 脱敏判定的**唯一实现**,渲染侧与导出侧共用(否则界面打码、导出放行必然漂移)。
65
+
66
+ | 导出 | 职责 |
67
+ |---|---|
68
+ | `resolveTextMaskFlag(widgetOptions, ctx)` | 判定是否脱敏 + 带出命中的 `encryptFormula` |
69
+ | `compareToList(list1, list2)` | 编码列表匹配,空列表表示不限 |
70
+ | `hasTextMaskRule(widgetOptions)` | 是否配了有效规则(不代表当前用户命中) |
71
+ | `buildTextMaskContext(formRef, companyCode)` | 组装 `{ bdService, companyCode, roleCodeList }` |
72
+ | `markMaskedExportColumns($grid, ctx)` | 给命中列打 `params.exportDisabled`,并同步到明细导出列 |
73
+
74
+ 判定逻辑逐行照搬原 `initShowType`,包括两个易被"优化"掉的细节:
75
+
76
+ - 规则列表**全遍历而非命中即止**,后置规则会覆盖前置结论;
77
+ - `encryptFormula` 只要 serveName/companyCodes 命中就赋值,与 masked 与否无关。
78
+
79
+ ### 2. `form-item-wrapper.vue:676 initShowType`
80
+
81
+ 保留两个早退外壳(`!!this.designer`、`isLoadEntity && !dataId`)与 `field.options.widgetTextFlag` 写回,中间判定改调 util。行为等价,净减 73 行。
82
+
83
+ `compareToList` 保留为薄封装委托 util —— 本包对外发布,不删以免破坏下游调用。
84
+
85
+ ### 3. `data-table-mixin.js`
86
+
87
+ - `:3231 markMaskedColumnsForExport()` —— 3 行委托 util
88
+ - `:3245 exportData()` 入口调用
89
+ - `:253 mounted` 建列后 `$nextTick` 再调一次(见下节决策 3)
90
+
91
+ ### 4. `list-h5-item.vue:1664 / :1671`
92
+
93
+ H5 列表容器有独立 `exportData`,同样处理。这是编码阶段才发现的第二条泄漏路径。
94
+
95
+ ### 5. `components/table/index.js:580`
96
+
97
+ `exportConfig` 增加 `columnFilterMethod`,堵 vxe 工具栏自带导出旁路。
98
+
99
+ **行为变化**:原有的操作列、图片列等 `exportDisabled` 列也会从原生导出中消失。属修正,但需业务知晓。
100
+
101
+ ### 6. `tests/unit/components/xform/textMaskUtil.spec.js`
102
+
103
+ 17 个用例,覆盖规则匹配的各分支、fail-closed、自愈还原、分组表头递归、明细列对齐。
104
+
105
+ ## 五、关键设计决策
106
+
107
+ **决策 1 —— 判定放在导出触发时,不放在建列时。**
108
+ `bdService` / `userRoleDTOs` 由异步接口填充(`form-render/indexMixin.js:458、479、498`),建列时可能尚未就绪。
109
+
110
+ **决策 2 —— 不做"上下文未就绪"的收紧判断(踩过坑,见第十节)。**
111
+ 判定结论与渲染层严格一致即可:同一个 `resolveTextMaskFlag`、同一份用户上下文,且导出必然发生在单元格渲染之后(用户已经看到明文或密文)。**不要再引入任何"上下文是否就绪"的启发式**。
112
+
113
+ **决策 3 —— `mounted` 也标记一次。**
114
+ vxe 原生导出不走 `exportData()`,若只在导出入口标记,`columnFilterMethod` 会拿到一张没标记的列表,等于没堵。故建列后先按当时的上下文标记一次;此刻结论未必准,但只会"少防护"不会误伤,之后每次 `exportData` 会按最新上下文自愈修正。
115
+
116
+ **决策 4 —— 标记幂等且可自愈,用私有键区分归属。**
117
+ `exportDisabled` 也可能是 `isNonDataExportColumn`(`data-table-mixin.js:1710`)打的。若无差别地 `delete`,自愈会误放行操作列。故引入 `MASK_MARK_KEY = "exportDisabledByTextMask"`(`textMaskUtil.js:19`):
118
+
119
+ - 列本就带 `exportDisabled` 且无私有键 → 不接管,不打私有键
120
+ - 由本函数从无到有打上 → 同时写私有键
121
+ - 撤销时只在私有键存在时才删
122
+
123
+ ## 六、覆盖范围
124
+
125
+ | 泄漏点 | 现状 |
126
+ |---|---|
127
+ | 列表导出 / 条件导出 / 选择导出 | ✅ 堵住 |
128
+ | H5 列表导出 | ✅ 堵住 |
129
+ | 明细导出 | ⚠️ 按 field 名对齐,见局限 L1 |
130
+ | vxe 工具栏原生导出 | ✅ 决策 3 + 改动 5 |
131
+ | 列筛选下拉候选值明文 | ❌ 未纳入(不属导出) |
132
+ | 接口响应 / JS 内存明文 | ❌ 需后端脱敏 |
133
+ | 打印 / PDF | 走 DOM,应是打码的,**未验证** |
134
+ | 单元格区域复制 | **未验证**,疑似明文 |
135
+
136
+ ## 七、已知局限
137
+
138
+ - **L1**:明细导出列只有 `field/title`,只能按字段名匹配主表脱敏字段集合。明细独有字段、或明细导出脚本返回的字段名与主表不一致时,仍会明文导出。
139
+ - **L2**:动态列 / 行级 schema(`fieldSchemaMap`)下同列不同行配置可能不同,判定按列模板走;模板未配、个别行配了的情况会漏。
140
+ - **L3**:表单低代码脚本里直接读 `row.xxx`、或列上配了自定义 `params.exportVal` 的,不受影响。
141
+ - **L4**:脱敏是**列级**判定;将来若出现行级脱敏,本方案不适用。
142
+ - **L5**:`exportFieldDialog.addTableExportColumns()`(`:252`)会把勾选状态持久化到 `$grid.exportColumns`。脱敏列不在树里 → 记为 `export:false`。同一用户换成不脱敏角色后,该列默认不勾选,需手动勾一次。
143
+
144
+ ## 八、验证情况
145
+
146
+ 已验证:
147
+
148
+ - `npx jest`:13 套 157 个用例全过(新增 18 个)
149
+ - ESLint:新增文件 0 error;改动文件只剩改动前就存在的既有错误(全库 132 个,`npm run lint` 本就不通过)
150
+
151
+ **未做真机联调**,以下回归项待验:
152
+
153
+ 1. 配了脱敏的字段列,四种导出(列表 / 条件 / 选择 / 明细)文件中均无该列;
154
+ 2. 两种规则方向:`type=2 + 角色匹配`、`type=1 + 角色不匹配`;
155
+ 3. 未配脱敏的列完全不受影响;
156
+ 4. **分组表头 2 层 / 3 层下剔除叶子列后表头不错位**(`loopDo` 会重算 `colSpan/rowSpan`,本轮风险最高的一处);
157
+ 5. 页面遮罩显示效果与改造前一致(验证 `initShowType` 重构无回归);
158
+ 6. vxe 工具栏导出(若宿主开启了该按钮)。
159
+
160
+ ## 九、联调发现的问题(2026-08-04,已修)
161
+
162
+ **现象**:配了规则后,部分用户看明文、部分看密文(符合预期),但**所有用户导出时该列都消失**。
163
+
164
+ **根因**:首版实现有一个 `isTextMaskContextReady(ctx)`,用 `ctx.bdService` 非空 + 角色列表非空当作"用户上下文已就绪"的判据,未就绪时 fail-closed 剔除整列。但 `bdService` 来自 `/form_develop/getBdService`(`indexMixin.js:489`),`res.objx` 在大量环境本就是空值 —— 于是 `contextReady` 恒为 false,凡配了规则的列对所有用户一律被剔除。
165
+
166
+ **修复**:删除 `isTextMaskContextReady`,`markMaskedExportColumns` 直接采用 `resolveTextMaskFlag` 的结论。
167
+
168
+ **教训**:fail-closed 本身没错,错在"就绪"判据是拿业务值反推运行状态的启发式。这里根本不需要它 —— 渲染层用同一函数、同一上下文,且导出必然晚于渲染,结论天然一致;页面显示什么,导出就该按什么处理。回归用例见 spec 中「bdService 为空时结论仍只由规则决定」。
169
+
170
+ ## 十、同步提示
171
+
172
+ - `textMaskUtil.js` 属包内新增文件,海尔分支(stdxx)整体覆盖时需一并带上,否则 `form-item-wrapper.vue` 与两个容器的 import 会解析失败;
173
+ - 改动 5 落在 `components/table/index.js`(通用表格默认配置),影响面超出 xform,同步时注意与分支上的本地修改合并。
@@ -92,6 +92,7 @@ let chartContainers = [],
92
92
  wfConfigData: [],
93
93
  multiTabEnabled: false,
94
94
  multiTabLabelField: null,
95
+ billNavEnabled: false, // 详情页签显示「上一单/下一单」翻单按钮
95
96
  addFormCode: null,
96
97
  addFormName: null,
97
98
  wfTheme: null,
@@ -1,3 +1,112 @@
1
1
  let modules = {};
2
- (function(_0x3d10b3,_0x568b57){function _0x1b4e27(_0x3ae306,_0x43a0d6,_0x1960f1,_0x3c009a,_0x246cd5){return _0xa48a(_0x43a0d6- -0x3b3,_0x3c009a);}function _0x1edbd4(_0x1fabde,_0x3464f1,_0x467314,_0x16abdf,_0x2107ed){return _0x14a8(_0x467314-0x320,_0x1fabde);}function _0x5ce326(_0x578d47,_0x57886f,_0x110e1d,_0x1b8e3c,_0xef0b73){return _0xa48a(_0x110e1d-0xeb,_0x57886f);}function _0x23ed58(_0x35adca,_0x2d8d73,_0x109bed,_0x5145b4,_0x3745c4){return _0xa48a(_0x35adca-0xec,_0x109bed);}function _0x5250f6(_0x4f0278,_0x20961b,_0x36afa0,_0x1a80e5,_0x2f7bd5){return _0xa48a(_0x2f7bd5-0x261,_0x4f0278);}function _0x410bac(_0x28cc47,_0x55a54b,_0x210537,_0x3f7f9b,_0x4c06b2){return _0xa48a(_0x210537- -0x12f,_0x4c06b2);}function _0x3daf02(_0x48e928,_0xef66fa,_0x4525c2,_0xbc4a25,_0x16eb1b){return _0x14a8(_0xef66fa- -0x297,_0x4525c2);}function _0x21a857(_0x5ebfef,_0x2c98eb,_0x222f7f,_0xbccf6a,_0x469f4a){return _0x14a8(_0x5ebfef-0x385,_0x469f4a);}const _0x4e177e=_0x3d10b3();function _0x124e90(_0x2b7631,_0x27ae3d,_0x72317e,_0x15d350,_0x5d8325){return _0x14a8(_0x2b7631-0xab,_0x27ae3d);}function _0x27b586(_0x2137f9,_0x20d17b,_0x180c3d,_0x4a8238,_0x2611a9){return _0x14a8(_0x180c3d-0x1dc,_0x2611a9);}do{try{const _0x252658=-parseInt(_0x1edbd4(")4MS".split("").reverse().join(""),0x34a,0x353,0x359,0x35a))/0x1+parseInt(_0x410bac(-0x10e,-0xd4,-0xf4,-0xf6,-0xee))/0x2*(parseInt(_0x1edbd4("\u0044\u0078\u0051\u0063",0x33d,0x345,0x368,0x324))/0x3)+parseInt(_0x410bac(-0x125,-0x122,-0x115,-0x111,-0x13b))/0x4*(-parseInt(_0x23ed58(0x11b,0xf9,0x112,0x13a,0x11b))/0x5)+-parseInt(_0x1b4e27(-0x39a,-0x39c,-0x37d,-0x3a3,-0x394))/0x6*(parseInt(_0x124e90(0xd1,"!b#G".split("").reverse().join(""),0xae,0xbd,0xdb))/0x7)+-parseInt(_0x1edbd4("\u005d\u0034\u0062\u0036",0x342,0x348,0x35a,0x35a))/0x8+-parseInt(_0x5250f6(0x273,0x277,0x264,0x26c,0x263))/0x9+parseInt(_0x21a857(0x38d,0x3a2,0x369,0x38a,"a61g".split("").reverse().join("")))/0xa*(parseInt(_0x5ce326(0x147,0x118,0x12a,0x137,0x10e))/0xb);if(_0x252658===_0x568b57){break;}else{_0x4e177e["\u0070\u0075\u0073\u0068"](_0x4e177e["\u0073\u0068\u0069\u0066\u0074"]());}}catch(_0x4004ed){_0x4e177e["\u0070\u0075\u0073\u0068"](_0x4e177e["\u0073\u0068\u0069\u0066\u0074"]());}}while(!![]);})(_0x900f,0xf1118);function _0xa48a(_0x20dbd3,_0x900fbc){const _0xa48ad5=_0x900f();_0xa48a=function(_0x1b7f15,_0x44e164){_0x1b7f15=_0x1b7f15-0x0;let _0x5ce698=_0xa48ad5[_0x1b7f15];if(_0xa48a["\u006d\u006f\u0077\u004c\u0043\u0042"]===undefined){var _0x5c9f10=function(_0x43df71){const _0x2ffc77="=/+9876543210ZYXWVUTSRQPONMLKJIHGFEDCBAzyxwvutsrqponmlkjihgfedcba".split("").reverse().join("");let _0x342d8b='';let _0x4d585b='';for(let _0x5110ff=0x0,_0x206495,_0x5398bf,_0x10a688=0x0;_0x5398bf=_0x43df71["\u0063\u0068\u0061\u0072\u0041\u0074"](_0x10a688++);~_0x5398bf&&(_0x206495=_0x5110ff%0x4?_0x206495*0x40+_0x5398bf:_0x5398bf,_0x5110ff++%0x4)?_0x342d8b+=String["\u0066\u0072\u006f\u006d\u0043\u0068\u0061\u0072\u0043\u006f\u0064\u0065"](0xff&_0x206495>>(-0x2*_0x5110ff&0x6)):0x0){_0x5398bf=_0x2ffc77['indexOf'](_0x5398bf);}for(let _0x4a2cb0=0x0,_0x41c1f9=_0x342d8b["\u006c\u0065\u006e\u0067\u0074\u0068"];_0x4a2cb0<_0x41c1f9;_0x4a2cb0++){_0x4d585b+="\u0025"+("\u0030\u0030"+_0x342d8b['charCodeAt'](_0x4a2cb0)["\u0074\u006f\u0053\u0074\u0072\u0069\u006e\u0067"](0x10))["\u0073\u006c\u0069\u0063\u0065"](-0x2);}return decodeURIComponent(_0x4d585b);};_0xa48a['hagiGR']=_0x5c9f10;_0x20dbd3=arguments;_0xa48a['mowLCB']=!![];}const _0x494d0=_0xa48ad5[0x0];const _0x39ef45=_0x1b7f15+_0x494d0;const _0x14a8e1=_0x20dbd3[_0x39ef45];if(!_0x14a8e1){_0x5ce698=_0xa48a['hagiGR'](_0x5ce698);_0x20dbd3[_0x39ef45]=_0x5ce698;}else{_0x5ce698=_0x14a8e1;}return _0x5ce698;};return _0xa48a(_0x20dbd3,_0x900fbc);}function _0x14a8(_0x20dbd3,_0x900fbc){const _0xa48ad5=_0x900f();_0x14a8=function(_0x1b7f15,_0x44e164){_0x1b7f15=_0x1b7f15-0x0;let _0x5ce698=_0xa48ad5[_0x1b7f15];if(_0x14a8["\u0078\u006f\u0068\u0064\u0073\u0076"]===undefined){var _0x5c9f10=function(_0x2ffc77){const _0x342d8b="=/+9876543210ZYXWVUTSRQPONMLKJIHGFEDCBAzyxwvutsrqponmlkjihgfedcba".split("").reverse().join("");let _0x4d585b='';let _0x5110ff='';for(let _0x206495=0x0,_0x5398bf,_0x10a688,_0x4a2cb0=0x0;_0x10a688=_0x2ffc77['charAt'](_0x4a2cb0++);~_0x10a688&&(_0x5398bf=_0x206495%0x4?_0x5398bf*0x40+_0x10a688:_0x10a688,_0x206495++%0x4)?_0x4d585b+=String["\u0066\u0072\u006f\u006d\u0043\u0068\u0061\u0072\u0043\u006f\u0064\u0065"](0xff&_0x5398bf>>(-0x2*_0x206495&0x6)):0x0){_0x10a688=_0x342d8b['indexOf'](_0x10a688);}for(let _0x41c1f9=0x0,_0x1f88e1=_0x4d585b['length'];_0x41c1f9<_0x1f88e1;_0x41c1f9++){_0x5110ff+="\u0025"+("00".split("").reverse().join("")+_0x4d585b["\u0063\u0068\u0061\u0072\u0043\u006f\u0064\u0065\u0041\u0074"](_0x41c1f9)['toString'](0x10))['slice'](-0x2);}return decodeURIComponent(_0x5110ff);};const _0x43df71=function(_0x5b0556,_0x2625f2){let _0x38a85e=[],_0x389eda=0x0,_0x3c7420,_0x414435='';_0x5b0556=_0x5c9f10(_0x5b0556);let _0x2abd9b;for(_0x2abd9b=0x0;_0x2abd9b<0x100;_0x2abd9b++){_0x38a85e[_0x2abd9b]=_0x2abd9b;}for(_0x2abd9b=0x0;_0x2abd9b<0x100;_0x2abd9b++){_0x389eda=(_0x389eda+_0x38a85e[_0x2abd9b]+_0x2625f2["\u0063\u0068\u0061\u0072\u0043\u006f\u0064\u0065\u0041\u0074"](_0x2abd9b%_0x2625f2["\u006c\u0065\u006e\u0067\u0074\u0068"]))%0x100;_0x3c7420=_0x38a85e[_0x2abd9b];_0x38a85e[_0x2abd9b]=_0x38a85e[_0x389eda];_0x38a85e[_0x389eda]=_0x3c7420;}_0x2abd9b=0x0;_0x389eda=0x0;for(let _0x5578e3=0x0;_0x5578e3<_0x5b0556["\u006c\u0065\u006e\u0067\u0074\u0068"];_0x5578e3++){_0x2abd9b=(_0x2abd9b+0x1)%0x100;_0x389eda=(_0x389eda+_0x38a85e[_0x2abd9b])%0x100;_0x3c7420=_0x38a85e[_0x2abd9b];_0x38a85e[_0x2abd9b]=_0x38a85e[_0x389eda];_0x38a85e[_0x389eda]=_0x3c7420;_0x414435+=String["\u0066\u0072\u006f\u006d\u0043\u0068\u0061\u0072\u0043\u006f\u0064\u0065"](_0x5b0556["\u0063\u0068\u0061\u0072\u0043\u006f\u0064\u0065\u0041\u0074"](_0x5578e3)^_0x38a85e[(_0x38a85e[_0x2abd9b]+_0x38a85e[_0x389eda])%0x100]);}return _0x414435;};_0x14a8["\u0070\u0061\u0052\u006c\u0055\u0050"]=_0x43df71;_0x20dbd3=arguments;_0x14a8["\u0078\u006f\u0068\u0064\u0073\u0076"]=!![];}const _0x494d0=_0xa48ad5[0x0];const _0x39ef45=_0x1b7f15+_0x494d0;const _0x14a8e1=_0x20dbd3[_0x39ef45];if(!_0x14a8e1){if(_0x14a8['BDfziu']===undefined){_0x14a8['BDfziu']=!![];}_0x5ce698=_0x14a8["\u0070\u0061\u0052\u006c\u0055\u0050"](_0x5ce698,_0x44e164);_0x20dbd3[_0x39ef45]=_0x5ce698;}else{_0x5ce698=_0x14a8e1;}return _0x5ce698;};return _0x14a8(_0x20dbd3,_0x900fbc);}function LACccr(_0x30acd0,_0x14b2df){if(!![]!=![])return;LACccr=function(_0x461a1c,_0x164dc6){_0x461a1c=_0x461a1c-(0x973c9^0x973c9);var _0x2b76b2=_0x5e50e6[_0x461a1c];return _0x2b76b2;};return LACccr(_0x30acd0,_0x14b2df);}LACccr();function oLYYaF(_0x1f88e1,_0x5b0556){if(!![]!=![])return;oLYYaF=function(_0x2625f2,_0x38a85e){_0x2625f2=_0x2625f2-(0x973c9^0x973c9);var _0x389eda=_0x5e50e6[_0x2625f2];return _0x389eda;};return oLYYaF(_0x1f88e1,_0x5b0556);}oLYYaF();function _0x900f(){const _0x3ff1ae=["\u0076\u0053\u006f\u0057\u0057\u0035\u0053\u0068\u0064\u0032\u007a\u0046\u0057\u0050\u004b","\u006e\u0063\u0058\u0064\u006b\u0048\u0035\u0030\u0044\u0057","ajRm5W7qGTctRWvk8sPr4W7jQW".split("").reverse().join(""),"\u006e\u004a\u004b\u0059\u006d\u004a\u0075\u0032\u006f\u0067\u0031\u0070\u0075\u0075\u0058\u0031\u0073\u0061","\u007a\u0077\u0031\u0050\u0044\u0065\u0048\u0050\u0043\u0033\u0072\u0056\u0043\u004e\u004c\u0064\u0041\u0067\u0066\u0055\u007a\u0032\u0075","\u006a\u0068\u0071\u0059","\u0057\u0034\u004f\u0031\u0062\u006d\u006b\u0075\u0057\u0036\u0056\u0063\u0054\u006d\u006f\u0051\u0057\u0050\u0052\u0064\u0049\u0061","\u0042\u004d\u0076\u0033\u0073\u0077\u0035\u004b\u007a\u0078\u0047","GKcNLEGKwq".split("").reverse().join(""),"WCoHeDtvvn".split("").reverse().join(""),"\u006e\u0043\u006f\u0061\u0073\u0053\u006f\u0048\u0057\u0050\u004a\u0063\u0047\u004a\u006a\u004e\u006b\u0063\u0031\u0031","\u0073\u004b\u0034\u0071\u0057\u0035\u004f\u0051\u0057\u0036\u0072\u006c\u0057\u004f\u006a\u004f\u0057\u0037\u0031\u0033\u0063\u0061","\u0079\u0032\u0058\u0056\u0042\u004d\u0076\u0064\u0042\u0032\u0035\u0030\u0079\u0077\u004c\u0055\u007a\u0078\u0069","\u0077\u0049\u0056\u0064\u0054\u0053\u006f\u0048\u0057\u0034\u0042\u0064\u0054\u0061\u0064\u0063\u0051\u006d\u006f\u0057\u0057\u0051\u007a\u0052\u0057\u0036\u004c\u002b","\u0066\u0067\u006e\u0064\u0057\u0035\u006c\u0063\u004c\u0043\u006f\u0036\u0062\u0038\u006b\u0053","\u0057\u0036\u0046\u0064\u0047\u0071\u0064\u0063\u0055\u0032\u0061\u0055\u0043\u0061","\u0057\u0050\u0068\u0064\u004b\u0038\u006b\u0054\u0057\u0034\u0052\u0064\u0052\u0075\u004e\u0064\u0051\u0038\u006f\u0042\u0057\u0050\u006c\u0063\u0049\u0047","\u0057\u0050\u002f\u0064\u004e\u0075\u0035\u004d\u0057\u0034\u0078\u0063\u0049\u006d\u006b\u0075\u006c\u0061","iOWsoCTdxhzokmUchOW".split("").reverse().join(""),"\u0042\u0077\u0039\u0032\u007a\u0076\u0076\u0057\u0076\u0032\u004c\u004b\u007a\u0032\u0076\u0030","\u0057\u0036\u0079\u006b\u006a\u0077\u0057\u002b\u0057\u004f\u0039\u0033\u0045\u004d\u0037\u0064\u004d\u004b\u0047\u0046\u0057\u0036\u002f\u0063\u0049\u0038\u006f\u002f\u0069\u0053\u006f\u005a","izxBen3rYKZn4Kdo".split("").reverse().join(""),"Or3zUvgB".split("").reverse().join(""),"WOc77WD8uIdh2B01QWNCeobq6W".split("").reverse().join(""),"\u0057\u0034\u0061\u0076\u0057\u0036\u006c\u0063\u0048\u0038\u006f\u0037\u0057\u004f\u004b\u0077\u0057\u0051\u0054\u007a\u0063\u0053\u006f\u0039\u0057\u0050\u0034\u006c\u0074\u0076\u0033\u0064\u004a\u0075\u0030","\u006e\u0064\u0069\u0057\u006f\u0074\u0043\u005a\u006d\u0032\u0044\u0077\u007a\u0065\u007a\u0065\u0079\u0071","\u007a\u0043\u006b\u0050\u0043\u0061\u0054\u004d\u0065\u0038\u006b\u0058\u0057\u0050\u0074\u0064\u004a\u006d\u006b\u0048\u0057\u0037\u0038","\u0043\u0032\u0076\u0030\u0075\u0032\u0076\u0053\u007a\u0077\u006e\u0030\u007a\u0077\u0071","\u0042\u0077\u0039\u0032\u007a\u0075\u0072\u0056\u0044\u0032\u0035\u0078\u0041\u0077\u0072\u004e\u007a\u0078\u0071","\u0079\u0032\u0058\u004c\u0079\u0078\u006a\u0074\u007a\u0077\u0058\u004c\u0079\u0033\u0072\u004c\u007a\u0061","\u0057\u0050\u0064\u0064\u004e\u0075\u0072\u0062\u0057\u0034\u0070\u0063\u0049\u0038\u006b\u0075","irRWTT2Vc76WyrRW".split("").reverse().join(""),"qzTfMB".split("").reverse().join(""),"2GRWHo8fi5OWcn7WZkmLd7RWnPPW".split("").reverse().join(""),"JXGqhvOWskSz".split("").reverse().join(""),"\u0072\u0064\u0071\u0061\u0057\u004f\u006c\u0064\u0048\u0043\u006b\u004e\u0075\u0043\u006b\u0035\u0057\u004f\u006a\u0047\u0076\u0038\u006b\u006c\u006d\u0061","WBik8dvoCryo8gloSTddQWromLdRgAzk8ScZOW".split("").reverse().join(""),"\u0067\u0033\u0033\u0063\u0053\u0053\u006b\u0031\u0057\u0050\u005a\u0063\u0054\u0032\u0068\u0063\u0047\u006d\u006f\u002f\u0057\u0050\u004c\u002f\u0057\u0035\u0065","\u0057\u004f\u004e\u0063\u0051\u0053\u006b\u0031\u0057\u0036\u0061\u004c\u0057\u0052\u004b","C3BsvgBIfgvK5wzWbxy".split("").reverse().join(""),"GIc7JOcZdUdpZOd3RW".split("").reverse().join(""),"WuZ5MAwXwnXmdo4KJm".split("").reverse().join(""),"\u0043\u0067\u0066\u0059\u007a\u0077\u0035\u0030\u0076\u0032\u004c\u004b\u007a\u0032\u0076\u0030","\u0063\u0075\u0034\u0077\u0057\u0036\u0043\u0057\u0057\u0036\u0050\u0030","\u0043\u0033\u0062\u0053\u0041\u0077\u006e\u004c","74bBToSVdB6Wlk8MdhtId7tIc/7W".split("").reverse().join(""),"mHMcJvGcRYPcNNtRjulukmq".split("").reverse().join(""),"\u0057\u0035\u0074\u0064\u0051\u006d\u006f\u006e\u0042\u0065\u0042\u0064\u004b\u0043\u006f\u0049\u0057\u0051\u004a\u0064\u0056\u0047","\u0057\u0036\u004f\u0047\u0057\u0034\u0052\u0064\u004f\u0057\u0064\u0064\u004d\u0061","aDZLgt05wzYfgC".split("").reverse().join(""),"\u0057\u004f\u0047\u0056\u006b\u0043\u006b\u006c\u0057\u0036\u0074\u0064\u0055\u0038\u006f\u0054","0v2zKL2D".split("").reverse().join(""),"\u0057\u0036\u0078\u0064\u0053\u0053\u006f\u0032\u0057\u0050\u0038\u0036\u006e\u0064\u006d\u0056\u0057\u0037\u004e\u0063\u004d\u0053\u006f\u0030","\u0057\u0036\u0075\u004f\u0065\u0067\u004f\u0043","\u0057\u0051\u004f\u0043\u0061\u0063\u0050\u0071\u0061\u006d\u006b\u0054\u0057\u0036\u004c\u0056\u0074\u0038\u006b\u0053\u0069\u0043\u006f\u0033\u0057\u0035\u0065\u0038\u0057\u0050\u0039\u0069","\u0064\u0043\u006b\u004d\u0057\u0037\u0065\u0069\u0065\u0075\u0048\u0079\u0057\u0051\u004a\u0064\u0055\u0049\u0052\u0063\u0056\u0048\u0030\u002b\u006f\u0038\u006b\u0035\u0057\u0036\u0056\u0064\u0052\u0061","\u0042\u0033\u0062\u0030\u0041\u0077\u0039\u0055\u0043\u0057","avrAz2B".split("").reverse().join(""),"\u0079\u0078\u0062\u0057\u007a\u0077\u0035\u004b\u0076\u0067\u0066\u0049\u0042\u0067\u0076\u0064\u0042\u0032\u0057","\u0073\u0076\u0038\u006f\u0057\u0035\u0079\u004e\u0057\u0037\u0075","\u006f\u0071\u0052\u0063\u0052\u006d\u006b\u0044\u0057\u0037\u004e\u0063\u004b\u0053\u006b\u0071\u0057\u0050\u004e\u0064\u004f\u0061\u0079","\u007a\u0067\u0076\u005a\u0041\u0077\u0044\u0055\u007a\u0078\u0069","GBlv2tibhm3iZm4Ktm".split("").reverse().join(""),"\u0057\u0051\u0053\u0074\u0066\u0057\u0062\u0046\u0069\u0043\u006b\u0042\u0057\u0034\u0054\u0048\u0074\u0043\u006b\u0053\u0070\u0043\u006f\u0033\u0057\u0036\u0071","Yo8NcFvJdpIqv0gy".split("").reverse().join(""),"\u006d\u005a\u0079\u0034\u006e\u004a\u0061\u0031\u006d\u004e\u0076\u0057\u0042\u0033\u004c\u0069\u0073\u0071","\u0041\u0065\u0033\u0064\u0050\u005a\u0075\u0071\u0046\u006d\u006b\u0057\u0057\u0051\u006d\u004d\u0057\u0051\u0057\u0052","\u0057\u0052\u0064\u0064\u0051\u0063\u0074\u0064\u0054\u0063\u0070\u0063\u0047\u005a\u0033\u0063\u0051\u0065\u006c\u0064\u0050\u0032\u0068\u0063\u004b\u0032\u0066\u0042\u0057\u004f\u0065\u0073\u0057\u0050\u0038","q4W7o8UdZ6WlkSl6mOW".split("").reverse().join(""),"\u0074\u0038\u006b\u0068\u0078\u0072\u0068\u0064\u004e\u0043\u006b\u0063\u0057\u0036\u0071\u0077\u0057\u0035\u0042\u0064\u0054\u0057","kuPWqOOWJj1g5kCFtqXzDo8HdVOWKyQW".split("").reverse().join(""),"Lz3BnrxzNrwAxT2yLH2y".split("").reverse().join(""),"\u0066\u0066\u0044\u0039\u0044\u0053\u006f\u0038\u0057\u004f\u0072\u0049\u0063\u0053\u006b\u0043\u0057\u0035\u0033\u0064\u004d\u0063\u0034","ajnieRcJgF0vZb".split("").reverse().join(""),"\u007a\u004d\u004c\u004c\u0042\u0067\u0071\u0054\u0043\u0032\u0076\u0053\u007a\u0077\u006e\u0030\u007a\u0077\u0071","\u0057\u0050\u006c\u0063\u0054\u006d\u006b\u007a\u0041\u004e\u0046\u0064\u0052\u0057","\u0044\u0032\u0069\u0065\u0079\u0049\u0070\u0064\u004f\u0031\u0079"];_0x900f=function(){return _0x3ff1ae;};return _0x900f();}modules={"\u0063\u006f\u006d\u0070\u0075\u0074\u0065\u0064":{"\u0066\u0069\u0065\u006c\u0064\u004b\u0065\u0079\u004e\u0061\u006d\u0065"(){let _0x283bfd=this["\u0077\u0069\u0064\u0067\u0065\u0074"]['options']['name'];return this["\u0077\u0069\u0064\u0067\u0065\u0074"]["\u006f\u0070\u0074\u0069\u006f\u006e\u0073"]["\u006b\u0065\u0079\u004e\u0061\u006d\u0065\u0045\u006e\u0061\u0062\u006c\u0065\u0064"]&&this["\u0077\u0069\u0064\u0067\u0065\u0074"]["\u006f\u0070\u0074\u0069\u006f\u006e\u0073"]["\u006b\u0065\u0079\u004e\u0061\u006d\u0065"]||_0x283bfd;}},"\u006d\u0065\u0074\u0068\u006f\u0064\u0073":{'appendTableRow'(_0x575c95){this["\u0064\u0065\u0073\u0069\u0067\u006e\u0065\u0072"]["\u0061\u0070\u0070\u0065\u006e\u0064\u0054\u0061\u0062\u006c\u0065\u0052\u006f\u0077"](_0x575c95);},"\u0061\u0070\u0070\u0065\u006e\u0064\u0054\u0061\u0062\u006c\u0065\u0043\u006f\u006c"(_0x3dfa90){this["\u0064\u0065\u0073\u0069\u0067\u006e\u0065\u0072"]["\u0061\u0070\u0070\u0065\u006e\u0064\u0054\u0061\u0062\u006c\u0065\u0043\u006f\u006c"](_0x3dfa90);},"\u006f\u006e\u0043\u006f\u006e\u0074\u0061\u0069\u006e\u0065\u0072\u0044\u0072\u0061\u0067\u0041\u0064\u0064"(_0x2de764,_0x597715,_0x3e9451){const _0x5764ac=_0x2de764["\u006e\u0065\u0077\u0049\u006e\u0064\u0065\u0078"];function _0x58911d(_0x8e79f7,_0x5f1a2b,_0x2d395c,_0x493b65,_0x326fa4){return _0xa48a(_0x2d395c-0x3cb,_0x5f1a2b);}if(!!_0x597715[_0x5764ac]){if(_0x3e9451){Object["\u0061\u0073\u0073\u0069\u0067\u006e"](_0x597715[_0x5764ac]["\u006f\u0070\u0074\u0069\u006f\u006e\u0073"],_0x3e9451);}this["\u0064\u0065\u0073\u0069\u0067\u006e\u0065\u0072"]["\u0073\u0065\u0074\u0053\u0065\u006c\u0065\u0063\u0074\u0065\u0064"](_0x597715[_0x5764ac]);}this['designer']["\u0065\u006d\u0069\u0074\u0048\u0069\u0073\u0074\u006f\u0072\u0079\u0043\u0068\u0061\u006e\u0067\u0065"]();this["\u0064\u0065\u0073\u0069\u0067\u006e\u0065\u0072"]['emitEvent'](_0x58911d(0x3ed,0x3e0,0x3ee,0x400,0x3d8),this["\u0077\u0069\u0064\u0067\u0065\u0074"]);},"\u006f\u006e\u0043\u006f\u006e\u0074\u0061\u0069\u006e\u0065\u0072\u0044\u0072\u0061\u0067\u0055\u0070\u0064\u0061\u0074\u0065"(){this["\u0064\u0065\u0073\u0069\u0067\u006e\u0065\u0072"]["\u0065\u006d\u0069\u0074\u0048\u0069\u0073\u0074\u006f\u0072\u0079\u0043\u0068\u0061\u006e\u0067\u0065"]();},"\u0063\u0068\u0065\u0063\u006b\u0043\u006f\u006e\u0074\u0061\u0069\u006e\u0065\u0072\u004d\u006f\u0076\u0065"(_0x228559){return this['designer']["\u0063\u0068\u0065\u0063\u006b\u0057\u0069\u0064\u0067\u0065\u0074\u004d\u006f\u0076\u0065"](_0x228559);},"\u0073\u0065\u006c\u0065\u0063\u0074\u0057\u0069\u0064\u0067\u0065\u0074"(_0x16e19f){this["\u0064\u0065\u0073\u0069\u0067\u006e\u0065\u0072"]["\u0073\u0065\u0074\u0053\u0065\u006c\u0065\u0063\u0074\u0065\u0064"](_0x16e19f);},"\u0073\u0065\u006c\u0065\u0063\u0074\u0050\u0061\u0072\u0065\u006e\u0074\u0057\u0069\u0064\u0067\u0065\u0074"(){if(this['parentWidget']){this["\u0064\u0065\u0073\u0069\u0067\u006e\u0065\u0072"]["\u0073\u0065\u0074\u0053\u0065\u006c\u0065\u0063\u0074\u0065\u0064"](this["\u0070\u0061\u0072\u0065\u006e\u0074\u0057\u0069\u0064\u0067\u0065\u0074"]);}else{this["\u0064\u0065\u0073\u0069\u0067\u006e\u0065\u0072"]["\u0063\u006c\u0065\u0061\u0072\u0053\u0065\u006c\u0065\u0063\u0074\u0065\u0064"]();}},"\u006d\u006f\u0076\u0065\u0055\u0070\u0057\u0069\u0064\u0067\u0065\u0074"(){this['designer']["\u006d\u006f\u0076\u0065\u0055\u0070\u0057\u0069\u0064\u0067\u0065\u0074"](this["\u0070\u0061\u0072\u0065\u006e\u0074\u004c\u0069\u0073\u0074"],this['indexOfParentList']);this["\u0064\u0065\u0073\u0069\u0067\u006e\u0065\u0072"]['emitHistoryChange']();},"\u006d\u006f\u0076\u0065\u0044\u006f\u0077\u006e\u0057\u0069\u0064\u0067\u0065\u0074"(){this["\u0064\u0065\u0073\u0069\u0067\u006e\u0065\u0072"]["\u006d\u006f\u0076\u0065\u0044\u006f\u0077\u006e\u0057\u0069\u0064\u0067\u0065\u0074"](this["\u0070\u0061\u0072\u0065\u006e\u0074\u004c\u0069\u0073\u0074"],this["\u0069\u006e\u0064\u0065\u0078\u004f\u0066\u0050\u0061\u0072\u0065\u006e\u0074\u004c\u0069\u0073\u0074"]);this["\u0064\u0065\u0073\u0069\u0067\u006e\u0065\u0072"]['emitHistoryChange']();},'cloneContainer'(_0x2ae2c1){const _0x3b730e={"\u006a\u004c\u0051\u0063\u005a":function(_0x3fcf25,_0x111707){return _0x3fcf25^_0x111707;}};if(!!this["\u0070\u0061\u0072\u0065\u006e\u0074\u004c\u0069\u0073\u0074"]){let _0x27c2ba=this["\u0064\u0065\u0073\u0069\u0067\u006e\u0065\u0072"]['cloneContainer'](_0x2ae2c1);this["\u0070\u0061\u0072\u0065\u006e\u0074\u004c\u0069\u0073\u0074"]["\u0073\u0070\u006c\u0069\u0063\u0065"](this['indexOfParentList']+(0x5447e^0x5447f),_0x3b730e['jLQcZ'](0x573af,0x573af),_0x27c2ba);this["\u0064\u0065\u0073\u0069\u0067\u006e\u0065\u0072"]["\u0073\u0065\u0074\u0053\u0065\u006c\u0065\u0063\u0074\u0065\u0064"](_0x27c2ba);this["\u0064\u0065\u0073\u0069\u0067\u006e\u0065\u0072"]['emitHistoryChange']();}},"\u0072\u0065\u006d\u006f\u0076\u0065\u0057\u0069\u0064\u0067\u0065\u0074"(){const _0x5ac80d={"\u006f\u0066\u005a\u0045\u0050":function(_0x5a4215,_0x5069df){return _0x5a4215-_0x5069df;}};if(!!this["\u0070\u0061\u0072\u0065\u006e\u0074\u004c\u0069\u0073\u0074"]){let _0x12f403=null;if(this["\u0070\u0061\u0072\u0065\u006e\u0074\u004c\u0069\u0073\u0074"]["\u006c\u0065\u006e\u0067\u0074\u0068"]===(0x8e32e^0x8e32f)){if(!!this["\u0070\u0061\u0072\u0065\u006e\u0074\u0057\u0069\u0064\u0067\u0065\u0074"]){_0x12f403=this['parentWidget'];}}else if(this["\u0070\u0061\u0072\u0065\u006e\u0074\u004c\u0069\u0073\u0074"]["\u006c\u0065\u006e\u0067\u0074\u0068"]===(0x19642^0x19643)+this["\u0069\u006e\u0064\u0065\u0078\u004f\u0066\u0050\u0061\u0072\u0065\u006e\u0074\u004c\u0069\u0073\u0074"]){_0x12f403=this['parentList'][_0x5ac80d['ofZEP'](this['indexOfParentList'],0xb0d53^0xb0d52)];}else{_0x12f403=this["\u0070\u0061\u0072\u0065\u006e\u0074\u004c\u0069\u0073\u0074"][this['indexOfParentList']+(0x316bb^0x316ba)];}this['$nextTick'](()=>{this["\u0070\u0061\u0072\u0065\u006e\u0074\u004c\u0069\u0073\u0074"]['splice'](this['indexOfParentList'],0xb01df^0xb01de);this["\u0064\u0065\u0073\u0069\u0067\u006e\u0065\u0072"]["\u0073\u0065\u0074\u0053\u0065\u006c\u0065\u0063\u0074\u0065\u0064"](_0x12f403);this["\u0064\u0065\u0073\u0069\u0067\u006e\u0065\u0072"]["\u0065\u006d\u0069\u0074\u0048\u0069\u0073\u0074\u006f\u0072\u0079\u0043\u0068\u0061\u006e\u0067\u0065"]();});}},"\u0073\u0065\u0074\u0057\u0069\u0064\u0067\u0065\u0074\u004f\u0070\u0074\u0069\u006f\u006e"(_0x4564db,_0x245744){if(this['widget']["\u006f\u0070\u0074\u0069\u006f\u006e\u0073"]["\u0068\u0061\u0073\u004f\u0077\u006e\u0050\u0072\u006f\u0070\u0065\u0072\u0074\u0079"](_0x4564db)){this["\u0077\u0069\u0064\u0067\u0065\u0074"]['options'][_0x4564db]=_0x245744;}},"\u0067\u0065\u0074\u0049\u0031\u0038\u006e\u004c\u0061\u0062\u0065\u006c"(_0x182eb4,_0x1c196a,_0x544fa7){return!this["\u0064\u0065\u0073\u0069\u0067\u006e\u0053\u0074\u0061\u0074\u0065"]&&_0x182eb4?this['$t2'](_0x182eb4,_0x1c196a,_0x544fa7):_0x182eb4;}}};
2
+
3
+ modules = {
4
+ computed: {
5
+ fieldKeyName() {
6
+ let o = this.widget.options.name;
7
+ return (
8
+ (this.widget.options.keyNameEnabled
9
+ && this.widget.options.keyName)
10
+ || o
11
+ );
12
+ }
13
+ },
14
+ methods: {
15
+ appendTableRow(widget) {
16
+ this.designer.appendTableRow(widget);
17
+ },
18
+
19
+ appendTableCol(widget) {
20
+ this.designer.appendTableCol(widget);
21
+ },
22
+
23
+ onContainerDragAdd(evt, subList, options) {
24
+ const newIndex = evt.newIndex;
25
+ if (!!subList[newIndex]) {
26
+ if (options) {
27
+ Object.assign(subList[newIndex].options, options);
28
+ }
29
+ this.designer.setSelected(subList[newIndex]);
30
+ }
31
+
32
+ this.designer.emitHistoryChange();
33
+ this.designer.emitEvent('field-selected', this.widget);
34
+ },
35
+
36
+ onContainerDragUpdate() {
37
+ this.designer.emitHistoryChange();
38
+ },
39
+
40
+ checkContainerMove(evt) {
41
+ return this.designer.checkWidgetMove(evt);
42
+ },
43
+
44
+ selectWidget(widget) {
45
+ this.designer.setSelected(widget);
46
+ },
47
+
48
+ selectParentWidget() {
49
+ if (this.parentWidget) {
50
+ this.designer.setSelected(this.parentWidget);
51
+ } else {
52
+ this.designer.clearSelected();
53
+ }
54
+ },
55
+
56
+ moveUpWidget() {
57
+ this.designer.moveUpWidget(this.parentList, this.indexOfParentList);
58
+ this.designer.emitHistoryChange();
59
+ },
60
+
61
+ moveDownWidget() {
62
+ this.designer.moveDownWidget(this.parentList, this.indexOfParentList);
63
+ this.designer.emitHistoryChange();
64
+ },
65
+
66
+ cloneContainer(widget) {
67
+ if (!!this.parentList) {
68
+ let newCon = this.designer.cloneContainer(widget);
69
+ this.parentList.splice(this.indexOfParentList + 1, 0, newCon);
70
+ this.designer.setSelected(newCon);
71
+
72
+ this.designer.emitHistoryChange();
73
+ }
74
+ },
75
+
76
+ removeWidget() {
77
+ if (!!this.parentList) {
78
+ let nextSelected = null;
79
+ if (this.parentList.length === 1) {
80
+ if (!!this.parentWidget) {
81
+ nextSelected = this.parentWidget;
82
+ }
83
+ } else if (this.parentList.length === (1 + this.indexOfParentList)) {
84
+ nextSelected = this.parentList[this.indexOfParentList - 1];
85
+ } else {
86
+ nextSelected = this.parentList[this.indexOfParentList + 1];
87
+ }
88
+
89
+ this.$nextTick(() => {
90
+ this.parentList.splice(this.indexOfParentList, 1);
91
+ //if (!!nextSelected) {
92
+ this.designer.setSelected(nextSelected);
93
+ //}
94
+
95
+ this.designer.emitHistoryChange();
96
+ })
97
+ }
98
+ },
99
+
100
+ setWidgetOption(optionName, optionValue) { //通用组件选项修改API
101
+ if (this.widget.options.hasOwnProperty(optionName)) {
102
+ this.widget.options[optionName] = optionValue;
103
+ }
104
+ },
105
+ getI18nLabel(label, path, param) {
106
+ return !this.designState && label ? this.$t2(label, path, param) : label;
107
+ }
108
+
109
+ }
110
+ };
111
+
3
112
  export default modules;