@qin-ui/element-plus-pro 1.4.0 → 1.4.2

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.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@qin-ui/element-plus-pro",
3
- "version": "1.4.0",
3
+ "version": "1.4.2",
4
4
  "description": "基于 element-plus 的二次封装组件",
5
5
  "bin": {
6
6
  "element-plus-pro": "./bin/init-ai.mjs"
@@ -14,7 +14,6 @@
14
14
  "types": "./es/index.d.ts",
15
15
  "import": "./es/index.js"
16
16
  },
17
- "./element-plus-pro.css": "./es/element-plus-pro.css",
18
17
  "./package.json": "./package.json"
19
18
  },
20
19
  "files": [
@@ -41,7 +40,7 @@
41
40
  },
42
41
  "dependencies": {
43
42
  "vue-component-type-helpers": "^3.2.5",
44
- "@qin-ui/pro-components-core": "^2.1.0"
43
+ "@qin-ui/pro-components-core": "^2.1.1"
45
44
  },
46
45
  "devDependencies": {
47
46
  "@types/node": "^24",
@@ -43,7 +43,7 @@ export const INJECT_CONFIG: {
43
43
  },
44
44
  'pro-form': {
45
45
  injectionKey: Symbol(''),
46
- // 表单实例由 `:form` 显式传入
46
+ // 表单实例由 `:form` 显式传入;grid 仅作为启用时的参数默认值,不开启网格
47
47
  ignoreProps: ['form'],
48
48
  default: { grid: { gutter: 24 } },
49
49
  },
@@ -54,6 +54,7 @@ import {
54
54
  } from '../../../component-provider/constants';
55
55
  import { useForm } from '../../hooks/useForm';
56
56
  import { getInitProps, warnUnknownComponent } from './utils';
57
+ import { resolveEffectiveDisabled } from '../../utils/disabled';
57
58
  import { useLocale } from '../../../../locale';
58
59
 
59
60
  const cloneDeepIfObject = (val: unknown) =>
@@ -161,14 +162,11 @@ const groupedAttrs = computed(() => {
161
162
  t
162
163
  );
163
164
  const modelPropName = attrs.modelProp ?? initProps.modelProp ?? 'modelValue';
164
- // 字段级优先;null / undefined 回退父级与 Provider,'' / 'disabled' 按宿主 Boolean 形态为 true
165
- const normalizeDisabled = (value: unknown) =>
166
- value === '' || value === 'disabled' ? true : Boolean(value);
167
- const effectiveDisabled =
168
- attrs.disabled !== undefined && attrs.disabled !== null
169
- ? normalizeDisabled(attrs.disabled)
170
- : normalizeDisabled(parentDisabled.value) ||
171
- normalizeDisabled(initProps.disabled);
165
+ const effectiveDisabled = resolveEffectiveDisabled(
166
+ attrs.disabled,
167
+ parentDisabled.value,
168
+ initProps.disabled
169
+ );
172
170
  const mergedProps = mergeProps(
173
171
  initProps,
174
172
  attrs,
@@ -21,6 +21,8 @@ const PLACEHOLDER_KEYS: Record<string, string> = {
21
21
  'date-picker.week': 'date-picker.placeholder',
22
22
  'date-picker.month': 'date-picker.placeholder',
23
23
  'date-picker.months': 'date-picker.placeholder',
24
+ 'date-picker.quarter': 'date-picker.placeholder',
25
+ 'date-picker.quarters': 'date-picker.placeholder',
24
26
  'date-picker.year': 'date-picker.placeholder',
25
27
  'date-picker.years': 'date-picker.placeholder',
26
28
  'date-picker.datetime': 'date-picker.placeholder',
@@ -33,6 +35,7 @@ const RANGE_PLACEHOLDER_KEYS: Record<string, [string, string]> = {
33
35
  'date-picker.daterange': ['date-picker.start', 'date-picker.end'],
34
36
  'date-picker.monthrange': ['date-picker.startMonth', 'date-picker.endMonth'],
35
37
  'date-picker.yearrange': ['date-picker.startYear', 'date-picker.endYear'],
38
+ 'date-picker.quarterrange': ['date-picker.start', 'date-picker.end'],
36
39
  'date-picker.datetimerange': ['date-picker.startTime', 'date-picker.endTime'],
37
40
  };
38
41
 
@@ -71,10 +71,7 @@ const config = INJECT_CONFIG['pro-form'];
71
71
  const injectFormConfig = inject(config.injectionKey, config.default);
72
72
  const injectGrid = computed(() => toValue(injectFormConfig)?.grid);
73
73
 
74
- const enableGrid = computed(() => {
75
- if (props.grid !== undefined) return !!props.grid;
76
- return !!injectGrid.value;
77
- });
74
+ const enableGrid = computed(() => !!props.grid);
78
75
 
79
76
  const computedGridProps = computed<GridProps>(() => {
80
77
  return enableGrid.value
@@ -184,7 +181,7 @@ const groupedFields = useGroupFieldAttrs(validFields);
184
181
  <BaseFormItem
185
182
  :grid="(item.rawField as any).grid ?? props.grid"
186
183
  :fields="item.rawField.fields"
187
- :disabled="toValue(item.rawField.disabled)"
184
+ :disabled="toValue(item.rawField.disabled) ?? props.disabled"
188
185
  />
189
186
  </template>
190
187
  <template v-else>
@@ -192,6 +189,7 @@ const groupedFields = useGroupFieldAttrs(validFields);
192
189
  :ref="el => setComponentRef(item.rawField, el)"
193
190
  v-bind="item.componentProps"
194
191
  :path="item.path"
192
+ :disabled="toValue(item.rawField.disabled) ?? props.disabled"
195
193
  />
196
194
  </template>
197
195
  </FormItem>
@@ -26,7 +26,7 @@
26
26
  * @template F - 表单实例类型
27
27
  *
28
28
  * @param {F} [form] - useForm 返回的表单实例
29
- * @param {boolean | GridProps} [grid] - 是否启用网格布局;未提供时回退 Provider 注入的 `grid` 配置
29
+ * @param {boolean | GridProps} [grid] - 是否启用网格布局,默认关闭;Provider 的 `grid` 仅作为启用时的参数配置
30
30
  * @param {...FormProps} ...attrs - Element Plus Form 组件的其他属性
31
31
  *
32
32
  * @slot default - 默认插槽,可用于添加额外内容
@@ -44,7 +44,7 @@
44
44
  * ```
45
45
  */
46
46
  import type { FormProps as ElFormProps } from '../../../../shared/ui';
47
- import { Form as ElForm } from '../../../../shared/ui';
47
+ import { Form as ElForm, useDisabledContext } from '../../../../shared/ui';
48
48
  import {
49
49
  computed,
50
50
  inject,
@@ -68,6 +68,7 @@ import {
68
68
  useReactiveAttrs,
69
69
  } from '../../../../shared/core';
70
70
  import { useForm, type Form } from '../../hooks/useForm';
71
+ import { resolveDisabled } from '../../utils/disabled';
71
72
 
72
73
  defineOptions({ name: 'ProForm', inheritAttrs: false });
73
74
 
@@ -78,7 +79,7 @@ type Props = {
78
79
  form?: F;
79
80
  } & /* @vue-ignore */ FormProps;
80
81
  const props = withDefaults(defineProps<Props>(), {
81
- grid: undefined,
82
+ grid: false,
82
83
  form: undefined,
83
84
  });
84
85
 
@@ -141,6 +142,14 @@ const formAttrs = computed(() => {
141
142
  );
142
143
  });
143
144
 
145
+ // 表单级禁用声明:显式值(含 false)优先,未声明时仅继承外层 true
146
+ const outerDisabled = useDisabledContext();
147
+ const formDisabled = computed<boolean | undefined>(() => {
148
+ const explicit = resolveDisabled(toValue(formAttrs.value.disabled));
149
+ if (explicit !== undefined) return explicit;
150
+ return outerDisabled.value ? true : undefined;
151
+ });
152
+
144
153
  type ExtractPath<T> = T extends Form<infer D> ? Path<D> : string;
145
154
  type FieldSlotProps = VModelProps &
146
155
  PathProps & { disabled?: boolean; [x: string]: any };
@@ -169,7 +178,11 @@ provide(InjectionFormSlotsKey, formSlotsRef);
169
178
  class="pro-form"
170
179
  @submit.prevent
171
180
  >
172
- <BaseFormItem :fields="fields" :grid="props.grid" />
181
+ <BaseFormItem
182
+ :fields="fields"
183
+ :grid="props.grid"
184
+ :disabled="formDisabled"
185
+ />
173
186
  <slot />
174
187
  </ElForm>
175
188
  </template>
@@ -0,0 +1,37 @@
1
+ /**
2
+ * 归一化禁用值
3
+ *
4
+ * @description 字符串形态与宿主 Boolean prop 一致:`''` 与 `disabled` 为 true,其余取真值
5
+ * @param value - 原始禁用值
6
+ * @returns 归一化后的布尔值
7
+ */
8
+ export const normalizeDisabled = (value: unknown) =>
9
+ value === '' || value === 'disabled' ? true : Boolean(value);
10
+
11
+ /**
12
+ * 解析显式声明的禁用值
13
+ *
14
+ * @description `undefined` / `null` 为未声明,返回 `undefined`;其余返回归一化结果
15
+ * @param value - 原始禁用值
16
+ * @returns 显式禁用值;未声明时为 `undefined`
17
+ */
18
+ export const resolveDisabled = (value: unknown): boolean | undefined =>
19
+ value === undefined || value === null ? undefined : normalizeDisabled(value);
20
+
21
+ /**
22
+ * 解析控件最终生效的禁用状态
23
+ *
24
+ * @description 字段显式声明(含 `false`)优先;未声明时继承外层禁用,外层为真即禁用;
25
+ * 外层未禁用时回退 Provider 注入的组件级默认值
26
+ * @param explicit - 字段显式声明的禁用值
27
+ * @param inherited - 外层禁用上下文取值
28
+ * @param fallback - Provider 注入的组件级默认禁用值
29
+ * @returns 最终生效的禁用状态
30
+ */
31
+ export const resolveEffectiveDisabled = (
32
+ explicit: unknown,
33
+ inherited: unknown,
34
+ fallback: unknown
35
+ ): boolean =>
36
+ resolveDisabled(explicit) ??
37
+ (normalizeDisabled(inherited) || normalizeDisabled(fallback));
@@ -32,6 +32,11 @@
32
32
  * 2. 分页变化:分页参数同步后发起查询
33
33
  * 3. 重置:查询参数恢复初始值后重新查询
34
34
  *
35
+ * ## 列来源
36
+ *
37
+ * 显式 `:columns` 优先于 `:table` 实例的 `columns`;显式列按原样透传给宿主,不补齐 `key`,
38
+ * 需由调用方提供 `key` / `dataIndex` / `prop`。显式模式下 `setColumn` 与列控入口均不生效。
39
+ *
35
40
  * @template T - 表格实例类型(useTable 返回值)
36
41
  *
37
42
  * @param {T} [table] - 列表表格对象,来自 useTable
@@ -141,7 +146,7 @@ type Props = {
141
146
  searchFormConfig?: SearchFormConfig;
142
147
  /** 表格区域包裹容器 */
143
148
  tableContainer?: ContainerComponent | false;
144
- /** 直接传入列配置(覆盖 :table 实例的 columns) */
149
+ /** 直接传入列配置(覆盖 :table 实例的 columns);列需自备 key / dataIndex / prop,显式模式不参与 setColumn 与列控 */
145
150
  columns?: Columns<RecordType>;
146
151
  /** 直接传入数据源(覆盖 :table 实例的 data) */
147
152
  data?: RecordType[];
@@ -379,6 +384,7 @@ const getIndex = (i: number) => {
379
384
  /** 调用方是否显式传入 columns(值为 undefined 时视为未指定) */
380
385
  const hasExplicitColumns = computed(() => props.columns !== undefined);
381
386
 
387
+ /** 显式列原样透传(key 由调用方提供);table 列经 core 规范化 */
382
388
  const normalizedRawColumns = computed(() => {
383
389
  const source = (
384
390
  (props.columns ?? toValue(props.table?.columns) ?? []) as any[]
@@ -445,15 +451,23 @@ const computedPagination = computed<false | Partial<PaginationProps>>(() => {
445
451
 
446
452
  const showPagination = computed(() => computedPagination.value !== false);
447
453
 
454
+ // pageSize 变更窗口:窗口内忽略宿主级联的 current-change
455
+ let sizeChangeWindow = false;
456
+
448
457
  const onCurrentChange = (current: number) => {
458
+ if (sizeChangeWindow) return;
449
459
  props.table?.setPageParam?.({ current });
450
460
  _search();
451
461
  };
452
462
 
453
463
  // 改变 pageSize 时重置回第 1 页并重新查询
454
464
  const onSizeChange = (pageSize: number) => {
465
+ sizeChangeWindow = true;
455
466
  props.table?.setPageParam?.({ pageSize, current: 1 });
456
467
  _search();
468
+ nextTick(() => {
469
+ sizeChangeWindow = false;
470
+ });
457
471
  };
458
472
 
459
473
  const onPaginationChange = (currentPage: number, pageSize: number) => {