cloud-web-corejs 1.0.54-dev.785 → 1.0.54-dev.787

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 (122) hide show
  1. package/package.json +2 -1
  2. package/src/components/VabUpload/index.vue +1 -1
  3. package/src/components/excelImport/index.js +69 -7
  4. package/src/components/excelImport/mixins.js +841 -9
  5. package/src/components/fileLibrary/fileHistoryDialog.vue +1 -1
  6. package/src/components/fileLibrary/fileObjAuthEdit.vue +1 -1
  7. package/src/components/fileLibrary/filterDialog.vue +1 -1
  8. package/src/components/formDialog/README.md +324 -241
  9. package/src/components/formDialog/actionButtons.js +90 -0
  10. package/src/components/formDialog/index.js +48 -35
  11. package/src/components/formDialog/index.vue +802 -724
  12. package/src/components/formDrawer/drawer.vue +719 -0
  13. package/src/components/formDrawer/index.js +50 -0
  14. package/src/components/onlineTalk/talkUserDialog.vue +1 -1
  15. package/src/components/tempStorage/tempStorageDialog.vue +1 -1
  16. package/src/components/wf/addTaskUserdialog.vue +1 -1
  17. package/src/components/xform/form-designer/form-widget/container-widget/data-table-widget.vue +1 -1
  18. package/src/components/xform/form-designer/form-widget/dialog/formDialog.vue +115 -4
  19. package/src/components/xform/form-designer/form-widget/dialog/formDrawer.vue +102 -5
  20. package/src/components/xform/form-designer/form-widget/dialog/formFieldDialog.vue +1 -1
  21. package/src/components/xform/form-designer/form-widget/dialog/vabSearchDialog.vue +1 -1
  22. package/src/components/xform/form-designer/setting-panel/action-button-config-dialog.vue +241 -0
  23. package/src/components/xform/form-designer/setting-panel/form-setting.vue +116 -0
  24. package/src/components/xform/form-designer/setting-panel/property-editor/container-detail/detail-editor.vue +6 -0
  25. package/src/components/xform/form-designer/widget-panel/widgetsConfig.js +1 -0
  26. package/src/components/xform/form-render/container-item/data-table-mixin.js +1460 -1460
  27. package/src/components/xform/form-render/container-item/detail-item.vue +11 -2
  28. package/src/components/xform/form-render/indexMixin.js +389 -379
  29. package/src/components/xform/mixins/defaultHandle.js +5 -8
  30. package/src/index.js +506 -472
  31. package/src/utils/lazyPlugin.js +66 -0
  32. package/src/views/bd/setting/bd_attach_setting/dialog.vue +1 -1
  33. package/src/views/bd/setting/bd_attach_setting/list.vue +1 -1
  34. package/src/views/bd/setting/bd_company_env/dialog.vue +1 -1
  35. package/src/views/bd/setting/bd_company_env/list.vue +1 -1
  36. package/src/views/bd/setting/formVersion/ftHistoryDialog.vue +1 -1
  37. package/src/views/bd/setting/form_import_log/list.vue +1 -1
  38. package/src/views/bd/setting/form_script/dialog.vue +1 -1
  39. package/src/views/bd/setting/form_script/form_list.vue +1 -1
  40. package/src/views/bd/setting/form_script/list.vue +1 -1
  41. package/src/views/bd/setting/form_script/list1.vue +1 -1
  42. package/src/views/bd/setting/form_template/dialog.vue +1 -1
  43. package/src/views/bd/setting/form_template/ftHistoryDialog.vue +1 -1
  44. package/src/views/bd/setting/form_template/itemList.vue +1 -1
  45. package/src/views/bd/setting/form_template/list.vue +1 -1
  46. package/src/views/bd/setting/form_template/wf_list.vue +1 -1
  47. package/src/views/bd/setting/logic_param/list.vue +1 -1
  48. package/src/views/bd/setting/menu_kind/dialog.vue +1 -1
  49. package/src/views/bd/setting/menu_kind/list.vue +1 -1
  50. package/src/views/bd/setting/push_data/list.vue +1 -1
  51. package/src/views/bd/setting/push_data_h/list.vue +1 -1
  52. package/src/views/bd/setting/request_async_setting/list.vue +1 -1
  53. package/src/views/bd/setting/request_setting/list.vue +1 -1
  54. package/src/views/bd/setting/table_model/dialog.vue +1 -1
  55. package/src/views/bd/setting/table_model/list.vue +1 -1
  56. package/src/views/bd/setting/table_model/zdDialog.vue +1 -1
  57. package/src/views/support/export_template/list.vue +1 -1
  58. package/src/views/user/access_log/list.vue +1 -1
  59. package/src/views/user/access_log/list2.vue +1 -1
  60. package/src/views/user/api_request/list.vue +1 -1
  61. package/src/views/user/area/dialog.vue +1 -1
  62. package/src/views/user/area/list.vue +1 -1
  63. package/src/views/user/bill_setting/list.vue +1 -1
  64. package/src/views/user/bill_setting/userDialog.vue +1 -1
  65. package/src/views/user/code_rules/list.vue +1 -1
  66. package/src/views/user/common_attribute/list.vue +1 -1
  67. package/src/views/user/common_script/list.vue +1 -1
  68. package/src/views/user/company_info/dialog.vue +1 -1
  69. package/src/views/user/country/dialog.vue +1 -1
  70. package/src/views/user/country/list.vue +1 -1
  71. package/src/views/user/data_type_setting/dialog.vue +1 -1
  72. package/src/views/user/extend_datasource/dialog.vue +1 -1
  73. package/src/views/user/extend_datasource/list.vue +1 -1
  74. package/src/views/user/fieldTranslation/list.vue +1 -1
  75. package/src/views/user/field_values_invisible/list.vue +1 -1
  76. package/src/views/user/file_type/list.vue +1 -1
  77. package/src/views/user/file_view_area/list.vue +1 -1
  78. package/src/views/user/form/form_template/dialog.vue +1 -1
  79. package/src/views/user/form/form_template/itemList.vue +1 -1
  80. package/src/views/user/form/form_template/list.vue +1 -1
  81. package/src/views/user/form/form_template_field/dialog.vue +1 -1
  82. package/src/views/user/form/form_type/dialog.vue +1 -1
  83. package/src/views/user/form/form_type/list.vue +1 -1
  84. package/src/views/user/form/report_requestaccess/dialog.vue +1 -1
  85. package/src/views/user/form/report_requestaccess/list.vue +1 -1
  86. package/src/views/user/groups/dialog.vue +1 -1
  87. package/src/views/user/groups/list.vue +1 -1
  88. package/src/views/user/lang_tag/dialog.vue +1 -1
  89. package/src/views/user/lang_tag/list.vue +1 -1
  90. package/src/views/user/language_setting/list.vue +1 -1
  91. package/src/views/user/menu/list.vue +1 -1
  92. package/src/views/user/mobile_menu/list.vue +1 -1
  93. package/src/views/user/notify_message/list.vue +1 -1
  94. package/src/views/user/notify_template/list.vue +1 -1
  95. package/src/views/user/notify_template/list2.vue +1 -1
  96. package/src/views/user/oplog/list.vue +1 -1
  97. package/src/views/user/position/dialog.vue +1 -1
  98. package/src/views/user/position/list.vue +1 -1
  99. package/src/views/user/project_tag/dialog.vue +1 -1
  100. package/src/views/user/project_tag/list.vue +1 -1
  101. package/src/views/user/push_setting/list.vue +1 -1
  102. package/src/views/user/request_setting/list.vue +1 -1
  103. package/src/views/user/role/dialog.vue +1 -1
  104. package/src/views/user/role/list.vue +1 -1
  105. package/src/views/user/sale_org/dialog.vue +1 -1
  106. package/src/views/user/sale_org/list.vue +1 -1
  107. package/src/views/user/system_notice/list.vue +1 -1
  108. package/src/views/user/system_parameter/list.vue +1 -1
  109. package/src/views/user/user/dialog.vue +1 -1
  110. package/src/views/user/user/form_dialog.vue +1 -1
  111. package/src/views/user/user/form_list.vue +1 -1
  112. package/src/views/user/user/list.vue +2 -2
  113. package/src/views/user/user_log_classify/list.vue +1 -1
  114. package/src/views/user/wf/wfReport/index.vue +2 -2
  115. package/src/views/user/wf/wf_auto_submit_data/list.vue +2 -2
  116. package/src/views/user/wf/wf_manage/list.vue +2 -2
  117. package/src/views/user/wf/wf_manage/list2.vue +2 -2
  118. package/src/views/user/wf/wf_obj_config/dialog.vue +1 -1
  119. package/src/views/user/wf/wf_obj_config/list.vue +1 -1
  120. package/src/views/user/wf/wf_obj_config/list_form.vue +1 -1
  121. package/src/views/user/wf/wf_transfer_setting/list.vue +1 -1
  122. package/src/views/user/workbench_menu/list.vue +1 -1
