qidian-vue-ui 2.4.0 → 2.5.0

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.
@@ -8,9 +8,11 @@ type __VLS_Slots = {} & {
8
8
  declare const __VLS_component: import("vue").DefineComponent<QdCrudSearchProps, {
9
9
  submit: (params?: {
10
10
  showErrorMessage?: boolean;
11
+ showFirstErrorMessage?: boolean;
11
12
  scrollToFirstError?: import("../..").QdFormProps["scrollToFirstError"];
12
13
  }) => Promise<import("../..").QdFormSubmitContext<import("tdesign-vue-next").Data>>;
13
14
  validate: (params?: import("tdesign-vue-next").FormValidateParams & {
15
+ showFirstErrorMessage?: boolean;
14
16
  scrollToFirstError?: import("../..").QdFormProps["scrollToFirstError"];
15
17
  }) => Promise<import("tdesign-vue-next").FormValidateResult<import("tdesign-vue-next").Data>>;
16
18
  clearValidate: (fields?: (string | number)[] | undefined) => void;
@@ -36,6 +38,8 @@ declare const __VLS_component: import("vue").DefineComponent<QdCrudSearchProps,
36
38
  gutter: number | import("tdesign-vue-next").GutterObject | (number | import("tdesign-vue-next").GutterObject)[];
37
39
  grid: import("../..").QdGridItemProps;
38
40
  defaultClearable: boolean;
41
+ autoFill: boolean;
42
+ showFirstErrorMessage: boolean;
39
43
  btnDisabled: boolean;
40
44
  }, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
41
45
  declare const _default: __VLS_WithSlots<typeof __VLS_component, __VLS_Slots>;
@@ -25,6 +25,8 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
25
25
  loadingProps: {},
26
26
  defaultClearable: { type: Boolean },
27
27
  descriptions: { type: Boolean },
28
+ autoFill: { type: Boolean },
29
+ showFirstErrorMessage: { type: Boolean },
28
30
  onSubmit: { type: Function },
29
31
  colon: { type: Boolean },
30
32
  data: {},
@@ -23,6 +23,7 @@ export declare const qdCrudSearchProps: {
23
23
  };
24
24
  readonly gutter: () => number[];
25
25
  readonly data: () => any;
26
+ readonly autoFill: true;
26
27
  readonly disabled: undefined;
27
28
  readonly readonly: undefined;
28
29
  readonly labelWidth: "auto";
@@ -32,5 +33,6 @@ export declare const qdCrudSearchProps: {
32
33
  readonly preventSubmitDefault: true;
33
34
  readonly requiredMark: undefined;
34
35
  readonly showErrorMessage: true;
36
+ readonly showFirstErrorMessage: true;
35
37
  readonly statusIcon: undefined;
36
38
  };
@@ -23,6 +23,8 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
23
23
  loadingProps: {},
24
24
  defaultClearable: { type: Boolean },
25
25
  descriptions: { type: Boolean },
26
+ autoFill: { type: Boolean },
27
+ showFirstErrorMessage: { type: Boolean },
26
28
  colon: { type: Boolean },
27
29
  data: {},
28
30
  disabled: { type: Boolean },
@@ -36,6 +36,7 @@ export declare const qdDialogFormProps: {
36
36
  readonly gutter: () => number[];
37
37
  readonly grid: () => {};
38
38
  readonly data: () => any;
39
+ readonly autoFill: true;
39
40
  readonly disabled: undefined;
40
41
  readonly readonly: undefined;
41
42
  readonly labelWidth: "auto";
@@ -45,6 +46,7 @@ export declare const qdDialogFormProps: {
45
46
  readonly preventSubmitDefault: true;
46
47
  readonly requiredMark: undefined;
47
48
  readonly showErrorMessage: true;
49
+ readonly showFirstErrorMessage: true;
48
50
  readonly statusIcon: undefined;
49
51
  readonly defaultClearable: undefined;
50
52
  };
@@ -1,5 +1,11 @@
1
- import type { InjectionKey } from 'vue';
1
+ import type { ComputedRef, InjectionKey } from 'vue';
2
2
  import type { QdFormBeforeSubmitQueueItem } from './types';
3
+ export interface QdFormGridItemRegistryEntry {
4
+ gridIndex: ComputedRef<number | undefined>;
5
+ visible: ComputedRef<boolean>;
6
+ colSpan: ComputedRef<number>;
7
+ }
8
+ export declare const PROVIDE_FORM_REGISTER_GRID_ITEM: InjectionKey<(entry: QdFormGridItemRegistryEntry) => void>;
3
9
  export declare const PROVIDE_FORM_ADD_BEFORE_SUBMIT_QUEUE: InjectionKey<(item: QdFormBeforeSubmitQueueItem) => void>;
4
10
  export declare const PROVIDE_FORM_ADD_AFTER_SUBMIT_QUEUE: InjectionKey<(item: QdFormBeforeSubmitQueueItem) => void>;
5
11
  export declare const PROVIDE_FORM_RESET_QUEUE: InjectionKey<(item: () => void) => void>;
@@ -1,8 +1,10 @@
1
+ const PROVIDE_FORM_REGISTER_GRID_ITEM = /* @__PURE__ */ Symbol("QdFormRegisterGridItem");
1
2
  const PROVIDE_FORM_ADD_BEFORE_SUBMIT_QUEUE = /* @__PURE__ */ Symbol("QdFormAddBeforeSubmitQueue");
2
3
  const PROVIDE_FORM_ADD_AFTER_SUBMIT_QUEUE = /* @__PURE__ */ Symbol("QdFormAddAfterSubmitQueue");
3
4
  const PROVIDE_FORM_RESET_QUEUE = /* @__PURE__ */ Symbol("QdFormResetQueue");
4
5
  export {
5
6
  PROVIDE_FORM_ADD_AFTER_SUBMIT_QUEUE,
6
7
  PROVIDE_FORM_ADD_BEFORE_SUBMIT_QUEUE,
8
+ PROVIDE_FORM_REGISTER_GRID_ITEM,
7
9
  PROVIDE_FORM_RESET_QUEUE
8
10
  };
@@ -1,28 +1,28 @@
1
- .qd-form--small[data-v-10c3d73e] {
1
+ .qd-form--small[data-v-151bafd6] {
2
2
  font: var(--td-font-body-small);
3
3
  }
4
- .qd-form--small[data-v-10c3d73e] .t-form__label--top {
4
+ .qd-form--small[data-v-151bafd6] .t-form__label--top {
5
5
  min-height: var(--td-comp-margin-xxl);
6
6
  line-height: var(--td-comp-margin-xxl);
7
7
  }
8
- .qd-form--small[data-v-10c3d73e] .t-form__controls,
9
- .qd-form--small[data-v-10c3d73e] .t-form__controls-content {
8
+ .qd-form--small[data-v-151bafd6] .t-form__controls,
9
+ .qd-form--small[data-v-151bafd6] .t-form__controls-content {
10
10
  min-height: var(--td-comp-margin-xxl);
11
11
  }
12
- .qd-form--descriptions[data-v-10c3d73e] .qd-grid {
12
+ .qd-form--descriptions[data-v-151bafd6] .qd-grid {
13
13
  border-top: 1px solid var(--td-component-border);
14
14
  border-left: 1px solid var(--td-component-border);
15
15
  }
16
- .qd-form--descriptions[data-v-10c3d73e] .qd-grid-item {
16
+ .qd-form--descriptions[data-v-151bafd6] .qd-grid-item {
17
17
  border-right: 1px solid var(--td-component-border);
18
18
  border-bottom: 1px solid var(--td-component-border);
19
19
  }
20
- .qd-form--descriptions[data-v-10c3d73e] .t-form__item {
20
+ .qd-form--descriptions[data-v-151bafd6] .t-form__item {
21
21
  display: flex;
22
22
  align-items: stretch;
23
23
  height: 100%;
24
24
  }
25
- .qd-form--descriptions[data-v-10c3d73e] .t-form__label {
25
+ .qd-form--descriptions[data-v-151bafd6] .t-form__label {
26
26
  display: flex;
27
27
  flex-direction: column;
28
28
  justify-content: center;
@@ -30,17 +30,17 @@
30
30
  padding: var(--td-comp-paddingLR-m) var(--td-comp-paddingLR-l);
31
31
  height: 100%;
32
32
  }
33
- .qd-form--descriptions[data-v-10c3d73e] .t-form__label--top {
33
+ .qd-form--descriptions[data-v-151bafd6] .t-form__label--top {
34
34
  border-bottom: 1px solid var(--td-component-border);
35
35
  align-items: center;
36
36
  height: var(--qd-form-description-label-height, auto);
37
37
  white-space: normal;
38
38
  }
39
- .qd-form--descriptions[data-v-10c3d73e] .t-form__label--top + .t-form__controls > .t-form__controls-content {
39
+ .qd-form--descriptions[data-v-151bafd6] .t-form__label--top + .t-form__controls > .t-form__controls-content {
40
40
  justify-content: center;
41
41
  text-align: center;
42
42
  }
43
- .qd-form--descriptions[data-v-10c3d73e] .t-form__controls {
43
+ .qd-form--descriptions[data-v-151bafd6] .t-form__controls {
44
44
  flex: 1 1 0;
45
45
  overflow: hidden;
46
46
  display: flex;
@@ -50,28 +50,31 @@
50
50
  margin-left: 0 !important;
51
51
  height: 100%;
52
52
  }
53
- .qd-form--descriptions[data-v-10c3d73e] .qd-form-item--label-top {
53
+ .qd-form--descriptions[data-v-151bafd6] .qd-form-item--label-top {
54
54
  display: grid;
55
55
  grid-template-rows: auto minmax(min-content, auto);
56
56
  grid-row: span 2 !important;
57
57
  }
58
- .qd-form--descriptions[data-v-10c3d73e] .qd-form-item--label-top > .t-form__item {
58
+ .qd-form--descriptions[data-v-151bafd6] .qd-form-item--label-top > .t-form__item {
59
59
  display: contents;
60
60
  }
61
- .qd-form--descriptions[data-v-10c3d73e] .qd-form-item--label-top .t-form__controls-content {
61
+ .qd-form--descriptions[data-v-151bafd6] .qd-form-item--label-top .t-form__controls-content {
62
62
  white-space: normal;
63
63
  }
64
- .qd-form--descriptions[data-v-10c3d73e] .qd-form-item--empty-content .t-form__controls {
64
+ .qd-form--descriptions[data-v-151bafd6] .qd-form-item--empty-content .t-form__controls {
65
65
  padding: 0 !important;
66
66
  min-height: 0;
67
67
  height: 0;
68
68
  overflow: hidden;
69
69
  }
70
- .qd-form--descriptions[data-v-10c3d73e] .qd-form-item:not(.qd-form-item--label-top):not(.qd-form-item--label-width-full) .t-form__label {
70
+ .qd-form--descriptions[data-v-151bafd6] .qd-form-item:not(.qd-form-item--label-top):not(.qd-form-item--label-width-full) .t-form__label {
71
71
  border-right: 1px solid var(--td-component-border);
72
72
  }
73
- .qd-form--descriptions-mini[data-v-10c3d73e] .t-form__label,
74
- .qd-form--descriptions-mini[data-v-10c3d73e] .t-form__controls {
73
+ .qd-form--descriptions[data-v-151bafd6] .qd-form-item--filler {
74
+ background-color: var(--td-bg-color-secondarycontainer);
75
+ }
76
+ .qd-form--descriptions-mini[data-v-151bafd6] .t-form__label,
77
+ .qd-form--descriptions-mini[data-v-151bafd6] .t-form__controls {
75
78
  padding: var(--td-comp-paddingTB-xxs) var(--td-comp-paddingLR-xxs);
76
79
  font: var(--td-font-body-small);
77
80
  }
@@ -2,7 +2,7 @@ import './index.css'
2
2
  import _sfc_main from "./index.vue2.mjs";
3
3
  /* empty css */
4
4
  import _export_sfc from "../../_virtual/_plugin-vue_export-helper.mjs";
5
- const QdForm = /* @__PURE__ */ _export_sfc(_sfc_main, [["__scopeId", "data-v-10c3d73e"]]);
5
+ const QdForm = /* @__PURE__ */ _export_sfc(_sfc_main, [["__scopeId", "data-v-151bafd6"]]);
6
6
  export {
7
7
  QdForm as default
8
8
  };
@@ -1,15 +1,17 @@
1
1
  import './index.css'
2
- import { defineComponent, mergeDefaults, provide, nextTick, onBeforeUnmount, useTemplateRef, ref, computed, watch, onMounted, withDirectives, createBlock, openBlock, unref, mergeProps, withCtx, renderSlot, normalizeProps, guardReactiveProps, createElementBlock, Fragment, renderList } from "vue";
2
+ import { defineComponent, mergeDefaults, provide, nextTick, onBeforeUnmount, shallowRef, useTemplateRef, ref, computed, watch, onMounted, withDirectives, createBlock, openBlock, unref, mergeProps, withCtx, renderSlot, normalizeProps, guardReactiveProps, createElementBlock, Fragment, renderList } from "vue";
3
3
  import { useVModels } from "../../node_modules/.pnpm/@vueuse_core@14.2.0_vue@3.5.26_typescript@5.9.3_/node_modules/@vueuse/core/dist/index.mjs";
4
4
  import { createExposeProxy, resizeDirective, easyCopy, hasOwn, to, suspectedWrapperPromise } from "qidian-shared";
5
5
  import { Form, LoadingDirective } from "tdesign-vue-next";
6
6
  import { useModal } from "../../hooks/useModal.mjs";
7
7
  import { useConfig } from "../config-provider/useConfig.mjs";
8
- import { PROVIDE_FORM_ADD_BEFORE_SUBMIT_QUEUE, PROVIDE_FORM_ADD_AFTER_SUBMIT_QUEUE, PROVIDE_FORM_RESET_QUEUE } from "./config.mjs";
8
+ import { DEFAULT_COLUMNS } from "../grid/config.mjs";
9
+ import { PROVIDE_FORM_ADD_BEFORE_SUBMIT_QUEUE, PROVIDE_FORM_ADD_AFTER_SUBMIT_QUEUE, PROVIDE_FORM_RESET_QUEUE, PROVIDE_FORM_REGISTER_GRID_ITEM } from "./config.mjs";
9
10
  import QdFormItem from "./item.vue.mjs";
10
11
  import { qdFormGrid, qdFormProps } from "./props.mjs";
11
12
  import merge from "../../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/merge.mjs";
12
13
  import QdGrid from "../grid/index.vue.mjs";
14
+ import QdGridItem from "../grid/item.vue.mjs";
13
15
  const _sfc_main = /* @__PURE__ */ defineComponent({
14
16
  ...{
15
17
  name: "QdForm"
@@ -23,6 +25,8 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
23
25
  loadingProps: {},
24
26
  defaultClearable: { type: Boolean },
25
27
  descriptions: { type: Boolean },
28
+ autoFill: { type: Boolean },
29
+ showFirstErrorMessage: { type: Boolean },
26
30
  onSubmit: { type: Function },
27
31
  colon: { type: Boolean },
28
32
  data: {},
@@ -83,9 +87,19 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
83
87
  resetQueue.splice(index, 1);
84
88
  });
85
89
  });
90
+ const gridItemRegistry = shallowRef([]);
91
+ provide(PROVIDE_FORM_REGISTER_GRID_ITEM, (entry) => {
92
+ nextTick(() => {
93
+ gridItemRegistry.value = [...gridItemRegistry.value, entry];
94
+ });
95
+ onBeforeUnmount(() => {
96
+ gridItemRegistry.value = gridItemRegistry.value.filter((it) => it !== entry);
97
+ });
98
+ });
86
99
  const formRef = useTemplateRef("form");
87
100
  const gridRef = useTemplateRef("gridInstance");
88
101
  const submitShowErrorMessage = ref();
102
+ const submitShowFirstErrorMessage = ref();
89
103
  const submitScrollToFirstError = ref();
90
104
  let submitResolver;
91
105
  const reProps = computed(() => {
@@ -97,6 +111,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
97
111
  items,
98
112
  onSubmit,
99
113
  data: data2,
114
+ showFirstErrorMessage,
100
115
  scrollToFirstError,
101
116
  loading: externalLoad,
102
117
  size,
@@ -142,11 +157,45 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
142
157
  ...props.loadingProps
143
158
  };
144
159
  });
160
+ const gridNodes = computed(() => {
161
+ const items = reProps.value.formItems;
162
+ if (!items?.length) return [];
163
+ if (!reProps.value.descriptions || !props.autoFill) {
164
+ return items.map((_, index) => ({ type: "item", index }));
165
+ }
166
+ const columns = reProps.value.gridOptions.columns ?? DEFAULT_COLUMNS;
167
+ const entryMap = new Map(gridItemRegistry.value.map((entry) => [entry.gridIndex.value, entry]));
168
+ const nodes = [];
169
+ let used = 0;
170
+ items.forEach((_, index) => {
171
+ const entry = entryMap.get(index);
172
+ if (entry?.visible.value) {
173
+ const span = entry.colSpan.value;
174
+ if (span > 0) {
175
+ if (used + span > columns) {
176
+ const remaining2 = columns - used;
177
+ if (remaining2 > 0) nodes.push({ type: "filler", span: remaining2 });
178
+ used = 0;
179
+ }
180
+ used += span;
181
+ }
182
+ }
183
+ nodes.push({ type: "item", index });
184
+ });
185
+ const remaining = columns - used;
186
+ if (remaining > 0) nodes.push({ type: "filler", span: remaining });
187
+ return nodes;
188
+ });
189
+ const descriptionsFillerRow = computed(
190
+ () => reProps.value.formOptions.labelAlign === "top" ? 2 : 1
191
+ );
145
192
  async function handleSubmit(context) {
146
193
  const showErrorMessage = submitShowErrorMessage.value ?? props.showErrorMessage;
194
+ const showFirstErrorMessage = submitShowFirstErrorMessage.value ?? props.showFirstErrorMessage;
147
195
  submitShowErrorMessage.value = void 0;
196
+ submitShowFirstErrorMessage.value = void 0;
148
197
  submitScrollToFirstError.value = void 0;
149
- if (showErrorMessage && context.firstError) {
198
+ if (showFirstErrorMessage && context.firstError) {
150
199
  msgError(context.firstError);
151
200
  }
152
201
  const submitContext = {
@@ -167,6 +216,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
167
216
  const expose = {
168
217
  submit: async (params) => {
169
218
  submitShowErrorMessage.value = params?.showErrorMessage;
219
+ submitShowFirstErrorMessage.value = params?.showFirstErrorMessage;
170
220
  submitScrollToFirstError.value = params?.scrollToFirstError;
171
221
  const queueRes = await Promise.all(
172
222
  beforeSubmitQueue.map((item) => suspectedWrapperPromise(item()))
@@ -189,8 +239,9 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
189
239
  }
190
240
  });
191
241
  const showErrorMessage = submitShowErrorMessage.value ?? props.showErrorMessage;
242
+ const showFirstErrorMessage = submitShowFirstErrorMessage.value ?? props.showFirstErrorMessage ?? showErrorMessage;
192
243
  if (reQueueRes.success === false) {
193
- if (showErrorMessage && reQueueRes.message) {
244
+ if (showFirstErrorMessage && reQueueRes.message) {
194
245
  msgError(reQueueRes.message);
195
246
  }
196
247
  const context = {
@@ -201,6 +252,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
201
252
  crudMode: reProps.value.formOptions.crudMode
202
253
  };
203
254
  submitShowErrorMessage.value = context.showErrorMessage;
255
+ submitShowFirstErrorMessage.value = false;
204
256
  handleSubmit(context);
205
257
  return context;
206
258
  }
@@ -229,12 +281,15 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
229
281
  },
230
282
  validate: async (params) => {
231
283
  submitShowErrorMessage.value = params?.showErrorMessage;
284
+ submitShowFirstErrorMessage.value = params?.showFirstErrorMessage;
232
285
  submitScrollToFirstError.value = !params ? void 0 : hasOwn(params, "scrollToFirstError") ? params.scrollToFirstError : "";
233
286
  const [err, res] = await to(formRef.value.validate(params));
234
287
  submitShowErrorMessage.value = void 0;
288
+ submitShowFirstErrorMessage.value = void 0;
235
289
  submitScrollToFirstError.value = void 0;
236
290
  if (err) throw err;
237
- if (params?.showErrorMessage && typeof res === "object" && Object.keys(res).length) {
291
+ const showFirstErrorMessage = params?.showFirstErrorMessage ?? props.showFirstErrorMessage ?? params?.showErrorMessage;
292
+ if (showFirstErrorMessage && typeof res === "object" && Object.keys(res).length) {
238
293
  const resValue = Object.values(res);
239
294
  let firstError = "";
240
295
  resValue.some((item) => {
@@ -316,16 +371,24 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
316
371
  renderSlot(_ctx.$slots, "default", normalizeProps(guardReactiveProps(reProps.value.gridOptions)), () => [
317
372
  withDirectives((openBlock(), createBlock(unref(QdGrid), mergeProps({ ref: "gridInstance" }, reProps.value.gridOptions), {
318
373
  default: withCtx(() => [
319
- (openBlock(true), createElementBlock(Fragment, null, renderList(reProps.value.formItems, (item, index) => {
320
- return openBlock(), createBlock(QdFormItem, mergeProps({
321
- key: index,
322
- "crud-mode": __props.crudMode,
323
- context: unref(data),
324
- "default-clearable": __props.defaultClearable,
325
- "label-align": item.labelAlign ?? reProps.value.formOptions.labelAlign
326
- }, { ref_for: true }, item, {
327
- size: item.size ?? reProps.value.itemSize
328
- }), null, 16, ["crud-mode", "context", "default-clearable", "label-align", "size"]);
374
+ (openBlock(true), createElementBlock(Fragment, null, renderList(gridNodes.value, (node, index) => {
375
+ return openBlock(), createElementBlock(Fragment, { key: index }, [
376
+ node.type === "item" ? (openBlock(), createBlock(QdFormItem, mergeProps({
377
+ key: 0,
378
+ "crud-mode": __props.crudMode,
379
+ context: unref(data),
380
+ "default-clearable": __props.defaultClearable,
381
+ "label-align": reProps.value.formItems?.[node.index].labelAlign ?? reProps.value.formOptions.labelAlign
382
+ }, { ref_for: true }, reProps.value.formItems?.[node.index], {
383
+ "grid-index": node.index,
384
+ size: reProps.value.formItems?.[node.index].size ?? reProps.value.itemSize
385
+ }), null, 16, ["crud-mode", "context", "default-clearable", "label-align", "grid-index", "size"])) : (openBlock(), createBlock(unref(QdGridItem), {
386
+ key: 1,
387
+ class: "qd-form-item--filler",
388
+ col: node.span,
389
+ row: descriptionsFillerRow.value
390
+ }, null, 8, ["col", "row"]))
391
+ ], 64);
329
392
  }), 128))
330
393
  ]),
331
394
  _: 1
@@ -1,6 +1,6 @@
1
- .qd-form-item[data-v-ad5e6a9f] > .t-form__item > .t-form__controls > .t-form__controls-content > *:not(.t-switch):not(.t-tag):not(.t-icon):not(.qd-file-icon) {
1
+ .qd-form-item[data-v-e6936515] > .t-form__item > .t-form__controls > .t-form__controls-content > *:not(.t-switch):not(.t-tag):not(.t-icon):not(.qd-file-icon) {
2
2
  width: 100%;
3
3
  }
4
- .qd-form-item__component[data-v-ad5e6a9f]:not(.t-switch):not(.t-tag):not(.t-icon):not(.qd-file-icon) {
4
+ .qd-form-item__component[data-v-e6936515]:not(.t-switch):not(.t-tag):not(.t-icon):not(.qd-file-icon) {
5
5
  width: 100%;
6
6
  }
@@ -2,7 +2,7 @@ import './item.css'
2
2
  import _sfc_main from "./item.vue2.mjs";
3
3
  /* empty css */
4
4
  import _export_sfc from "../../_virtual/_plugin-vue_export-helper.mjs";
5
- const QdFormItem = /* @__PURE__ */ _export_sfc(_sfc_main, [["__scopeId", "data-v-ad5e6a9f"]]);
5
+ const QdFormItem = /* @__PURE__ */ _export_sfc(_sfc_main, [["__scopeId", "data-v-e6936515"]]);
6
6
  export {
7
7
  QdFormItem as default
8
8
  };
@@ -1,11 +1,14 @@
1
1
  import './item.css'
2
- import { defineComponent, mergeDefaults, computed, createBlock, createCommentVNode, openBlock, unref, mergeProps, withCtx, createVNode, normalizeProps, guardReactiveProps, createSlots, renderSlot, renderList } from "vue";
2
+ import { defineComponent, mergeDefaults, computed, inject, ref, createBlock, createCommentVNode, openBlock, unref, mergeProps, withCtx, createVNode, normalizeProps, guardReactiveProps, createSlots, renderSlot, renderList } from "vue";
3
3
  import { isEmpty, filterSlots } from "qidian-shared";
4
4
  import { FormItem } from "tdesign-vue-next";
5
5
  import { useConfig } from "../config-provider/useConfig.mjs";
6
6
  import { qdUseComputeValue } from "../config-renderer/compute.mjs";
7
+ import { PROVIDE_FORM_REGISTER_GRID_ITEM } from "./config.mjs";
7
8
  import { qdFormItemProps } from "./props.mjs";
8
9
  import { resolveQdFormItemOptions } from "./utils.mjs";
10
+ import { PROVIDE_GRID_ITEM_PROPS_KEY, PROVIDE_GRID_WIDTH_KEY, DEFAULT_GRID_WIDTH } from "../grid/config.mjs";
11
+ import { resolveGridSpan, mergeGridValue } from "../grid/utils.mjs";
9
12
  import QdGridItem from "../grid/item.vue.mjs";
10
13
  import _sfc_main$1 from "../config-renderer/index.vue.mjs";
11
14
  const _sfc_main = /* @__PURE__ */ defineComponent({
@@ -22,6 +25,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
22
25
  rules: {},
23
26
  size: {},
24
27
  trimOnBlur: { type: Boolean },
28
+ gridIndex: {},
25
29
  for: {},
26
30
  label: {},
27
31
  labelAlign: {},
@@ -57,8 +61,25 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
57
61
  }
58
62
  return ifRender;
59
63
  });
64
+ const gridDefaultProps = inject(PROVIDE_GRID_ITEM_PROPS_KEY, void 0);
65
+ const gridWidth = inject(PROVIDE_GRID_WIDTH_KEY, ref(DEFAULT_GRID_WIDTH));
66
+ const colSpan = computed(
67
+ () => resolveGridSpan(mergeGridValue(props.col, gridDefaultProps?.value?.col), gridWidth.value)
68
+ );
69
+ const gridIndex = computed(() => props.gridIndex);
70
+ inject(PROVIDE_FORM_REGISTER_GRID_ITEM, void 0)?.({ visible: reIfRender, colSpan, gridIndex });
60
71
  const reProps = computed(() => {
61
- const { col, row, component, required, rules, size, trimOnBlur, ...formItemOptions } = props;
72
+ const {
73
+ col,
74
+ row,
75
+ component,
76
+ required,
77
+ rules,
78
+ size,
79
+ trimOnBlur,
80
+ gridIndex: gridIndex2,
81
+ ...formItemOptions
82
+ } = props;
62
83
  const { component: reComponent, rules: wrappedRules } = resolveQdFormItemOptions({
63
84
  formItem: props,
64
85
  context: currentContext.value,
@@ -13,6 +13,7 @@ export declare const qdFormProps: {
13
13
  readonly gutter: () => number[];
14
14
  readonly grid: () => {};
15
15
  readonly data: () => any;
16
+ readonly autoFill: true;
16
17
  readonly disabled: undefined;
17
18
  readonly readonly: undefined;
18
19
  readonly labelWidth: "auto";
@@ -22,6 +23,7 @@ export declare const qdFormProps: {
22
23
  readonly preventSubmitDefault: true;
23
24
  readonly requiredMark: undefined;
24
25
  readonly showErrorMessage: true;
26
+ readonly showFirstErrorMessage: true;
25
27
  readonly statusIcon: undefined;
26
28
  readonly defaultClearable: undefined;
27
29
  };
@@ -13,6 +13,7 @@ const qdFormProps = {
13
13
  gutter: () => qdFormGutter,
14
14
  grid: () => ({}),
15
15
  data: () => ({}),
16
+ autoFill: true,
16
17
  disabled: void 0,
17
18
  readonly: void 0,
18
19
  // labelAlign: 'top',
@@ -23,6 +24,7 @@ const qdFormProps = {
23
24
  preventSubmitDefault: true,
24
25
  requiredMark: void 0,
25
26
  showErrorMessage: true,
27
+ showFirstErrorMessage: true,
26
28
  statusIcon: void 0,
27
29
  defaultClearable: void 0
28
30
  };
@@ -19,6 +19,7 @@ export interface QdFormItemProps extends Omit<TdFormItemProps, 'rules' | 'help'>
19
19
  rules?: QdFormRule[];
20
20
  size?: SizeEnum;
21
21
  trimOnBlur?: boolean;
22
+ gridIndex?: number;
22
23
  }
23
24
  export interface QdFormSubmitContext<FD extends Data = Data> extends SubmitContext<FD>, Pick<QdFormProps, 'crudMode'> {
24
25
  showErrorMessage: boolean;
@@ -32,14 +33,18 @@ export interface QdFormProps<FD extends Data = Data> extends Omit<TdFormProps<FD
32
33
  loadingProps?: TdLoadingProps;
33
34
  defaultClearable?: boolean;
34
35
  descriptions?: boolean;
36
+ autoFill?: boolean;
37
+ showFirstErrorMessage?: boolean;
35
38
  onSubmit?: (context: QdFormSubmitContext<FD>) => void;
36
39
  }
37
40
  export interface QdFormInstanceFunctions<FD extends Data = Data> extends Omit<FormInstanceFunctions, 'submit' | 'validate'> {
38
41
  submit: (params?: {
39
42
  showErrorMessage?: boolean;
43
+ showFirstErrorMessage?: boolean;
40
44
  scrollToFirstError?: QdFormProps['scrollToFirstError'];
41
45
  }) => Promise<QdFormSubmitContext<FD>>;
42
46
  validate: (params?: FormValidateParams & {
47
+ showFirstErrorMessage?: boolean;
43
48
  scrollToFirstError?: QdFormProps['scrollToFirstError'];
44
49
  }) => Promise<FormValidateResult<FD>>;
45
50
  }
@@ -1,4 +1,5 @@
1
- export { PROVIDE_GRID_ITEM_PROPS_KEY, PROVIDE_GRID_WIDTH_KEY } from './config';
1
+ export { DEFAULT_GRID_WIDTH, PROVIDE_GRID_ITEM_PROPS_KEY, PROVIDE_GRID_WIDTH_KEY } from './config';
2
2
  export { default as QdGrid } from './index.vue';
3
3
  export { default as QdGridItem } from './item.vue';
4
4
  export type { QdGridItemProps, QdGridProps } from './types';
5
+ export { mergeGridValue, resolveGridSpan } from './utils';
@@ -1,3 +1,3 @@
1
- .qd-grid-item[data-v-f601eb1d] {
1
+ .qd-grid-item[data-v-0d5f57c8] {
2
2
  min-width: 0;
3
3
  }
@@ -2,7 +2,7 @@ import './item.css'
2
2
  import _sfc_main from "./item.vue2.mjs";
3
3
  /* empty css */
4
4
  import _export_sfc from "../../_virtual/_plugin-vue_export-helper.mjs";
5
- const QdGridItem = /* @__PURE__ */ _export_sfc(_sfc_main, [["__scopeId", "data-v-f601eb1d"]]);
5
+ const QdGridItem = /* @__PURE__ */ _export_sfc(_sfc_main, [["__scopeId", "data-v-0d5f57c8"]]);
6
6
  export {
7
7
  QdGridItem as default
8
8
  };
@@ -1,7 +1,7 @@
1
1
  import './item.css'
2
2
  import { defineComponent, inject, ref, computed, createElementBlock, openBlock, normalizeStyle, renderSlot } from "vue";
3
- import { isEmpty } from "qidian-shared";
4
- import { PROVIDE_GRID_ITEM_PROPS_KEY, PROVIDE_GRID_WIDTH_KEY, DEFAULT_GRID_WIDTH, DEFAULT_COL, DEFAULT_BREAKPOINTS, DEFAULT_ROW } from "./config.mjs";
3
+ import { PROVIDE_GRID_ITEM_PROPS_KEY, PROVIDE_GRID_WIDTH_KEY, DEFAULT_GRID_WIDTH, DEFAULT_ROW } from "./config.mjs";
4
+ import { mergeGridValue, resolveGridSpan } from "./utils.mjs";
5
5
  const _sfc_main = /* @__PURE__ */ defineComponent({
6
6
  ...{
7
7
  name: "QdGridItem"
@@ -15,45 +15,14 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
15
15
  const props = __props;
16
16
  const defaultProps = inject(PROVIDE_GRID_ITEM_PROPS_KEY, void 0);
17
17
  const gridWidth = inject(PROVIDE_GRID_WIDTH_KEY, ref(DEFAULT_GRID_WIDTH));
18
- const reProps = computed(() => {
19
- const mergeGutterValue = (prop, defaultProp) => {
20
- if (prop === void 0) return defaultProp;
21
- if (!defaultProp) return prop;
22
- if (typeof prop === "number" || typeof defaultProp === "number") return prop;
23
- return {
24
- ...defaultProp,
25
- ...prop
26
- };
27
- };
28
- return {
29
- col: mergeGutterValue(props.col, defaultProps?.value?.col),
30
- row: mergeGutterValue(props.row, defaultProps?.value?.row)
31
- };
32
- });
33
- const getColSpan = computed(() => {
34
- const { col } = reProps.value;
35
- if (isEmpty(col)) return DEFAULT_COL;
36
- if (typeof col === "number") return col;
37
- const { span, xxl, xl, lg, md, sm, xs } = col;
38
- if (gridWidth.value >= DEFAULT_BREAKPOINTS.xxl && !isEmpty(xxl)) return xxl;
39
- if (gridWidth.value >= DEFAULT_BREAKPOINTS.xl && !isEmpty(xl)) return xl;
40
- if (gridWidth.value >= DEFAULT_BREAKPOINTS.lg && !isEmpty(lg)) return lg;
41
- if (gridWidth.value >= DEFAULT_BREAKPOINTS.md && !isEmpty(md)) return md;
42
- if (gridWidth.value >= DEFAULT_BREAKPOINTS.sm && !isEmpty(sm)) return sm;
43
- return xs ?? span ?? DEFAULT_COL;
44
- });
45
- const getRowSpan = computed(() => {
46
- const { row } = reProps.value;
47
- if (isEmpty(row)) return DEFAULT_ROW;
48
- if (typeof row === "number") return row;
49
- const { span, xxl, xl, lg, md, sm, xs } = row;
50
- if (gridWidth.value >= DEFAULT_BREAKPOINTS.xxl && !isEmpty(xxl)) return xxl;
51
- if (gridWidth.value >= DEFAULT_BREAKPOINTS.xl && !isEmpty(xl)) return xl;
52
- if (gridWidth.value >= DEFAULT_BREAKPOINTS.lg && !isEmpty(lg)) return lg;
53
- if (gridWidth.value >= DEFAULT_BREAKPOINTS.md && !isEmpty(md)) return md;
54
- if (gridWidth.value >= DEFAULT_BREAKPOINTS.sm && !isEmpty(sm)) return sm;
55
- return xs ?? span ?? DEFAULT_ROW;
56
- });
18
+ const reProps = computed(() => ({
19
+ col: mergeGridValue(props.col, defaultProps?.value?.col),
20
+ row: mergeGridValue(props.row, defaultProps?.value?.row)
21
+ }));
22
+ const getColSpan = computed(() => resolveGridSpan(reProps.value.col, gridWidth.value));
23
+ const getRowSpan = computed(
24
+ () => resolveGridSpan(reProps.value.row, gridWidth.value, DEFAULT_ROW)
25
+ );
57
26
  const itemStyle = computed(() => {
58
27
  if (getColSpan.value === 0 || getRowSpan.value === 0) {
59
28
  return { display: "none" };
@@ -0,0 +1,3 @@
1
+ import type { GridGutterValue } from './types';
2
+ export declare function mergeGridValue(prop: GridGutterValue | undefined, defaultProp: GridGutterValue | undefined): GridGutterValue | undefined;
3
+ export declare function resolveGridSpan(value: GridGutterValue | undefined, gridWidth: number, fallback?: number): number;
@@ -0,0 +1,26 @@
1
+ import { isEmpty } from "qidian-shared";
2
+ import { DEFAULT_COL, DEFAULT_BREAKPOINTS } from "./config.mjs";
3
+ function mergeGridValue(prop, defaultProp) {
4
+ if (prop === void 0) return defaultProp;
5
+ if (!defaultProp) return prop;
6
+ if (typeof prop === "number" || typeof defaultProp === "number") return prop;
7
+ return {
8
+ ...defaultProp,
9
+ ...prop
10
+ };
11
+ }
12
+ function resolveGridSpan(value, gridWidth, fallback = DEFAULT_COL) {
13
+ if (isEmpty(value)) return fallback;
14
+ if (typeof value === "number") return value;
15
+ const { span, xxl, xl, lg, md, sm, xs } = value;
16
+ if (gridWidth >= DEFAULT_BREAKPOINTS.xxl && !isEmpty(xxl)) return xxl;
17
+ if (gridWidth >= DEFAULT_BREAKPOINTS.xl && !isEmpty(xl)) return xl;
18
+ if (gridWidth >= DEFAULT_BREAKPOINTS.lg && !isEmpty(lg)) return lg;
19
+ if (gridWidth >= DEFAULT_BREAKPOINTS.md && !isEmpty(md)) return md;
20
+ if (gridWidth >= DEFAULT_BREAKPOINTS.sm && !isEmpty(sm)) return sm;
21
+ return xs ?? span ?? fallback;
22
+ }
23
+ export {
24
+ mergeGridValue,
25
+ resolveGridSpan
26
+ };
@@ -1,111 +1,111 @@
1
- .qd-service-table[data-v-f767865b] {
1
+ .qd-service-table[data-v-1bab93e0] {
2
2
  height: 100%;
3
3
  display: flex;
4
4
  flex-direction: column;
5
5
  }
6
- .qd-service-table[data-v-f767865b] > .t-table__content {
6
+ .qd-service-table[data-v-1bab93e0] > .t-table__content {
7
7
  flex: 1;
8
8
  }
9
- .qd-service-table--mini[data-v-f767865b] {
9
+ .qd-service-table--mini[data-v-1bab93e0] {
10
10
  font: var(--td-font-body-small);
11
11
  }
12
- .qd-service-table--mini[data-v-f767865b] th,
13
- .qd-service-table--mini[data-v-f767865b] tr:not(.t-table__expanded-row) > td {
12
+ .qd-service-table--mini[data-v-1bab93e0] th,
13
+ .qd-service-table--mini[data-v-1bab93e0] tr:not(.t-table__expanded-row) > td {
14
14
  padding: var(--td-comp-paddingTB-xxs) var(--td-comp-paddingLR-xxs);
15
15
  line-height: var(--td-line-height-body-small);
16
16
  }
17
- .qd-service-table--mini[data-v-f767865b] .t-table__row-full-element {
17
+ .qd-service-table--mini[data-v-1bab93e0] .t-table__row-full-element {
18
18
  padding: var(--td-comp-paddingTB-xs) var(--td-comp-paddingLR-s);
19
19
  }
20
- .qd-service-table--hide-empty-image[data-v-f767865b] .t-table__empty {
20
+ .qd-service-table--hide-empty-image[data-v-1bab93e0] .t-table__empty {
21
21
  min-height: auto;
22
22
  }
23
- .qd-service-table--hide-empty-image[data-v-f767865b] .t-table__empty .t-empty {
23
+ .qd-service-table--hide-empty-image[data-v-1bab93e0] .t-table__empty .t-empty {
24
24
  padding: 0 !important;
25
25
  }
26
- .qd-service-table--hide-empty-image[data-v-f767865b] .t-table__empty .t-empty__image {
26
+ .qd-service-table--hide-empty-image[data-v-1bab93e0] .t-table__empty .t-empty__image {
27
27
  display: none;
28
28
  }
29
- .qd-service-table--hide-empty-image[data-v-f767865b] .t-table__empty .t-empty__title {
29
+ .qd-service-table--hide-empty-image[data-v-1bab93e0] .t-table__empty .t-empty__title {
30
30
  margin-top: 0;
31
31
  }
32
- .qd-service-table[data-v-f767865b] .t-table__tree-col,
33
- .qd-service-table[data-v-f767865b] .t-table__tree-leaf-node {
32
+ .qd-service-table[data-v-1bab93e0] .t-table__tree-col,
33
+ .qd-service-table[data-v-1bab93e0] .t-table__tree-leaf-node {
34
34
  padding-left: 0 !important;
35
35
  }
36
- .qd-service-table[data-v-f767865b] .t-table__tree-col:not(:has(.t-table__tree-op-icon)) {
36
+ .qd-service-table[data-v-1bab93e0] .t-table__tree-col:not(:has(.t-table__tree-op-icon)) {
37
37
  margin-left: calc(var(--td-font-size-body-large) + var(--td-tree-indent, 0px) * (var(--td-tree-level, 0) + 1));
38
38
  }
39
- .qd-service-table[data-v-f767865b] .t-table__tree-op-icon {
39
+ .qd-service-table[data-v-1bab93e0] .t-table__tree-op-icon {
40
40
  margin-right: calc(var(--td-tree-indent, 0px) * (var(--td-tree-level, 0) + 1));
41
41
  }
42
- .qd-service-table[data-v-f767865b] .t-table__tree-leaf-node .t-table__tree-op-icon:empty {
42
+ .qd-service-table[data-v-1bab93e0] .t-table__tree-leaf-node .t-table__tree-op-icon:empty {
43
43
  width: var(--td-font-size-body-large);
44
44
  margin-right: calc(var(--td-tree-indent, 0px) * (var(--td-tree-level, 0) + 1));
45
45
  }
46
- .qd-service-table[data-v-f767865b] .t-affix > .t-table__affixed-header-elm-wrap,
47
- .qd-service-table[data-v-f767865b] .t-affix > .t-table__scrollbar--obvious {
48
- transform: var(--b05f81fa);
46
+ .qd-service-table[data-v-1bab93e0] .t-affix > .t-table__affixed-header-elm-wrap,
47
+ .qd-service-table[data-v-1bab93e0] .t-affix > .t-table__scrollbar--obvious {
48
+ transform: var(--v7fcd2546);
49
49
  }
50
- .qd-service-table--horizontal-bar-static[data-v-f767865b] .t-table__scrollbar--obvious {
50
+ .qd-service-table--horizontal-bar-static[data-v-1bab93e0] .t-table__scrollbar--obvious {
51
51
  visibility: hidden;
52
52
  pointer-events: none;
53
53
  }
54
- .qd-service-table--horizontal-bar-static[data-v-f767865b] > div:has(> div > .t-table__scrollbar--obvious) {
54
+ .qd-service-table--horizontal-bar-static[data-v-1bab93e0] > div:has(> div > .t-table__scrollbar--obvious) {
55
55
  height: 0;
56
56
  margin-top: 0 !important;
57
57
  overflow: hidden;
58
58
  }
59
- .qd-service-table[data-v-f767865b] .t-table__expanded-row .qd-service-table--horizontal-bar-static > div:has(> div > .t-table__scrollbar--obvious) {
59
+ .qd-service-table[data-v-1bab93e0] .t-table__expanded-row .qd-service-table--horizontal-bar-static > div:has(> div > .t-table__scrollbar--obvious) {
60
60
  display: none;
61
61
  }
62
- .qd-service-table[data-v-f767865b] .t-table__expanded-row > td {
62
+ .qd-service-table[data-v-1bab93e0] .t-table__expanded-row > td {
63
63
  height: 0;
64
64
  }
65
- .qd-service-table[data-v-f767865b] .t-table__affixed-header-elm-wrap {
65
+ .qd-service-table[data-v-1bab93e0] .t-table__affixed-header-elm-wrap {
66
66
  height: auto !important;
67
67
  }
68
- .qd-service-table[data-v-f767865b] .t-table__affixed-header-elm {
68
+ .qd-service-table[data-v-1bab93e0] .t-table__affixed-header-elm {
69
69
  position: relative;
70
70
  scrollbar-width: none;
71
71
  }
72
- .qd-service-table[data-v-f767865b] .t-table__affixed-header-elm::-webkit-scrollbar {
72
+ .qd-service-table[data-v-1bab93e0] .t-table__affixed-header-elm::-webkit-scrollbar {
73
73
  display: none;
74
74
  width: 0;
75
75
  height: 0;
76
76
  }
77
- .qd-service-table[data-v-f767865b] .t-table__virtual-scroll-cursor + table {
77
+ .qd-service-table[data-v-1bab93e0] .t-table__virtual-scroll-cursor + table {
78
78
  border-collapse: separate;
79
79
  }
80
- .qd-service-table[data-v-f767865b] .t-table__expanded-row-inner,
81
- .qd-service-table[data-v-f767865b] .t-table__row-filter-inner {
80
+ .qd-service-table[data-v-1bab93e0] .t-table__expanded-row-inner,
81
+ .qd-service-table[data-v-1bab93e0] .t-table__row-filter-inner {
82
82
  display: block;
83
83
  position: sticky;
84
84
  left: 0;
85
- width: var(--v103eb438) !important;
85
+ width: var(--ad8fa3dc) !important;
86
86
  }
87
- .qd-service-table[data-v-f767865b] .t-table__cell-wrap > .t-form__controls > .t-form__controls-content > *:not(.t-switch):not(.t-tag):not(.t-icon):not(.qd-file-icon) {
87
+ .qd-service-table[data-v-1bab93e0] .t-table__cell-wrap > .t-form__controls > .t-form__controls-content > *:not(.t-switch):not(.t-tag):not(.t-icon):not(.qd-file-icon) {
88
88
  width: 100%;
89
89
  }
90
- .qd-service-table[data-v-f767865b] .qd-service-table__non-editable-col {
90
+ .qd-service-table[data-v-1bab93e0] .qd-service-table__non-editable-col {
91
91
  background-color: color-mix(in srgb, var(--td-bg-color-component) 50%, transparent);
92
92
  }
93
- .qd-service-table[data-v-f767865b] td.qd-service-table__selected-cell {
93
+ .qd-service-table[data-v-1bab93e0] td.qd-service-table__selected-cell {
94
94
  box-shadow: inset 0 1px 0 0 var(--qst-sel-t, transparent), inset 0 -1px 0 0 var(--qst-sel-b, transparent), inset 1px 0 0 0 var(--qst-sel-l, transparent), inset -1px 0 0 0 var(--qst-sel-r, transparent);
95
95
  }
96
- .qd-service-table[data-v-f767865b] .qd-service-table__selected-bt {
96
+ .qd-service-table[data-v-1bab93e0] .qd-service-table__selected-bt {
97
97
  --qst-sel-t: var(--td-brand-color);
98
98
  }
99
- .qd-service-table[data-v-f767865b] .qd-service-table__selected-bb {
99
+ .qd-service-table[data-v-1bab93e0] .qd-service-table__selected-bb {
100
100
  --qst-sel-b: var(--td-brand-color);
101
101
  }
102
- .qd-service-table[data-v-f767865b] .qd-service-table__selected-bl {
102
+ .qd-service-table[data-v-1bab93e0] .qd-service-table__selected-bl {
103
103
  --qst-sel-l: var(--td-brand-color);
104
104
  }
105
- .qd-service-table[data-v-f767865b] .qd-service-table__selected-br {
105
+ .qd-service-table[data-v-1bab93e0] .qd-service-table__selected-br {
106
106
  --qst-sel-r: var(--td-brand-color);
107
107
  }
108
- .qd-service-table[data-v-f767865b] td.qd-service-table__copied-cell {
108
+ .qd-service-table[data-v-1bab93e0] td.qd-service-table__copied-cell {
109
109
  background-image: var(--qst-copy-t, none), var(--qst-copy-b, none), var(--qst-copy-l, none), var(--qst-copy-r, none);
110
110
  background-size: 8px 1px,
111
111
  8px 1px,
@@ -116,134 +116,134 @@
116
116
  0 0,
117
117
  100% 0;
118
118
  background-repeat: repeat-x, repeat-x, repeat-y, repeat-y;
119
- animation: qst-cell-ants-f767865b 0.5s linear infinite;
119
+ animation: qst-cell-ants-1bab93e0 0.5s linear infinite;
120
120
  }
121
- .qd-service-table[data-v-f767865b] td.qd-service-table__copied-cell.qd-service-table__selected-cell {
121
+ .qd-service-table[data-v-1bab93e0] td.qd-service-table__copied-cell.qd-service-table__selected-cell {
122
122
  background-size: 8px 2px,
123
123
  8px 2px,
124
124
  2px 8px,
125
125
  2px 8px;
126
126
  }
127
- .qd-service-table[data-v-f767865b] .qd-service-table__copied-bt {
127
+ .qd-service-table[data-v-1bab93e0] .qd-service-table__copied-bt {
128
128
  --qst-copy-t: linear-gradient(90deg, var(--td-brand-color-hover) 50%, transparent 0);
129
129
  }
130
- .qd-service-table[data-v-f767865b] .qd-service-table__copied-bb {
130
+ .qd-service-table[data-v-1bab93e0] .qd-service-table__copied-bb {
131
131
  --qst-copy-b: linear-gradient(90deg, var(--td-brand-color-hover) 50%, transparent 0);
132
132
  }
133
- .qd-service-table[data-v-f767865b] .qd-service-table__copied-bl {
133
+ .qd-service-table[data-v-1bab93e0] .qd-service-table__copied-bl {
134
134
  --qst-copy-l: linear-gradient(0deg, var(--td-brand-color-hover) 50%, transparent 0);
135
135
  }
136
- .qd-service-table[data-v-f767865b] .qd-service-table__copied-br {
136
+ .qd-service-table[data-v-1bab93e0] .qd-service-table__copied-br {
137
137
  --qst-copy-r: linear-gradient(0deg, var(--td-brand-color-hover) 50%, transparent 0);
138
138
  }
139
- .qd-service-table[data-v-f767865b] tbody > tr.t-table__row--active {
139
+ .qd-service-table[data-v-1bab93e0] tbody > tr.t-table__row--active {
140
140
  background-color: var(--td-brand-color-light);
141
141
  }
142
- .qd-service-table[data-v-f767865b] tbody > tr.t-table__row--active.t-table__row--hover,
143
- .qd-service-table[data-v-f767865b] tbody > tr.t-table__row--active:hover {
142
+ .qd-service-table[data-v-1bab93e0] tbody > tr.t-table__row--active.t-table__row--hover,
143
+ .qd-service-table[data-v-1bab93e0] tbody > tr.t-table__row--active:hover {
144
144
  background-color: var(--td-brand-color-light-hover);
145
145
  }
146
- .qd-service-table[data-v-f767865b] .qd-service-table__non-editable-col:not(.qd-service-table__copied-cell):is(
146
+ .qd-service-table[data-v-1bab93e0] .qd-service-table__non-editable-col:not(.qd-service-table__copied-cell):is(
147
147
  .t-table__cell--fixed-left,
148
148
  .t-table__cell--fixed-right
149
149
  ) {
150
150
  background-color: inherit;
151
151
  background-image: linear-gradient(color-mix(in srgb, var(--td-bg-color-secondarycontainer) 50%, transparent), color-mix(in srgb, var(--td-bg-color-secondarycontainer) 50%, transparent));
152
152
  }
153
- .qd-service-table--disable-horizontal-scroll[data-v-f767865b] colgroup > col {
153
+ .qd-service-table--disable-horizontal-scroll[data-v-1bab93e0] colgroup > col {
154
154
  width: auto !important;
155
155
  }
156
- .qd-service-table--cell-drag-selecting[data-v-f767865b] {
156
+ .qd-service-table--cell-drag-selecting[data-v-1bab93e0] {
157
157
  cursor: crosshair;
158
158
  }
159
- .qd-service-table--cell-drag-selecting[data-v-f767865b] td {
159
+ .qd-service-table--cell-drag-selecting[data-v-1bab93e0] td {
160
160
  cursor: crosshair;
161
161
  }
162
- .qd-service-table[data-v-f767865b] .t-table__filter-pop-content-inner {
162
+ .qd-service-table[data-v-1bab93e0] .t-table__filter-pop-content-inner {
163
163
  padding: var(--td-comp-paddingTB-s) var(--td-comp-paddingLR-s) 0;
164
164
  }
165
- .qd-service-table[data-v-f767865b] .t-table__filter-pop-content-inner:has(.qd-service-table-filter-item) {
165
+ .qd-service-table[data-v-1bab93e0] .t-table__filter-pop-content-inner:has(.qd-service-table-filter-item) {
166
166
  padding: 0;
167
167
  }
168
- .qd-service-table[data-v-f767865b] .t-table__filter-pop-content-inner:has(
168
+ .qd-service-table[data-v-1bab93e0] .t-table__filter-pop-content-inner:has(
169
169
  .qd-service-table-filter-input,
170
170
  .qd-service-table-filter-custom
171
171
  ) {
172
172
  padding-bottom: var(--td-comp-paddingTB-s);
173
173
  }
174
- .qd-service-table[data-v-f767865b] .t-table__filter--bottom-buttons {
174
+ .qd-service-table[data-v-1bab93e0] .t-table__filter--bottom-buttons {
175
175
  padding: var(--td-comp-paddingTB-s) var(--td-comp-paddingLR-s);
176
176
  }
177
- .qd-service-table--mini[data-v-f767865b] .t-table__filter-pop-content-inner {
177
+ .qd-service-table--mini[data-v-1bab93e0] .t-table__filter-pop-content-inner {
178
178
  padding: var(--td-comp-paddingTB-xs) var(--td-comp-paddingLR-xs) 0;
179
179
  }
180
- .qd-service-table--mini[data-v-f767865b] .t-table__filter--bottom-buttons {
180
+ .qd-service-table--mini[data-v-1bab93e0] .t-table__filter--bottom-buttons {
181
181
  padding: var(--td-comp-paddingTB-xs) var(--td-comp-paddingLR-xs);
182
182
  }
183
- .qd-service-table--mini[data-v-f767865b] .t-table__filter-pop-content-inner:has(.qd-service-table-filter-item) {
183
+ .qd-service-table--mini[data-v-1bab93e0] .t-table__filter-pop-content-inner:has(.qd-service-table-filter-item) {
184
184
  padding: 0;
185
185
  }
186
- .qd-service-table--mini[data-v-f767865b] .t-table__filter-pop-content-inner:has(
186
+ .qd-service-table--mini[data-v-1bab93e0] .t-table__filter-pop-content-inner:has(
187
187
  .qd-service-table-filter-input,
188
188
  .qd-service-table-filter-custom
189
189
  ) {
190
190
  padding-bottom: var(--td-comp-paddingTB-xs);
191
191
  }
192
- .qd-service-table[data-v-f767865b] .qd-service-table-filter-item {
192
+ .qd-service-table[data-v-1bab93e0] .qd-service-table-filter-item {
193
193
  width: 266px;
194
194
  }
195
- .qd-service-table[data-v-f767865b] .qd-service-table-filter-item__search,
196
- .qd-service-table[data-v-f767865b] .qd-service-table-filter-item__all,
197
- .qd-service-table[data-v-f767865b] .qd-service-table-filter-item__options {
195
+ .qd-service-table[data-v-1bab93e0] .qd-service-table-filter-item__search,
196
+ .qd-service-table[data-v-1bab93e0] .qd-service-table-filter-item__all,
197
+ .qd-service-table[data-v-1bab93e0] .qd-service-table-filter-item__options {
198
198
  padding: var(--td-comp-paddingTB-s) var(--td-comp-paddingLR-s) 0;
199
199
  }
200
- .qd-service-table[data-v-f767865b] .qd-service-table-filter-item__all {
200
+ .qd-service-table[data-v-1bab93e0] .qd-service-table-filter-item__all {
201
201
  display: flex;
202
202
  align-items: center;
203
203
  padding: 0 var(--td-comp-paddingLR-s);
204
204
  border-bottom: 1px solid var(--td-component-stroke);
205
205
  }
206
- .qd-service-table[data-v-f767865b] .qd-service-table-filter-item__options {
206
+ .qd-service-table[data-v-1bab93e0] .qd-service-table-filter-item__options {
207
207
  display: flex;
208
208
  flex-direction: column;
209
209
  height: 206px;
210
210
  padding: 0 var(--td-comp-paddingLR-s);
211
211
  overflow-y: auto;
212
212
  }
213
- .qd-service-table[data-v-f767865b] .qd-service-table-filter-item__count {
213
+ .qd-service-table[data-v-1bab93e0] .qd-service-table-filter-item__count {
214
214
  margin-left: var(--td-comp-margin-xs);
215
215
  color: var(--td-text-color-placeholder);
216
216
  }
217
- .qd-service-table[data-v-f767865b] .qd-service-table-filter-item__cell {
217
+ .qd-service-table[data-v-1bab93e0] .qd-service-table-filter-item__cell {
218
218
  pointer-events: none;
219
219
  }
220
- .qd-service-table[data-v-f767865b] .qd-service-table-filter-item .t-checkbox,
221
- .qd-service-table[data-v-f767865b] .qd-service-table-filter-item .t-radio {
220
+ .qd-service-table[data-v-1bab93e0] .qd-service-table-filter-item .t-checkbox,
221
+ .qd-service-table[data-v-1bab93e0] .qd-service-table-filter-item .t-radio {
222
222
  display: flex;
223
223
  align-items: center;
224
224
  }
225
- .qd-service-table[data-v-f767865b] .qd-service-table-filter-item .t-checkbox__label,
226
- .qd-service-table[data-v-f767865b] .qd-service-table-filter-item .t-radio__label {
225
+ .qd-service-table[data-v-1bab93e0] .qd-service-table-filter-item .t-checkbox__label,
226
+ .qd-service-table[data-v-1bab93e0] .qd-service-table-filter-item .t-radio__label {
227
227
  display: inline-flex;
228
228
  flex: 1 1 0;
229
229
  align-items: center;
230
230
  min-width: 0;
231
231
  overflow: hidden;
232
232
  }
233
- .qd-service-table--mini[data-v-f767865b] .qd-service-table-filter-item__search {
233
+ .qd-service-table--mini[data-v-1bab93e0] .qd-service-table-filter-item__search {
234
234
  padding: var(--td-comp-paddingTB-xs) var(--td-comp-paddingLR-xs) 0;
235
235
  }
236
- .qd-service-table--mini[data-v-f767865b] .qd-service-table-filter-item__all,
237
- .qd-service-table--mini[data-v-f767865b] .qd-service-table-filter-item__options {
236
+ .qd-service-table--mini[data-v-1bab93e0] .qd-service-table-filter-item__all,
237
+ .qd-service-table--mini[data-v-1bab93e0] .qd-service-table-filter-item__options {
238
238
  padding: 0 var(--td-comp-paddingLR-xs);
239
239
  }
240
- @keyframes qst-cell-ants-f767865b {
240
+ @keyframes qst-cell-ants-1bab93e0 {
241
241
  to {
242
242
  background-position: 8px 0, -8px 100%, 0 -8px, 100% 8px;
243
243
  }
244
244
  }
245
245
  @media (prefers-reduced-motion: reduce) {
246
- [data-v-f767865b] td.qd-service-table__copied-cell {
246
+ [data-v-1bab93e0] td.qd-service-table__copied-cell {
247
247
  animation: none;
248
248
  }
249
249
  }
@@ -2,7 +2,7 @@ import './index.css'
2
2
  import _sfc_main from "./index.vue2.mjs";
3
3
  /* empty css */
4
4
  import _export_sfc from "../../../_virtual/_plugin-vue_export-helper.mjs";
5
- const QdServiceTable = /* @__PURE__ */ _export_sfc(_sfc_main, [["__scopeId", "data-v-f767865b"]]);
5
+ const QdServiceTable = /* @__PURE__ */ _export_sfc(_sfc_main, [["__scopeId", "data-v-1bab93e0"]]);
6
6
  export {
7
7
  QdServiceTable as default
8
8
  };
@@ -364,8 +364,8 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
364
364
  emit: __emit
365
365
  }) {
366
366
  useCssVars((_ctx) => ({
367
- "b05f81fa": affixedHeaderTransform.value,
368
- "v103eb438": expandedRowWidth.value
367
+ "v7fcd2546": affixedHeaderTransform.value,
368
+ "ad8fa3dc": expandedRowWidth.value
369
369
  }));
370
370
  const props = __props;
371
371
  const emit = __emit;
@@ -1103,10 +1103,34 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
1103
1103
  columns
1104
1104
  };
1105
1105
  }
1106
+ function solidifyLeafMinWidth(columns) {
1107
+ return columns.map((item) => {
1108
+ if (!item.children?.length) return item;
1109
+ return {
1110
+ ...item,
1111
+ children: solidifyGroupChildren(item.children)
1112
+ };
1113
+ });
1114
+ }
1115
+ function solidifyGroupChildren(columns) {
1116
+ return columns.map((item) => {
1117
+ if (item.children?.length) {
1118
+ return {
1119
+ ...item,
1120
+ children: solidifyGroupChildren(item.children)
1121
+ };
1122
+ }
1123
+ if (!isEmpty(item.width) || isEmpty(item.minWidth)) return item;
1124
+ return {
1125
+ ...item,
1126
+ width: Number(item.minWidth)
1127
+ };
1128
+ });
1129
+ }
1106
1130
  const autoWidthColumns = computed(() => {
1107
1131
  const observedWidth = tableContentWidth.value;
1108
1132
  const containerWidth = observedWidth > 0 ? (tableContentEl.value?.clientWidth ?? observedWidth) - 1 : 0;
1109
- const columns = reProps.value.columns;
1133
+ const columns = solidifyLeafMinWidth(reProps.value.columns);
1110
1134
  const noWidthCols = columns.filter((c) => isEmpty(c.width));
1111
1135
  const fixedWidth = columns.filter((c) => !isEmpty(c.width)).reduce((sum, c) => sum + Number(c.width), 0);
1112
1136
  if (containerWidth <= 0 || !noWidthCols.length) return columns;
package/dist/index.mjs CHANGED
@@ -34,9 +34,10 @@ import { PROVIDE_FORM_ADD_AFTER_SUBMIT_QUEUE, PROVIDE_FORM_ADD_BEFORE_SUBMIT_QUE
34
34
  import { default as default24 } from "./components/form/index.vue.mjs";
35
35
  import { default as default25 } from "./components/form/item.vue.mjs";
36
36
  import { qdFormGrid, qdFormGutter } from "./components/form/props.mjs";
37
- import { PROVIDE_GRID_ITEM_PROPS_KEY, PROVIDE_GRID_WIDTH_KEY } from "./components/grid/config.mjs";
37
+ import { DEFAULT_GRID_WIDTH, PROVIDE_GRID_ITEM_PROPS_KEY, PROVIDE_GRID_WIDTH_KEY } from "./components/grid/config.mjs";
38
38
  import { default as default26 } from "./components/grid/index.vue.mjs";
39
39
  import { default as default27 } from "./components/grid/item.vue.mjs";
40
+ import { mergeGridValue, resolveGridSpan } from "./components/grid/utils.mjs";
40
41
  import { default as default28 } from "./components/left-ribbon-tag/index.vue.mjs";
41
42
  import { default as default29 } from "./components/org/tag/index.vue.mjs";
42
43
  import { default as default30 } from "./components/read-write/index.vue.mjs";
@@ -68,6 +69,7 @@ import * as auth from "./utils/auth.mjs";
68
69
  import { useUICsl } from "./utils/tools.mjs";
69
70
  import { formatDuration } from "./utils/date.mjs";
70
71
  export {
72
+ DEFAULT_GRID_WIDTH,
71
73
  PROVIDE_FORM_ADD_AFTER_SUBMIT_QUEUE,
72
74
  PROVIDE_FORM_ADD_BEFORE_SUBMIT_QUEUE,
73
75
  PROVIDE_FORM_RESET_QUEUE,
@@ -125,6 +127,7 @@ export {
125
127
  hasPermiDirective,
126
128
  hasRole,
127
129
  hasRoleDirective,
130
+ mergeGridValue,
128
131
  parseVModelPath,
129
132
  qdAsyncCompute,
130
133
  qdCompute,
@@ -132,6 +135,7 @@ export {
132
135
  qdFormGutter,
133
136
  qdUploadAcceptMap,
134
137
  qdUseComputeValue,
138
+ resolveGridSpan,
135
139
  resolveVModelBinding,
136
140
  setValueByPath,
137
141
  useAgentChat,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "qidian-vue-ui",
3
- "version": "2.4.0",
3
+ "version": "2.5.0",
4
4
  "description": "基于 TDesign 的 QiDian Vue UI 组件库",
5
5
  "author": "qidian",
6
6
  "license": "MIT",