cloud-web-corejs 1.0.54-dev.801 → 1.0.54-dev.803

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 (36) hide show
  1. package/package.json +1 -1
  2. package/src/components/baseArea/index.vue +82 -27
  3. package/src/components/table/tableForm.vue +16 -5
  4. package/src/components/table/tableFormMixin.js +35 -7
  5. package/src/components/wf/content.vue +9 -1
  6. package/src/components/wf/wfActionDropdown.vue +32 -5
  7. package/src/components/wf/wfActionItems.js +22 -2
  8. package/src/components/wf/wfUtil.js +34 -10
  9. package/src/components/xform/form-designer/designer.js +6 -1
  10. package/src/components/xform/form-designer/form-widget/container-widget/data-table-widget.vue +9 -3
  11. package/src/components/xform/form-designer/form-widget/field-widget/date-range-widget.vue +3 -2
  12. package/src/components/xform/form-designer/form-widget/field-widget/date-widget.vue +3 -12
  13. package/src/components/xform/form-designer/form-widget/field-widget/mixins/date-limit-mixin.js +2 -46
  14. package/src/components/xform/form-designer/form-widget/field-widget/mixins/relative-default-mixin.js +107 -0
  15. package/src/components/xform/form-designer/form-widget/field-widget/mixins/relativeDateUtil.js +321 -0
  16. package/src/components/xform/form-designer/form-widget/field-widget/mixins/time-limit-mixin.js +2 -17
  17. package/src/components/xform/form-designer/form-widget/field-widget/time-range-widget.vue +3 -2
  18. package/src/components/xform/form-designer/form-widget/field-widget/time-widget.vue +3 -12
  19. package/src/components/xform/form-designer/setting-panel/property-editor/field-date/date-defaultValue-editor.vue +35 -36
  20. package/src/components/xform/form-designer/setting-panel/property-editor/field-date-range/date-range-defaultValue-editor.vue +35 -18
  21. package/src/components/xform/form-designer/setting-panel/property-editor/field-time/time-defaultValue-editor.vue +34 -36
  22. package/src/components/xform/form-designer/setting-panel/property-editor/field-time-range/time-range-defaultValue-editor.vue +35 -18
  23. package/src/components/xform/form-designer/setting-panel/property-editor/fixedQuery-editor.vue +39 -0
  24. package/src/components/xform/form-designer/setting-panel/property-editor/relative-default-block.vue +369 -0
  25. package/src/components/xform/form-designer/setting-panel/propertyRegister.js +1 -0
  26. package/src/components/xform/form-designer/widget-panel/widgetsConfig.js +34 -2
  27. package/src/components/xform/form-render/container-item/data-table-mixin.js +116 -74
  28. package/src/components/xform/lang/en-US.js +3 -0
  29. package/src/components/xform/lang/zh-CN.js +3 -0
  30. package/src/components/xform/utils/fixedQueryUtil.js +93 -0
  31. package/src/views/user/home/wjl/content.vue +1206 -0
  32. package/src/views/user/menu/voc_list.vue +686 -0
  33. package/src/views/user/role/edit.vue +32 -9
  34. package/src/views/user/role/list.vue +142 -67
  35. package/src/views/user/role/voc_edit.vue +282 -0
  36. package/src/views/user/wf/wf_manage/list.vue +17 -1
@@ -27,6 +27,7 @@ import {
27
27
  resolveColumnRequiredFlag,
28
28
  } from "../../../../components/xform/utils/tableColumnHelper";
29
29
  import { mergeQueryParam } from "../../../../components/xform/utils/queryParamUtil";
30
+ import { isFixedQueryWidget } from "../../../../components/xform/utils/fixedQueryUtil";
30
31
  import { isUrlValueColumn } from "../../../../components/xform/utils/attachmentValueUtil";