@@ -52,19 +52,19 @@ import formulaDialog from "@base/components/xform/form-designer/form-widget/dial
52
52
  import baseFormulaDialog from "@base/components/xform/form-designer/form-widget/dialog/baseFormulaDialog.vue";
53
53
  import QRCode from "qrcode";
54
54
  import { openLuckysheetDialog } from "@base/components/luckysheet";
55
- import {
56
- openComponentDialog as mountComponentDialog,
57
- } from "@base/utils/componentDialog";
58
- import {
59
- buildTreeSubmitData,
60
- copyTreeData,
61
- getTreeLoadState,
62
- isTemporaryTreeKey,
63
- resolveTreeCopyConfig,
64
- resolveTreeFields,
65
- resolveTreeIdentityConfig,
66
- resolveTreeSubmitConfig,
67
- } from "../utils/treeTableUtil";
55
+ import {
56
+ openComponentDialog as mountComponentDialog,
57
+ } from "@base/utils/componentDialog";
58
+ import {
59
+ buildTreeSubmitData,
60
+ copyTreeData,
61
+ getTreeLoadState,
62
+ isTemporaryTreeKey,
63
+ resolveTreeCopyConfig,
64
+ resolveTreeFields,
65
+ resolveTreeIdentityConfig,
66
+ resolveTreeSubmitConfig,
67
+ } from "../utils/treeTableUtil";
68
68
 
69
69
  let modules = {};
70
70
  const baseRefUtil = {
@@ -153,6 +153,11 @@ modules = {
153
153
  type: Object,
154
154
  default: null,
155
155
  },
156
+ plainDetailMode: {
157
+ // 素身详情模式(formDrawer 等宿主用):detail 容器不渲染标题栏、隐藏模块导航
158
+ type: Boolean,
159
+ default: false,
160
+ },
156
161
  },
157
162
  provide() {
158
163
  let e = this;
@@ -1293,12 +1298,12 @@ modules = {
1293
1298
 
1294
1299
  return hasModifyItem;
1295
1300
  },
1296
- loadFormData(options = {}) {
1297
- let config = options.config || {};
1301
+ loadFormData(options = {}) {
1302
+ let config = options.config || {};
1298
1303
  let that = this;
1299
1304
  let formConfig = this.formConfig;
1300
1305
  let entity = formConfig.entity;
1301
- let dataId = options.dataId ?? this.dataId;
1306
+ let dataId = options.dataId ?? this.dataId;
1302
1307
  let reportTemplate = this.reportTemplate;
1303
1308
  let scriptCode = formConfig.formScriptCode || "getOne";
1304
1309
 
@@ -1327,13 +1332,13 @@ modules = {
1327
1332
  ...formScriptParam,
1328
1333
  },
1329
1334
  },
1330
- ...defaultOption,
1331
- success: (res) => {
1332
- formData = res.objx || {};
1333
- this.setFormData(formData, {
1334
- replace: options.replace === true,
1335
- });
1336
- options.callback && options.callback(formData);
1335
+ ...defaultOption,
1336
+ success: (res) => {
1337
+ formData = res.objx || {};
1338
+ this.setFormData(formData, {
1339
+ replace: options.replace === true,
1340
+ });
1341
+ options.callback && options.callback(formData);
1337
1342
  },
1338
1343
  ...config,
1339
1344
  });
@@ -1434,6 +1439,9 @@ modules = {
1434
1439
  config: {
1435
1440
  successMsg: false,
1436
1441
  isConfirm: false,
1442
+ // 这次保存是「启动流程」的一环,保存完就要接着提交,不能让宿主重挂载
1443
+ // 把当前表单销毁;刷新交给 onWfStartSuccess / onWfStartAbort。
1444
+ skipHostReloadAfterSave: true,
1437
1445
  success: (res) => {
1438
1446
  done();
1439
1447
  },
@@ -1462,6 +1470,8 @@ modules = {
1462
1470
  config: {
1463
1471
  successMsg: false,
1464
1472
  isConfirm: false,
1473
+ // 同上:流程通过前的自动保存,后续由流程侧刷新,此处不重挂载。
1474
+ skipHostReloadAfterSave: true,
1465
1475
  success: (res) => {
1466
1476
  done();
1467
1477
  },
@@ -2001,22 +2011,22 @@ modules = {
2001
2011
  n
2002
2012
  );
2003
2013
  },
2004
- setFormData: function (e, options = {}) {
2005
- let t = this;
2014
+ setFormData: function (e, options = {}) {
2015
+ let t = this;
2006
2016
  /*Object.keys(this.formDataModel).forEach(function (i) {
2007
2017
  e && e.hasOwnProperty(i) && (t.formDataModel[i] = baseRefUtil.deepClone(e[i]));
2008
2018
  });*/
2009
- let nextFormData = baseRefUtil.deepClone(e || {});
2010
- if (options.replace === true) {
2011
- Object.keys(t.formDataModel).forEach((key) => {
2012
- t.$delete(t.formDataModel, key);
2013
- });
2014
- Object.keys(nextFormData).forEach((key) => {
2015
- t.$set(t.formDataModel, key, nextFormData[key]);
2016
- });
2017
- } else {
2018
- Object.assign(t.formDataModel, nextFormData);
2019
- }
2019
+ let nextFormData = baseRefUtil.deepClone(e || {});
2020
+ if (options.replace === true) {
2021
+ Object.keys(t.formDataModel).forEach((key) => {
2022
+ t.$delete(t.formDataModel, key);
2023
+ });
2024
+ Object.keys(nextFormData).forEach((key) => {
2025
+ t.$set(t.formDataModel, key, nextFormData[key]);
2026
+ });
2027
+ } else {
2028
+ Object.assign(t.formDataModel, nextFormData);
2029
+ }
2020
2030
  this.currentFormData = e || {};
2021
2031
  this.broadcast("ContainerItem", "setFormData", this.formDataModel),
2022
2032
  this.broadcast("FieldWidget", "setFormData", this.formDataModel);
@@ -3993,206 +4003,206 @@ modules = {
3993
4003
  reject(msg);
3994
4004
  });
3995
4005
  });
3996
- },
3997
- getTreeTableUtilContext(tableTarget, $grid, source) {
3998
- let treeConfig = $grid?.treeConfig || {};
3999
- let originOption
4000
- = $grid?.params?.originOption || $grid?.originOption || {};
4001
- let fields = resolveTreeFields(treeConfig, {
4002
- strict: true,
4003
- });
4004
- let identityConfig = resolveTreeIdentityConfig(
4005
- treeConfig,
4006
- originOption.treeIdentityConfig || {}
4007
- );
4008
- let copyConfig = resolveTreeCopyConfig(
4009
- fields,
4010
- identityConfig,
4011
- originOption.treeCopyConfig || {}
4012
- );
4013
- let submitConfig = resolveTreeSubmitConfig(
4014
- originOption.treeSubmitConfig || {}
4015
- );
4016
- let temporaryKeyRegistry
4017
- = tableTarget?.treeTemporaryKeyRegistry || new Set();
4018
- let knownFormalKeyRegistry
4019
- = tableTarget?.treeKnownFormalKeyRegistry || new Set();
4020
-
4021
- this.collectTreeRuntimeRows(source || [], treeConfig).forEach((row) => {
4022
- let rowValue = row[fields.rowField];
4023
- let marker = row._X_TREE_TEMP_KEY;
4024
- if (marker !== undefined && marker !== null) {
4025
- temporaryKeyRegistry.add(marker);
4026
- }
4027
- if (
4028
- rowValue !== undefined
4029
- && rowValue !== null
4030
- && rowValue !== ""
4031
- && !isTemporaryTreeKey(row, fields.rowField, identityConfig)
4032
- ) {
4033
- knownFormalKeyRegistry.add(rowValue);
4034
- }
4035
- });
4036
-
4037
- return {
4038
- fields,
4039
- identityConfig,
4040
- copyConfig,
4041
- submitConfig,
4042
- temporaryKeyRegistry,
4043
- knownFormalKeyRegistry,
4044
- };
4045
- },
4046
- collectTreeRuntimeRows(rows, treeConfig) {
4047
- let result = [];
4048
- let visited = new WeakSet();
4049
- let childrenFields = [
4050
- treeConfig?.children,
4051
- treeConfig?.mapChildren || "_X_ROW_CHILD",
4052
- ].filter(Boolean);
4053
- let visit = (items) => {
4054
- if (!Array.isArray(items)) return;
4055
- items.forEach((item) => {
4056
- if (!item || typeof item !== "object" || visited.has(item)) return;
4057
- visited.add(item);
4058
- result.push(item);
4059
- childrenFields.forEach((field) => {
4060
- visit(item[field]);
4061
- });
4062
- });
4063
- };
4064
- visit(rows);
4065
- return result;
4066
- },
4067
- getTreeRuntimeSource($grid, source) {
4068
- let result = Array.isArray(source) ? source.slice() : [];
4069
- let runtimeSources = [
4070
- $grid?.getTableData?.()?.fullData,
4071
- $grid?.$refs?.xTable?.tableFullTreeData,
4072
- ];
4073
- runtimeSources.forEach((rows) => {
4074
- if (!Array.isArray(rows)) return;
4075
- rows.forEach((row) => {
4076
- if (!result.includes(row)) result.push(row);
4077
- });
4078
- });
4079
- return result;
4080
- },
4081
- getTreeUnloadedRows($grid, treeConfig) {
4082
- let xTable = $grid?.$refs?.xTable;
4083
- let fullData = this.getTreeRuntimeSource($grid, []);
4084
- return this.collectTreeRuntimeRows(fullData, treeConfig).filter(
4085
- (row) =>
4086
- getTreeLoadState(row, {
4087
- fields: resolveTreeFields(treeConfig),
4088
- isTreeNodeLoaded:
4089
- typeof xTable?.isTreeExpandLoaded === "function"
4090
- ? (targetRow) => xTable.isTreeExpandLoaded(targetRow)
4091
- : null,
4092
- }).requiresLoad
4093
- );
4094
- },
4095
- async ensureTreeTableLoadState(formTemplateTableDTO, operation) {
4096
- let tableTarget = this.getWidgetRef(formTemplateTableDTO.uniqueName);
4097
- let $grid = tableTarget?.getGridTable?.();
4098
- let treeConfig = $grid?.treeConfig;
4099
- if (!$grid || !treeConfig?.lazy) return;
4100
-
4101
- let treeContext = this.getTreeTableUtilContext(
4102
- tableTarget,
4103
- $grid,
4104
- this.formDataModel[formTemplateTableDTO.name] || []
4105
- );
4106
- let strategy = operation === "copy"
4107
- ? treeContext.copyConfig.lazyStrategy
4108
- : treeContext.submitConfig.unloadedChildrenStrategy;
4109
- if (operation === "submit" && strategy === "omit") return;
4110
-
4111
- let xTable = $grid.$refs?.xTable;
4112
- if (
4113
- !xTable
4114
- || typeof xTable.isTreeExpandLoaded !== "function"
4115
- || typeof $grid.setTreeExpand !== "function"
4116
- ) {
4117
- throw new Error(
4118
- `[${formTemplateTableDTO.tableAlias}]无法读取树节点加载状态`
4119
- );
4120
- }
4121
-
4122
- let unloadedRows = this.getTreeUnloadedRows($grid, treeConfig);
4123
- if (!unloadedRows.length) return;
4124
- if (strategy !== "loadAll") {
4125
- let action = operation === "copy" ? "复制" : "保存";
4126
- throw new Error(
4127
- `[${formTemplateTableDTO.tableAlias}]存在尚未加载的树节点,请先展开后再${action}`
4128
- );
4129
- }
4130
-
4131
- let loopCount = 0;
4132
- while (unloadedRows.length) {
4133
- if (loopCount++ > 100) {
4134
- throw new Error(
4135
- `[${formTemplateTableDTO.tableAlias}]树节点层级过深,无法完成加载`
4136
- );
4137
- }
4138
- let currentRows = unloadedRows;
4139
- await Promise.all(
4140
- currentRows.map((row) => $grid.setTreeExpand(row, true))
4141
- );
4142
- unloadedRows = this.getTreeUnloadedRows($grid, treeConfig);
4143
- if (
4144
- unloadedRows.length === currentRows.length
4145
- && unloadedRows.every((row) => currentRows.includes(row))
4146
- ) {
4147
- throw new Error(
4148
- `[${formTemplateTableDTO.tableAlias}]树节点加载未完成,已停止保存`
4149
- );
4150
- }
4151
- }
4152
- },
4153
- async ensureTreeTableReadyForSubmit(formTemplateTableDTO) {
4154
- return this.ensureTreeTableLoadState(
4155
- formTemplateTableDTO,
4156
- "submit"
4157
- );
4158
- },
4159
- async prepareTreeTablesForCopy() {
4160
- let treeTables = this.getFormTemplateTableDTOs().filter(
4161
- (item) => item.isTreeTable
4162
- );
4163
- for (let index = 0; index < treeTables.length; index++) {
4164
- await this.ensureTreeTableLoadState(treeTables[index], "copy");
4165
- }
4166
- },
4167
- async buildSubmitPayload(option) {
4168
- let treeTables = this.getFormTemplateTableDTOs().filter(
4169
- (item) => item.isTreeTable
4170
- );
4171
- for (let index = 0; index < treeTables.length; index++) {
4172
- await this.ensureTreeTableReadyForSubmit(treeTables[index]);
4173
- }
4174
- let formDataSnapshot = this.$baseLodash.cloneDeep(this.formDataModel);
4175
- let subData = this.getSubData2(false, {
4176
- mode: "submit",
4177
- formDataModel: formDataSnapshot,
4178
- });
4179
- if (option) {
4180
- let realFormData = {};
4181
- Object.keys(option).forEach((key) => {
4182
- realFormData[option[key]] = subData[key];
4183
- });
4184
- return realFormData;
4185
- }
4186
- return subData;
4187
- },
4188
- getSubData2(flag, context = {}) {
4006
+ },
4007
+ getTreeTableUtilContext(tableTarget, $grid, source) {
4008
+ let treeConfig = $grid?.treeConfig || {};
4009
+ let originOption
4010
+ = $grid?.params?.originOption || $grid?.originOption || {};
4011
+ let fields = resolveTreeFields(treeConfig, {
4012
+ strict: true,
4013
+ });
4014
+ let identityConfig = resolveTreeIdentityConfig(
4015
+ treeConfig,
4016
+ originOption.treeIdentityConfig || {}
4017
+ );
4018
+ let copyConfig = resolveTreeCopyConfig(
4019
+ fields,
4020
+ identityConfig,
4021
+ originOption.treeCopyConfig || {}
4022
+ );
4023
+ let submitConfig = resolveTreeSubmitConfig(
4024
+ originOption.treeSubmitConfig || {}
4025
+ );
4026
+ let temporaryKeyRegistry
4027
+ = tableTarget?.treeTemporaryKeyRegistry || new Set();
4028
+ let knownFormalKeyRegistry
4029
+ = tableTarget?.treeKnownFormalKeyRegistry || new Set();
4030
+
4031
+ this.collectTreeRuntimeRows(source || [], treeConfig).forEach((row) => {
4032
+ let rowValue = row[fields.rowField];
4033
+ let marker = row._X_TREE_TEMP_KEY;
4034
+ if (marker !== undefined && marker !== null) {
4035
+ temporaryKeyRegistry.add(marker);
4036
+ }
4037
+ if (
4038
+ rowValue !== undefined
4039
+ && rowValue !== null
4040
+ && rowValue !== ""
4041
+ && !isTemporaryTreeKey(row, fields.rowField, identityConfig)
4042
+ ) {
4043
+ knownFormalKeyRegistry.add(rowValue);
4044
+ }
4045
+ });
4046
+
4047
+ return {
4048
+ fields,
4049
+ identityConfig,
4050
+ copyConfig,
4051
+ submitConfig,
4052
+ temporaryKeyRegistry,
4053
+ knownFormalKeyRegistry,
4054
+ };
4055
+ },
4056
+ collectTreeRuntimeRows(rows, treeConfig) {
4057
+ let result = [];
4058
+ let visited = new WeakSet();
4059
+ let childrenFields = [
4060
+ treeConfig?.children,
4061
+ treeConfig?.mapChildren || "_X_ROW_CHILD",
4062
+ ].filter(Boolean);
4063
+ let visit = (items) => {
4064
+ if (!Array.isArray(items)) return;
4065
+ items.forEach((item) => {
4066
+ if (!item || typeof item !== "object" || visited.has(item)) return;
4067
+ visited.add(item);
4068
+ result.push(item);
4069
+ childrenFields.forEach((field) => {
4070
+ visit(item[field]);
4071
+ });
4072
+ });
4073
+ };
4074
+ visit(rows);
4075
+ return result;
4076
+ },
4077
+ getTreeRuntimeSource($grid, source) {
4078
+ let result = Array.isArray(source) ? source.slice() : [];
4079
+ let runtimeSources = [
4080
+ $grid?.getTableData?.()?.fullData,
4081
+ $grid?.$refs?.xTable?.tableFullTreeData,
4082
+ ];
4083
+ runtimeSources.forEach((rows) => {
4084
+ if (!Array.isArray(rows)) return;
4085
+ rows.forEach((row) => {
4086
+ if (!result.includes(row)) result.push(row);
4087
+ });
4088
+ });
4089
+ return result;
4090
+ },
4091
+ getTreeUnloadedRows($grid, treeConfig) {
4092
+ let xTable = $grid?.$refs?.xTable;
4093
+ let fullData = this.getTreeRuntimeSource($grid, []);
4094
+ return this.collectTreeRuntimeRows(fullData, treeConfig).filter(
4095
+ (row) =>
4096
+ getTreeLoadState(row, {
4097
+ fields: resolveTreeFields(treeConfig),
4098
+ isTreeNodeLoaded:
4099
+ typeof xTable?.isTreeExpandLoaded === "function"
4100
+ ? (targetRow) => xTable.isTreeExpandLoaded(targetRow)
4101
+ : null,
4102
+ }).requiresLoad
4103
+ );
4104
+ },
4105
+ async ensureTreeTableLoadState(formTemplateTableDTO, operation) {
4106
+ let tableTarget = this.getWidgetRef(formTemplateTableDTO.uniqueName);
4107
+ let $grid = tableTarget?.getGridTable?.();
4108
+ let treeConfig = $grid?.treeConfig;
4109
+ if (!$grid || !treeConfig?.lazy) return;
4110
+
4111
+ let treeContext = this.getTreeTableUtilContext(
4112
+ tableTarget,
4113
+ $grid,
4114
+ this.formDataModel[formTemplateTableDTO.name] || []
4115
+ );
4116
+ let strategy = operation === "copy"
4117
+ ? treeContext.copyConfig.lazyStrategy
4118
+ : treeContext.submitConfig.unloadedChildrenStrategy;
4119
+ if (operation === "submit" && strategy === "omit") return;
4120
+
4121
+ let xTable = $grid.$refs?.xTable;
4122
+ if (
4123
+ !xTable
4124
+ || typeof xTable.isTreeExpandLoaded !== "function"
4125
+ || typeof $grid.setTreeExpand !== "function"
4126
+ ) {
4127
+ throw new Error(
4128
+ `[${formTemplateTableDTO.tableAlias}]无法读取树节点加载状态`
4129
+ );
4130
+ }
4131
+
4132
+ let unloadedRows = this.getTreeUnloadedRows($grid, treeConfig);
4133
+ if (!unloadedRows.length) return;
4134
+ if (strategy !== "loadAll") {
4135
+ let action = operation === "copy" ? "复制" : "保存";
4136
+ throw new Error(
4137
+ `[${formTemplateTableDTO.tableAlias}]存在尚未加载的树节点,请先展开后再${action}`
4138
+ );
4139
+ }
4140
+
4141
+ let loopCount = 0;
4142
+ while (unloadedRows.length) {
4143
+ if (loopCount++ > 100) {
4144
+ throw new Error(
4145
+ `[${formTemplateTableDTO.tableAlias}]树节点层级过深,无法完成加载`
4146
+ );
4147
+ }
4148
+ let currentRows = unloadedRows;
4149
+ await Promise.all(
4150
+ currentRows.map((row) => $grid.setTreeExpand(row, true))
4151
+ );
4152
+ unloadedRows = this.getTreeUnloadedRows($grid, treeConfig);
4153
+ if (
4154
+ unloadedRows.length === currentRows.length
4155
+ && unloadedRows.every((row) => currentRows.includes(row))
4156
+ ) {
4157
+ throw new Error(
4158
+ `[${formTemplateTableDTO.tableAlias}]树节点加载未完成,已停止保存`
4159
+ );
4160
+ }
4161
+ }
4162
+ },
4163
+ async ensureTreeTableReadyForSubmit(formTemplateTableDTO) {
4164
+ return this.ensureTreeTableLoadState(
4165
+ formTemplateTableDTO,
4166
+ "submit"
4167
+ );
4168
+ },
4169
+ async prepareTreeTablesForCopy() {
4170
+ let treeTables = this.getFormTemplateTableDTOs().filter(
4171
+ (item) => item.isTreeTable
4172
+ );
4173
+ for (let index = 0; index < treeTables.length; index++) {
4174
+ await this.ensureTreeTableLoadState(treeTables[index], "copy");
4175
+ }
4176
+ },
4177
+ async buildSubmitPayload(option) {
4178
+ let treeTables = this.getFormTemplateTableDTOs().filter(
4179
+ (item) => item.isTreeTable
4180
+ );
4181
+ for (let index = 0; index < treeTables.length; index++) {
4182
+ await this.ensureTreeTableReadyForSubmit(treeTables[index]);
4183
+ }
4184
+ let formDataSnapshot = this.$baseLodash.cloneDeep(this.formDataModel);
4185
+ let subData = this.getSubData2(false, {
4186
+ mode: "submit",
4187
+ formDataModel: formDataSnapshot,
4188
+ });
4189
+ if (option) {
4190
+ let realFormData = {};
4191
+ Object.keys(option).forEach((key) => {
4192
+ realFormData[option[key]] = subData[key];
4193
+ });
4194
+ return realFormData;
4195
+ }
4196
+ return subData;
4197
+ },
4198
+ getSubData2(flag, context = {}) {
4189
4199
  let that = this;
4190
4200
  let formCode = this.reportTemplate.formCode;
4191
4201
  let tableFiledMap = this.getTableFiledMap();
4192
4202
  let formTemplateTableDTOs = this.getFormTemplateTableDTOs();
4193
- let formDataModel
4194
- = context.formDataModel
4195
- || this.$baseLodash.cloneDeep(this.formDataModel);
4203
+ let formDataModel
4204
+ = context.formDataModel
4205
+ || this.$baseLodash.cloneDeep(this.formDataModel);
4196
4206
  let formConfig = this.formConfig;
4197
4207
 
4198
4208
  let res = {};
@@ -4227,32 +4237,32 @@ modules = {
4227
4237
  newFormData[tableAlias] = item ?? null;
4228
4238
  } else {
4229
4239
  if (formTemplateTableDTO.isTreeTable) {
4230
- let tableTarget = this.getWidgetRef(
4231
- formTemplateTableDTO.uniqueName
4232
- );
4233
- let $grid = tableTarget.getGridTable();
4234
- let treeTaBm = newFormData.treeTaBm || [];
4235
- treeTaBm.push(formTemplateTableDTO.tableAlias);
4236
- newFormData.treeTaBm = treeTaBm;
4237
- let modelRows = formDataModel[formTemplateTableDTO.name];
4238
- let sourceRows = Array.isArray(modelRows) ? modelRows : [];
4239
- let treeContext = this.getTreeTableUtilContext(
4240
- tableTarget,
4241
- $grid,
4242
- sourceRows
4243
- );
4244
- newFormData[tableAlias] = buildTreeSubmitData(sourceRows, {
4245
- ...treeContext,
4246
- submitConfig:
4247
- context.mode === "submit"
4248
- ? treeContext.submitConfig
4249
- : {
4250
- ...treeContext.submitConfig,
4251
- orphanParentStrategy: "preserve",
4252
- },
4253
- strict: context.mode === "submit",
4254
- });
4255
- } else {
4240
+ let tableTarget = this.getWidgetRef(
4241
+ formTemplateTableDTO.uniqueName
4242
+ );
4243
+ let $grid = tableTarget.getGridTable();
4244
+ let treeTaBm = newFormData.treeTaBm || [];
4245
+ treeTaBm.push(formTemplateTableDTO.tableAlias);
4246
+ newFormData.treeTaBm = treeTaBm;
4247
+ let modelRows = formDataModel[formTemplateTableDTO.name];
4248
+ let sourceRows = Array.isArray(modelRows) ? modelRows : [];
4249
+ let treeContext = this.getTreeTableUtilContext(
4250
+ tableTarget,
4251
+ $grid,
4252
+ sourceRows
4253
+ );
4254
+ newFormData[tableAlias] = buildTreeSubmitData(sourceRows, {
4255
+ ...treeContext,
4256
+ submitConfig:
4257
+ context.mode === "submit"
4258
+ ? treeContext.submitConfig
4259
+ : {
4260
+ ...treeContext.submitConfig,
4261
+ orphanParentStrategy: "preserve",
4262
+ },
4263
+ strict: context.mode === "submit",
4264
+ });
4265
+ } else {
4256
4266
  newFormData[tableAlias] =
4257
4267
  formDataModel[formTemplateTableDTO.name] ?? null;
4258
4268
  }
@@ -4449,10 +4459,10 @@ modules = {
4449
4459
  this.$baseReload();
4450
4460
  }
4451
4461
  },
4452
- reloadForm(option) {
4453
- let target1 = this.$attrs["parent-target"];
4454
- let target2 = target1?.$attrs["parent-target"];
4455
- let target = !target2 ? this : target1;
4462
+ reloadForm(option) {
4463
+ let target1 = this.$attrs["parent-target"];
4464
+ let target2 = target1?.$attrs["parent-target"];
4465
+ let target = !target2 ? this : target1;
4456
4466
  /* if (this.$attrs['reloadDialog'] !== true) {
4457
4467
  target = this.$attrs['parent-target'];
4458
4468
  }else{
@@ -4462,44 +4472,44 @@ modules = {
4462
4472
  for (let key in updateParam) {
4463
4473
  target.$emit("update:" + key, updateParam[key]);
4464
4474
  }*/
4465
- try {
4466
- let reloadListener = target?.$listeners?.reload;
4467
- if (Array.isArray(reloadListener)) {
4468
- return Promise.all(
4469
- reloadListener.map((listener) => listener(target, option))
4470
- );
4471
- }
4472
- if (typeof reloadListener === "function") {
4473
- return Promise.resolve(reloadListener(target, option));
4474
- }
4475
- return Promise.resolve(target.$baseReload(option));
4476
- } catch (error) {
4477
- return Promise.reject(error);
4478
- }
4479
- },
4480
- async reloadSavedFormData(option = {}) {
4481
- let updateParam = option.updateParam || {};
4482
- let nextDataId = updateParam.dataId ?? this.dataId;
4483
- let nextFormCode = updateParam.formCode;
4484
- if (nextDataId === undefined || nextDataId === null || nextDataId === "") {
4485
- throw new Error("缺少保存后的数据 ID,无法重新加载表单。");
4486
- }
4487
- let response = await this.loadFormData({
4488
- dataId: nextDataId,
4489
- replace: true,
4490
- });
4491
- if (!response || response.type !== "success") {
4492
- throw new Error(response?.content || "保存后的表单数据重新加载失败。");
4493
- }
4494
- if (nextDataId !== undefined && nextDataId !== null) {
4495
- this.$emit("update:dataId", nextDataId);
4496
- }
4497
- if (nextFormCode) {
4498
- this.$emit("update:formCode", nextFormCode);
4499
- }
4500
- await new Promise((resolve) => this.$nextTick(resolve));
4501
- return response;
4502
- },
4475
+ try {
4476
+ let reloadListener = target?.$listeners?.reload;
4477
+ if (Array.isArray(reloadListener)) {
4478
+ return Promise.all(
4479
+ reloadListener.map((listener) => listener(target, option))
4480
+ );
4481
+ }
4482
+ if (typeof reloadListener === "function") {
4483
+ return Promise.resolve(reloadListener(target, option));
4484
+ }
4485
+ return Promise.resolve(target.$baseReload(option));
4486
+ } catch (error) {
4487
+ return Promise.reject(error);
4488
+ }
4489
+ },
4490
+ async reloadSavedFormData(option = {}) {
4491
+ let updateParam = option.updateParam || {};
4492
+ let nextDataId = updateParam.dataId ?? this.dataId;
4493
+ let nextFormCode = updateParam.formCode;
4494
+ if (nextDataId === undefined || nextDataId === null || nextDataId === "") {
4495
+ throw new Error("缺少保存后的数据 ID,无法重新加载表单。");
4496
+ }
4497
+ let response = await this.loadFormData({
4498
+ dataId: nextDataId,
4499
+ replace: true,
4500
+ });
4501
+ if (!response || response.type !== "success") {
4502
+ throw new Error(response?.content || "保存后的表单数据重新加载失败。");
4503
+ }
4504
+ if (nextDataId !== undefined && nextDataId !== null) {
4505
+ this.$emit("update:dataId", nextDataId);
4506
+ }
4507
+ if (nextFormCode) {
4508
+ this.$emit("update:formCode", nextFormCode);
4509
+ }
4510
+ await new Promise((resolve) => this.$nextTick(resolve));
4511
+ return response;
4512
+ },
4503
4513
  saveForm(callback) {
4504
4514
  this.validateForm((valid) => {
4505
4515
  if (!valid) return;
@@ -4894,69 +4904,69 @@ modules = {
4894
4904
  getFormRef() {
4895
4905
  return this;
4896
4906
  },
4897
- isObject(value) {
4898
- return Object.prototype.toString.call(value) === "[object Object]";
4899
- },
4900
- handleCopyTreeData(value, widget) {
4901
- if (!Array.isArray(value) || !widget) return;
4902
-
4903
- let widgetName = widget.options.name;
4904
- let gridRef = this.getWidgetRef(widgetName);
4905
- let $grid = gridRef?.getGridTable?.();
4906
- if (!$grid) {
4907
- throw new Error(`[${widgetName}]树表尚未初始化`);
4908
- }
4909
- if (
4910
- $grid.treeConfig?.lazy
4911
- && this.getTreeUnloadedRows($grid, $grid.treeConfig).length
4912
- ) {
4913
- throw new Error(
4914
- `[${widgetName}]存在尚未加载的树节点,无法复制不完整子树`
4915
- );
4916
- }
4917
-
4918
- // prepareTreeTablesForCopy 会在深拷贝及 copyDataHandle 之前完成 loadAll,
4919
- // 此处只消费准备好的副本;不能再混入 VXE 活对象,否则会覆盖脚本修改并产生同键冲突。
4920
- let sourceRows = value;
4921
- if (!sourceRows.length) return;
4922
-
4923
- let treeContext = this.getTreeTableUtilContext(
4924
- gridRef,
4925
- $grid,
4926
- sourceRows
4927
- );
4928
- let copiedRows = copyTreeData(sourceRows, {
4929
- ...treeContext,
4930
- temporaryKeyRegistry: new Set(
4931
- treeContext.temporaryKeyRegistry
4932
- ),
4933
- targetRows: [],
4934
- });
4935
- let fields = treeContext.fields;
4936
- let ignoredFields = new Set([
4937
- fields.rowField,
4938
- fields.parentField,
4939
- fields.childrenField,
4940
- fields.mapChildrenField,
4941
- fields.hasChildField,
4942
- treeContext.identityConfig.physicalIdField,
4943
- "_X_ROW_KEY",
4944
- "_X_ROW_CHILD",
4945
- "_X_TREE_TEMP_KEY",
4946
- "f_wbs",
4947
- ]);
4948
-
4949
- copiedRows.forEach((row) => {
4950
- this.handleCopyDefaultData(row);
4951
- Object.keys(row).forEach((key) => {
4952
- if (ignoredFields.has(key) || !Array.isArray(row[key])) return;
4953
- this.handleCopyData(row[key], key);
4954
- });
4955
- });
4956
-
4957
- value.splice(0, value.length, ...copiedRows);
4958
- },
4959
- handleCopyDefaultData(data) {
4907
+ isObject(value) {
4908
+ return Object.prototype.toString.call(value) === "[object Object]";
4909
+ },
4910
+ handleCopyTreeData(value, widget) {
4911
+ if (!Array.isArray(value) || !widget) return;
4912
+
4913
+ let widgetName = widget.options.name;
4914
+ let gridRef = this.getWidgetRef(widgetName);
4915
+ let $grid = gridRef?.getGridTable?.();
4916
+ if (!$grid) {
4917
+ throw new Error(`[${widgetName}]树表尚未初始化`);
4918
+ }
4919
+ if (
4920
+ $grid.treeConfig?.lazy
4921
+ && this.getTreeUnloadedRows($grid, $grid.treeConfig).length
4922
+ ) {
4923
+ throw new Error(
4924
+ `[${widgetName}]存在尚未加载的树节点,无法复制不完整子树`
4925
+ );
4926
+ }
4927
+
4928
+ // prepareTreeTablesForCopy 会在深拷贝及 copyDataHandle 之前完成 loadAll,
4929
+ // 此处只消费准备好的副本;不能再混入 VXE 活对象,否则会覆盖脚本修改并产生同键冲突。
4930
+ let sourceRows = value;
4931
+ if (!sourceRows.length) return;
4932
+
4933
+ let treeContext = this.getTreeTableUtilContext(
4934
+ gridRef,
4935
+ $grid,
4936
+ sourceRows
4937
+ );
4938
+ let copiedRows = copyTreeData(sourceRows, {
4939
+ ...treeContext,
4940
+ temporaryKeyRegistry: new Set(
4941
+ treeContext.temporaryKeyRegistry
4942
+ ),
4943
+ targetRows: [],
4944
+ });
4945
+ let fields = treeContext.fields;
4946
+ let ignoredFields = new Set([
4947
+ fields.rowField,
4948
+ fields.parentField,
4949
+ fields.childrenField,
4950
+ fields.mapChildrenField,
4951
+ fields.hasChildField,
4952
+ treeContext.identityConfig.physicalIdField,
4953
+ "_X_ROW_KEY",
4954
+ "_X_ROW_CHILD",
4955
+ "_X_TREE_TEMP_KEY",
4956
+ "f_wbs",
4957
+ ]);
4958
+
4959
+ copiedRows.forEach((row) => {
4960
+ this.handleCopyDefaultData(row);
4961
+ Object.keys(row).forEach((key) => {
4962
+ if (ignoredFields.has(key) || !Array.isArray(row[key])) return;
4963
+ this.handleCopyData(row[key], key);
4964
+ });
4965
+ });
4966
+
4967
+ value.splice(0, value.length, ...copiedRows);
4968
+ },
4969
+ handleCopyDefaultData(data) {
4960
4970
  data.create_by = null;
4961
4971
  data._create_by = null;
4962
4972
  data.create_date = null;
@@ -5011,22 +5021,22 @@ modules = {
5011
5021
  });
5012
5022
  }
5013
5023
  },
5014
- async openCopyEditTab(copyData) {
5015
- try {
5016
- await this.prepareTreeTablesForCopy();
5017
- let formData = this.$baseLodash.cloneDeep(
5018
- copyData || this.formDataModel
5019
- );
5020
- if (formData) {
5021
- this.handleCopyData(formData);
5022
- }
5023
- this.$emit("openCopyEditTab", formData);
5024
- return true;
5025
- } catch (error) {
5026
- this.$message.error(error?.message || "树表数据尚未准备完成");
5027
- return false;
5028
- }
5029
- },
5024
+ async openCopyEditTab(copyData) {
5025
+ try {
5026
+ await this.prepareTreeTablesForCopy();
5027
+ let formData = this.$baseLodash.cloneDeep(
5028
+ copyData || this.formDataModel
5029
+ );
5030
+ if (formData) {
5031
+ this.handleCopyData(formData);
5032
+ }
5033
+ this.$emit("openCopyEditTab", formData);
5034
+ return true;
5035
+ } catch (error) {
5036
+ this.$message.error(error?.message || "树表数据尚未准备完成");
5037
+ return false;
5038
+ }
5039
+ },
5030
5040
 
5031
5041
  async exportPdf() {
5032
5042
  // statusEl.style.display = 'block';