31
32
  import {
32
33
  EXPORT_TYPE,
@@ -1581,17 +1582,21 @@ modules = {
1581
1582
  * @param {Object} options 可覆盖默认重置行为。
1582
1583
  */
1583
1584
  resetForm(options) {
1584
- let formData = this.formModel;
1585
1585
  let ignoreFields = options?.ignoreFields || [];
1586
- this.widget.widgetList.forEach((subWidget) => {
1587
- if (
1588
- !ignoreFields.length ||
1589
- !ignoreFields.includes(subWidget.options.name)
1590
- ) {
1591
- let widgetRef = this.getWidgetRef(subWidget.options.name);
1592
- if (widgetRef && widgetRef.setValue) widgetRef.setValue(null);
1593
- if (this.isVabsearchFlagWidget(subWidget))
1594
- widgetRef.setShowValue(null);
1586
+ // getSearchFormData 同口径递归各类容器:查询字段放进栅格/标签页等容器后
1587
+ // 一样要被清空,容器节点本身跳过。
1588
+ loopHandleWidget(this.widget.widgetList, (subWidget) => {
1589
+ if (subWidget.category === "container") return;
1590
+ let widgetName = subWidget.options.name;
1591
+ // 固定查询条件与调用方传的 ignoreFields 取并集,一并跳过
1592
+ if (ignoreFields.includes(widgetName) || isFixedQueryWidget(subWidget)) {
1593
+ return;
1594
+ }
1595
+ let widgetRef = this.getWidgetRef(widgetName);
1596
+ if (!widgetRef) return;
1597
+ if (widgetRef.setValue) widgetRef.setValue(null);
1598
+ if (this.isVabsearchFlagWidget(subWidget) && widgetRef.setShowValue) {
1599
+ widgetRef.setShowValue(null);
1595
1600
  }
1596
1601
  });
1597
1602
  },
@@ -1683,17 +1688,22 @@ modules = {
1683
1688
  getSearchCondition: function () {
1684
1689
  let extraAccessData = this.extraAccessData || {};
1685
1690
  let searchFormData = this.getSearchFormData();
1686
- let defaultData = {};
1687
1691
 
1688
1692
  // let globalReqData = baseRefUtil.getReportGlobalMap();//全局请求参数
1689
- let tableCondition = this.getTableCondition();
1693
+ let tableCondition = this.getTableCondition() || {};
1690
1694
  let conditions = {
1691
- ...defaultData,
1692
1695
  ...tableCondition,
1693
1696
  ...searchFormData,
1694
1697
  ...extraAccessData,
1695
1698
  // ...globalReqData
1696
1699
  };
1700
+ // tableCondition 的 condition 此前恒被 searchFormData 顶掉(getSearchFormData
1701
+ // 一定返回 condition 数组),等于这个通道只能传平铺参数。改为与宿主 queryParam
1702
+ // 同一套追加合并规则:同 field 以 tableCondition 为准。整体优先级
1703
+ // 查询区用户输入 < tableCondition < 宿主 queryParam(后者在 ajax.query 里合并)。
1704
+ if (tableCondition.condition) {
1705
+ mergeQueryParam(conditions, { condition: tableCondition.condition });
1706
+ }
1697
1707
  return conditions;
1698
1708
  },
1699
1709
  /**
@@ -2120,6 +2130,10 @@ modules = {
2120
2130
  let type = item.type ?? null;
2121
2131
  // let widgetType = item.widgetType ?? widgetType;
2122
2132
  // let isRange = item.isRange || false;
2133
+ // 固定查询条件:lockValue 让公共表格层跳过写值(刷新/还原/确定都不清它),
2134
+ // fixed 复用公共层已有语义,让个性化 json 回灌时不挪位置、不改常用。
2135
+ // 两者分开的原因见 utils/fixedQueryUtil.js 文件头。
2136
+ let fixedQuery = isFixedQueryWidget(widget);
2123
2137
  searchColumns.push({
2124
2138
  title: this.getI18nLabel(options.label),
2125
2139
  field: this.getFieldKeyName(widget),
@@ -2128,6 +2142,11 @@ modules = {
2128
2142
  // isRange,
2129
2143
  common: true,
2130
2144
  disabled: options.disabled,
2145
+ // hidden 的字段仍要留在 searchColumns(它照样往上送条件),
2146
+ // 只是不进「查询条件设置」弹框的列表,见 table/tableFormMixin.js
2147
+ hidden: !!options.hidden,
2148
+ lockValue: fixedQuery,
2149
+ fixed: fixedQuery,
2131
2150
  defaultValueEnabled: !!type,
2132
2151
  slot: options.name,
2133
2152
  widget: widget,
@@ -2608,67 +2627,72 @@ modules = {
2608
2627
  let scriptCode = this.getScriptCode();
2609
2628
  let $grid = this.getGridTable();
2610
2629
  let originOption = $grid.params.originOption;
2611
- let formData = {};
2630
+ // 组装请求参数。必须等 tableFormStop 闸门放开后才求值,所以整体包成
2631
+ // 函数、由 toDo 调用:查询区默认值的写入(tableForm 的 handleSyncFun)
2632
+ // 与搜索控件实例化都发生在闸门释放之后,提前取参只会拿到一份空条件——
2633
+ // 「查询条件设置」存的默认值、控件 options.defaultValue、控件 created
2634
+ // 里赋的值,首查一律带不上。口径与 components/table/index.js 的通用表格
2635
+ // 一致(那边 param() 本就写在 toDo 内)。
2636
+ const buildReqData = () => {
2637
+ let formData = {};
2638
+
2639
+ // 明细·选择导出已按勾选行 id 精确定位,再叠加主表搜索条件既无意义、又可能
2640
+ // 与明细口径的字段名冲突造成双重过滤,故只有它排除搜索条件;
2641
+ // 明细·条件导出与主表条件导出一样,必须带上搜索条件。
2642
+ if (
2643
+ customParam?.exportParam?.type !== EXPORT_TYPE.ITEM_SELECTED
2644
+ ) {
2645
+ formData = tableOption.param ? tableOption.param() || {} : {};
2646
+ }
2647
+ const queryParams = Object.assign({}, formData);
2648
+
2649
+ // 处理排序条件
2650
+ /*if (sorts) {
2651
+ const firstSort = sorts[0];
2652
+ if (firstSort) {
2653
+ queryParams.sort = firstSort.property;
2654
+ queryParams.order = firstSort.order;
2655
+ }
2656
+ }*/
2612
2657
 
2613
- // 明细·选择导出已按勾选行 id 精确定位,再叠加主表搜索条件既无意义、又可能
2614
- // 与明细口径的字段名冲突造成双重过滤,故只有它排除搜索条件;
2615
- // 明细·条件导出与主表条件导出一样,必须带上搜索条件。
2616
- if (
2617
- customParam?.exportParam?.type !== EXPORT_TYPE.ITEM_SELECTED
2618
- ) {
2619
- formData = tableOption.param ? tableOption.param() || {} : {};
2620
- }
2621
- const queryParams = Object.assign({}, formData);
2622
-
2623
- // 处理排序条件
2624
- /*if (sorts) {
2625
- const firstSort = sorts[0];
2626
- if (firstSort) {
2627
- queryParams.sort = firstSort.property;
2628
- queryParams.order = firstSort.order;
2658
+ // 处理筛选条件
2659
+ if (filters) {
2660
+ filters.forEach(({ property, values }) => {
2661
+ queryParams[property] = values.join(",");
2662
+ });
2629
2663
  }
2630
- }*/
2631
2664
 
2632
- // 处理筛选条件
2633
- if (filters) {
2634
- filters.forEach(({ property, values }) => {
2635
- queryParams[property] = values.join(",");
2636
- });
2637
- }
2665
+ if (page.pageSize !== undefined) {
2666
+ queryParams["size"] = page.pageSize;
2667
+ queryParams["current"] = page.currentPage;
2668
+ }
2638
2669
 
2639
- if (page.pageSize !== undefined) {
2640
- queryParams["size"] = page.pageSize;
2641
- queryParams["current"] = page.currentPage;
2642
- }
2670
+ let isQueryAllPage = getTableStateValue($grid, "isQueryAllPage");
2671
+ /* if (isQueryAllPage === false) {
2672
+ queryParams.searchCount = false;
2673
+ } */
2674
+ queryParams.searchCount = isQueryAllPage !== false;
2675
+ Object.assign(queryParams, param);
2676
+
2677
+ // 宿主(选择弹框/表单弹框/表单抽屉)注入的查询参数:condition 追加合并,
2678
+ // 其余键平铺覆盖,见 utils/queryParamUtil.js
2679
+ if (that.dataTableConfig.queryParam) {
2680
+ mergeQueryParam(queryParams, that.dataTableConfig.queryParam);
2681
+ }
2643
2682
 
2644
- // let $grid = this.getGridTable();
2645
- let isQueryAllPage = getTableStateValue($grid, "isQueryAllPage");
2646
- let pathStr1 = "";
2647
- /* if (isQueryAllPage === false) {
2648
- queryParams.searchCount = false;
2649
- } */
2650
- queryParams.searchCount = isQueryAllPage !== false;
2651
- Object.assign(queryParams, param);
2652
-
2653
- // let formRef = that.getFormRef();
2654
- // let dataTableConfig = formRef.$attrs.dataTableOption || {};
2655
- // 宿主(选择弹框/表单弹框/表单抽屉)注入的查询参数:condition 追加合并,
2656
- // 其余键平铺覆盖,见 utils/queryParamUtil.js
2657
- if (that.dataTableConfig.queryParam) {
2658
- mergeQueryParam(queryParams, that.dataTableConfig.queryParam);
2659
- }
2683
+ return {
2684
+ ...queryParams,
2685
+ };
2686
+ };
2660
2687
 
2661
2688
  let reqPath = typeof path === "function" ? path() : path;
2662
2689
  let accessReturnType =
2663
2690
  this.widget.options.accessReturnType || "2";
2664
2691
 
2665
2692
  return new Promise((resolve, reject) => {
2666
- let reqData = {
2667
- ...queryParams,
2668
- };
2669
2693
  if (scriptCode) {
2670
- let index = 0;
2671
2694
  let toDo = () => {
2695
+ let reqData = buildReqData();
2672
2696
  // let f = new Function("dataId", "formCode", "param", "done", accessScript);
2673
2697
  let done = (res) => {
2674
2698
  // this.clearRowWidgets();
@@ -2782,19 +2806,7 @@ modules = {
2782
2806
  };
2783
2807
  this.loadDefaultQueryList(reqData, done, customParam);
2784
2808
  };
2785
- let loopHandle = () => {
2786
- if (index < 500 && $grid.tableFormStop === true) {
2787
- //阻塞列表查询,或者次数达到500时,自动释放
2788
- index++;
2789
- setTimeout(() => {
2790
- loopHandle();
2791
- }, 10);
2792
- } else {
2793
- if ($grid.tableFormStop) $grid.tableFormStop = false;
2794
- toDo();
2795
- }
2796
- };
2797
- loopHandle();
2809
+ this.runAfterTableFormReady($grid, toDo);
2798
2810
  } else {
2799
2811
  resolve();
2800
2812
  }
@@ -2936,6 +2948,36 @@ modules = {
2936
2948
  });
2937
2949
  });
2938
2950
  },
2951
+ /**
2952
+ * 等查询区就绪后再执行 fn。
2953
+ *
2954
+ * tableForm 挂载时立刻把 $grid.tableFormStop 置 true 把列表查询拦下,直到它
2955
+ * 把查询条件的默认值写进 formModel、并渲染出查询控件后才释放(见
2956
+ * components/table/tableFormMixin.js 的 mounted / handleSyncFun)。
2957
+ *
2958
+ * 调用方必须把「取查询条件」也放进 fn 里:闸门只推迟 fn 的执行时机,在闸门
2959
+ * 之外提前求值的参数拿到的是查询区还没初始化时的空条件。
2960
+ *
2961
+ * 兜底:最多等 500×10ms(5s),超时强制放行,避免查询区异常时列表空转。
2962
+ * @param {Object} $grid VXE Grid 实例。
2963
+ * @param {Function} fn 放行后执行的回调。
2964
+ */
2965
+ runAfterTableFormReady($grid, fn) {
2966
+ let index = 0;
2967
+ let loopHandle = () => {
2968
+ if (index < 500 && $grid.tableFormStop === true) {
2969
+ //阻塞列表查询,或者次数达到500时,自动释放
2970
+ index++;
2971
+ setTimeout(() => {
2972
+ loopHandle();
2973
+ }, 10);
2974
+ } else {
2975
+ if ($grid.tableFormStop) $grid.tableFormStop = false;
2976
+ fn();
2977
+ }
2978
+ };
2979
+ loopHandle();
2980
+ },
2939
2981
  /**
2940
2982
  * 深度遍历分组列和叶子列。
2941
2983
  * @param {Array} columns 列配置。
@@ -190,6 +190,9 @@ export default {
190
190
  readonly: "Readonly",
191
191
  disabled: "Disabled",
192
192
  hidden: "Hidden",
193
+ fixedQuery: "Fixed Query Condition",
194
+ fixedQueryHelp:
195
+ "Keeps its value when Refresh / Revert / Confirm runs, and is read-only in Query Condition Setting",
193
196
  textContent: "Text",
194
197
  htmlContent: "HTML",
195
198
  clearable: "Clearable",
@@ -344,6 +344,9 @@ export default {
344
344
  readonly: "只读",
345
345
  disabled: "禁用",
346
346
  hidden: "隐藏",
347
+ fixedQuery: "固定查询条件",
348
+ fixedQueryHelp:
349
+ "开启后该条件不被刷新、查询条件设置的还原/确定清空,且在查询条件设置里只读",
347
350
  textContent: "静态文字",
348
351
  preWrap: "自动换行",
349
352
  htmlContent: "HTML",
@@ -0,0 +1,93 @@
1
+ /**
2
+ * 「固定查询条件」判定工具。
3
+ *
4
+ * 数据表格查询区的字段值存在整张表单的 formModel 上,三条通道会把它清掉:
5
+ * 1. 刷新按钮 → resetForm 逐个 setValue(null)
6
+ * 2. 「查询条件设置」的「确定」→ tableFormMixin.dialogPrimary 按列写默认值
7
+ * 3. 「查询条件设置」的「还原」→ 走的就是 dialogPrimary
8
+ * 字段勾上 options.fixedQuery 之后,这三条通道一律跳过它,值保持原样
9
+ * (值本身仍由树点选/脚本 setValue 等业务通道注入,本开关只管「不被清掉」)。
10
+ *
11
+ * 组装 searchColumns 时(见 container-item/data-table-mixin.js)由 fixedQuery
12
+ * 派生出两个列级标记:
13
+ * - lockValue:公共表格层(components/table)据此跳过写值,语义是「值锁定」
14
+ * - fixed:复用公共层已有语义,让个性化 json 回灌时不挪位置、不改常用
15
+ * 两者必须分开:手写页面的固定列(如 branchSearchPage 的分支)只打 fixed,
16
+ * 它**依赖** dialogPrimary 按 defaultValue 回填,不能被 lockValue 一起跳过。
17
+ */
18
+
19
+ /* 能承载子组件的字段名,覆盖各类容器(含 vf-dialog/vf-drawer,loopHandleWidget 不进这两个) */
20
+ const CHILD_KEYS = [
21
+ "widgetList",
22
+ "cols",
23
+ "rows",
24
+ "tabs",
25
+ "panes",
26
+ "buttons",
27
+ "buttonWidgetList",
28
+ "leftWidgetList",
29
+ ];
30
+
31
+ /**
32
+ * 深度遍历组件树节点(含 rows 这类只有 cols 的中间层对象)。
33
+ * @param {Object} node 起始节点
34
+ * @param {Function} callback 每个节点回调
35
+ */
36
+ function walkWidget(node, callback) {
37
+ if (!node || typeof node !== "object") return;
38
+ callback(node);
39
+ CHILD_KEYS.forEach((key) => {
40
+ let children = node[key];
41
+ if (Array.isArray(children)) {
42
+ children.forEach((child) => walkWidget(child, callback));
43
+ }
44
+ });
45
+ }
46
+
47
+ /**
48
+ * 该字段是否勾选了「固定查询条件」。
49
+ * @param {Object} widget 字段组件 schema
50
+ * @returns {Boolean}
51
+ */
52
+ export function isFixedQueryWidget(widget) {
53
+ return !!(widget && widget.options && widget.options.fixedQuery);
54
+ }
55
+
56
+ /**
57
+ * 该列是否为「值锁定」列(公共表格层的口径,见文件头注释)。
58
+ * @param {Object} column searchColumns 的列配置
59
+ * @returns {Boolean}
60
+ */
61
+ export function isLockedSearchColumn(column) {
62
+ return !!(column && column.lockValue);
63
+ }
64
+
65
+ /**
66
+ * 组件是否位于某个数据表格的查询区(data-table 的 widgetList 分支,不含 buttons、
67
+ * 不含表格列组件)。属性面板据此决定要不要显示「固定查询条件」开关。
68
+ * @param {Array} widgetList 表单顶层组件列表(designer.widgetList)
69
+ * @param {Object} widget 待判定的字段组件
70
+ * @returns {Boolean}
71
+ */
72
+ export function isQueryAreaWidget(widgetList, widget) {
73
+ if (!widget || !widget.id || !Array.isArray(widgetList)) return false;
74
+ let inQueryArea = false;
75
+ widgetList.forEach((item) => {
76
+ walkWidget(item, (node) => {
77
+ if (inQueryArea) return;
78
+ if (
79
+ node.category !== "container"
80
+ || node.type !== "data-table"
81
+ || !Array.isArray(node.widgetList)
82
+ ) {
83
+ return;
84
+ }
85
+ node.widgetList.forEach((child) => {
86
+ walkWidget(child, (sub) => {
87
+ if (sub.id === widget.id) inQueryArea = true;
88
+ });
89
+ });
90
+ });
91
+ });
92
+ return inQueryArea;
93
+ }