easybill-ui 1.3.0 → 1.3.1

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.
@@ -1,31 +1,59 @@
1
1
  <template>
2
2
  <el-form ref="schemaFormRef" :model="formModel" :rules="rules" v-bind="{ ...$attrs, ...getFormProps }" class="curd-form" :style="getFormStyle()" @submit.prevent>
3
3
  <template v-for="formItem in schemaItems" :key="formItem.prop">
4
- <el-form-item
5
- v-if="!$slots[formItem.prop + 'Item']"
6
- :required="rules && rules[formItem.prop]?.find((a) => a.hasOwnProperty('required'))?.required"
7
- :label="formItem.label"
8
- :prop="formItem.prop"
9
- :label-width="formItem.labelWidth"
10
- :class="getFormItemStyle(formItem)"
11
- v-bind="getFormItemProps(formItem)"
12
- >
13
- <template v-for="(item, key) in getFormItemProps(formItem)?.slots || {}" :key="key" #[key]="row">
14
- <component :is="item" v-bind="row" />
15
- </template>
16
-
17
- <slot :name="formItem.prop" :form-item="formItem" :form-model="formModel"></slot>
18
- <FormItem v-if="!(formItem.prop && $slots[formItem.prop])" :form-item="formItem" :form-model="formModel" @change="onChange">
19
- <template #prefix>
20
- <slot :name="formItem.prop + 'Prefix'" :form-item="formItem" :form-model="formModel"></slot>
21
- </template>
22
- <template #suffix>
23
- <slot :name="formItem.prop + 'Suffix'" :form-item="formItem" :form-model="formModel"></slot>
4
+ <!-- choose 类型特殊处理,不使用 el-form-item 包裹,避免嵌套问题 -->
5
+ <template v-if="formItem.type === 'choose'">
6
+ <div v-if="!$slots[formItem.prop + 'Item']" class="el-form-item choose-group-wrapper" :class="[getFormItemStyle(formItem), getChooseFormItemClass(formItem)]" :style="getChooseFormItemStyle(formItem)">
7
+ <!-- label 区域 -->
8
+ <label v-if="formItem.label" class="el-form-item__label" :style="{ width: getLabelWidth(formItem) }">
9
+ {{ formItem.label }}
10
+ </label>
11
+
12
+ <!-- content 区域 -->
13
+ <div class="el-form-item__content" :style="{ marginLeft: getLabelPosition(formItem) !== 'top' ? '' : '' }">
14
+ <slot :name="formItem.prop" :form-item="formItem" :form-model="formModel"></slot>
15
+ <FormItem v-if="!(formItem.prop && $slots[formItem.prop])" :form-item="formItem" :form-model="formModel" @change="onChange">
16
+ <template #prefix>
17
+ <slot :name="formItem.prop + 'Prefix'" :form-item="formItem" :form-model="formModel"></slot>
18
+ </template>
19
+ <template #suffix>
20
+ <slot :name="formItem.prop + 'Suffix'" :form-item="formItem" :form-model="formModel"></slot>
21
+ </template>
22
+ </FormItem>
23
+ <slot :name="formItem.prop + 'Bottom'" :form-item="formItem" :form-model="formModel"></slot>
24
+ </div>
25
+ </div>
26
+ <slot :name="formItem.prop + 'Item'" :form-item="formItem" :form-model="formModel"></slot>
27
+ </template>
28
+
29
+ <!-- 其他类型使用 el-form-item 包裹 -->
30
+ <template v-else>
31
+ <el-form-item
32
+ v-if="!$slots[formItem.prop + 'Item']"
33
+ :required="rules && rules[formItem.prop]?.find((a) => a.hasOwnProperty('required'))?.required"
34
+ :label="formItem.label"
35
+ :prop="formItem.prop"
36
+ :label-width="formItem.labelWidth"
37
+ :class="getFormItemStyle(formItem)"
38
+ v-bind="getFormItemProps(formItem)"
39
+ >
40
+ <template v-for="(item, key) in getFormItemProps(formItem)?.slots || {}" :key="key" #[key]="row">
41
+ <component :is="item" v-bind="row" />
24
42
  </template>
25
- </FormItem>
26
- <slot :name="formItem.prop + 'Bottom'" :form-item="formItem" :form-model="formModel"></slot>
27
- </el-form-item>
28
- <slot :name="formItem.prop + 'Item'" :form-item="formItem" :form-model="formModel"></slot>
43
+
44
+ <slot :name="formItem.prop" :form-item="formItem" :form-model="formModel"></slot>
45
+ <FormItem v-if="!(formItem.prop && $slots[formItem.prop])" :form-item="formItem" :form-model="formModel" @change="onChange">
46
+ <template #prefix>
47
+ <slot :name="formItem.prop + 'Prefix'" :form-item="formItem" :form-model="formModel"></slot>
48
+ </template>
49
+ <template #suffix>
50
+ <slot :name="formItem.prop + 'Suffix'" :form-item="formItem" :form-model="formModel"></slot>
51
+ </template>
52
+ </FormItem>
53
+ <slot :name="formItem.prop + 'Bottom'" :form-item="formItem" :form-model="formModel"></slot>
54
+ </el-form-item>
55
+ <slot :name="formItem.prop + 'Item'" :form-item="formItem" :form-model="formModel"></slot>
56
+ </template>
29
57
  </template>
30
58
  <template v-if="$slots['operate-button']">
31
59
  <el-form-item style="max-width: 100%">
@@ -36,6 +64,7 @@
36
64
  </template>
37
65
 
38
66
  <script lang="ts" setup>
67
+ import { ElForm, type FormRules } from "element-plus"
39
68
  import { computed, getCurrentInstance, onMounted, provide, reactive, ref, triggerRef, watch, type PropType } from "vue"
40
69
  import FormItem from "./FormItem.vue"
41
70
  import type { CurdFormOptionItem, Fields, FormContext, FormItem as FormItemType, FormSchema } from "./types"
@@ -92,6 +121,21 @@ const schemaValues = sFormSchema.value.formItem.reduce<Fields>((previousValue, c
92
121
  if (typeof currentValue.value !== "undefined" && currentValue.prop && (typeof formModel[currentValue.prop] == "undefined" || formModel[currentValue.prop] === "" || formModel[currentValue.prop] === null)) {
93
122
  previousValue[currentValue.prop] = currentValue.value
94
123
  }
124
+
125
+ // 处理 choose 类型 items 的默认值
126
+ if (currentValue.type === "choose" && currentValue.options) {
127
+ currentValue.options.forEach((option) => {
128
+ if (option.items) {
129
+ option.items.forEach((subItem) => {
130
+ subItem.eventObject ??= {}
131
+ if (typeof subItem.value !== "undefined" && subItem.prop && (typeof formModel[subItem.prop] == "undefined" || formModel[subItem.prop] === "" || formModel[subItem.prop] === null)) {
132
+ previousValue[subItem.prop] = subItem.value
133
+ }
134
+ })
135
+ }
136
+ })
137
+ }
138
+
95
139
  return previousValue
96
140
  }, {})
97
141
 
@@ -114,13 +158,27 @@ const schemaItems = computed(() => {
114
158
  })
115
159
  // 异步设置默认数据
116
160
  sFormSchema.value.formItem.forEach(async (item) => {
117
- //
118
- // 异步选项
161
+ // 异步选项 - 顶层表单项
119
162
  if (item.asyncOptions && (item.autoload || typeof item.autoload == "undefined") && item.asyncOptions instanceof Function) {
120
163
  item.loading = true
121
164
  item.options = await item.asyncOptions(formModel, item, curdFormContext).finally(() => (item.loading = false))
122
165
  if (!instance?.isUnmounted && item.eventObject?.optionLoaded) item.eventObject.optionLoaded(formModel, item, curdFormContext)
123
166
  }
167
+
168
+ // 处理 choose 类型的 items 的异步选项
169
+ if (item.type === "choose" && item.options) {
170
+ for (const option of item.options) {
171
+ if (option.items && option.items.length > 0) {
172
+ for (const subItem of option.items) {
173
+ if (subItem.asyncOptions && (subItem.autoload || typeof subItem.autoload == "undefined") && subItem.asyncOptions instanceof Function) {
174
+ subItem.loading = true
175
+ subItem.options = await subItem.asyncOptions(formModel, subItem, curdFormContext).finally(() => (subItem.loading = false))
176
+ if (!instance?.isUnmounted && subItem.eventObject?.optionLoaded) subItem.eventObject.optionLoaded(formModel, subItem, curdFormContext)
177
+ }
178
+ }
179
+ }
180
+ }
181
+ }
124
182
  })
125
183
 
126
184
  // 生成表单验证规则
@@ -129,23 +187,77 @@ const rules = computed(() => {
129
187
  Promise.resolve().then(() => {
130
188
  triggerRef(rules)
131
189
  })
190
+ let baseRules: FormRules = {}
132
191
  if (typeof sFormSchema.value.rules == "function") {
133
- return sFormSchema.value.rules(formModel, curdFormContext)
192
+ baseRules = sFormSchema.value.rules(formModel, curdFormContext)
193
+ } else if (typeof sFormSchema.value.getRules == "function") {
194
+ baseRules = sFormSchema.value.getRules(formModel, curdFormContext)
195
+ } else {
196
+ baseRules = sFormSchema.value.rules || {}
134
197
  }
135
- if (typeof sFormSchema.value.getRules == "function") {
136
- return sFormSchema.value.getRules(formModel, curdFormContext)
137
- }
138
- return sFormSchema.value.rules
198
+
199
+ // 合并 choose 类型 items 的验证规则
200
+ const mergedRules: FormRules = { ...baseRules }
201
+ sFormSchema.value.formItem.forEach((formItem) => {
202
+ if (formItem.type === "choose" && formItem.options) {
203
+ formItem.options.forEach((option) => {
204
+ if (option.items) {
205
+ option.items.forEach((subItem) => {
206
+ if (subItem.prop && subItem.rules) {
207
+ mergedRules[subItem.prop] = subItem.rules
208
+ }
209
+ })
210
+ }
211
+ })
212
+ }
213
+ })
214
+
215
+ return mergedRules
139
216
  })
140
217
 
218
+ /**
219
+ * 递归查找表单项
220
+ * @param prop 表单项的 prop
221
+ * @returns 找到的表单项对象,包含 parent 信息
222
+ */
223
+ const findFormItem = (prop: string): { item: FormItemType; parent?: FormItemType; path: string } | undefined => {
224
+ // 先在顶层查找
225
+ const topLevelItem = sFormSchema.value.formItem.find((a) => a.prop == prop)
226
+ if (topLevelItem) {
227
+ return { item: topLevelItem, path: prop }
228
+ }
229
+
230
+ // 在 choose 类型的 options.items 中递归查找
231
+ for (const formItem of sFormSchema.value.formItem) {
232
+ if (formItem.type === "choose" && formItem.options) {
233
+ for (const option of formItem.options) {
234
+ if (option.items) {
235
+ const foundItem = option.items.find((item) => item.prop === prop)
236
+ if (foundItem) {
237
+ return { item: foundItem, parent: formItem, path: `${formItem.prop}.${option.value}.${prop}` }
238
+ }
239
+ }
240
+ }
241
+ }
242
+ }
243
+
244
+ return undefined
245
+ }
246
+
141
247
  // 供外部使用
142
248
  const validate = (callback: (valid: boolean) => void) => {
143
249
  return schemaFormRef.value?.validate(callback)
144
250
  }
145
251
  // 调用某个表单项的异步数据接口
146
252
  const loadOptions = async (prop: string, option?: unknown) => {
147
- const cur: FormItemType | undefined = sFormSchema.value.formItem.find((a) => a.prop == prop)
148
- if (cur && cur.asyncOptions && !instance?.isUnmounted) {
253
+ const result = findFormItem(prop)
254
+ if (!result) {
255
+ console.warn(`[CurdForm] loadOptions: 未找到 prop 为 "${prop}" 的表单项`)
256
+ return []
257
+ }
258
+
259
+ const cur = result.item
260
+ if (cur.asyncOptions && !instance?.isUnmounted) {
149
261
  cur.loading = true
150
262
  triggerRef(schemaItems)
151
263
  cur.options =
@@ -160,10 +272,13 @@ const loadOptions = async (prop: string, option?: unknown) => {
160
272
  }
161
273
  // 给某个item赋值options
162
274
  const setOptions = async (prop: string, options: CurdFormOptionItem[], option?: unknown) => {
163
- const cur = sFormSchema.value.formItem.find((a) => a.prop == prop)
164
- if (cur) {
165
- cur.options = options
166
- if (!instance?.isUnmounted && cur.eventObject?.optionLoaded) cur.eventObject.optionLoaded(formModel, cur, curdFormContext, option)
275
+ const result = findFormItem(prop)
276
+ if (result) {
277
+ result.item.options = options
278
+ triggerRef(schemaItems)
279
+ if (!instance?.isUnmounted && result.item.eventObject?.optionLoaded) result.item.eventObject.optionLoaded(formModel, result.item, curdFormContext, option)
280
+ } else {
281
+ console.warn(`[CurdForm] setOptions: 未找到 prop 为 "${prop}" 的表单项`)
167
282
  }
168
283
  // return cur
169
284
  }
@@ -179,11 +294,53 @@ const getFormItemProps = (formItem: FormItemType) => {
179
294
  if (formItem.formItemProps instanceof Function) {
180
295
  return formItem.formItemProps(formModel, formItem)
181
296
  }
182
- const { slots, ...attrs } = formItem.formItemProps
183
- return { ...attrs }
297
+ return { ...formItem.formItemProps }
184
298
  }
185
299
  return {}
186
300
  }
301
+
302
+ // 获取表单项的 labelWidth
303
+ const getLabelWidth = (formItem: FormItemType) => {
304
+ const itemLabelWidth = formItem.labelWidth
305
+ if (itemLabelWidth !== undefined) {
306
+ return typeof itemLabelWidth === "number" ? itemLabelWidth + "px" : itemLabelWidth
307
+ }
308
+ const formLabelWidth = props.formSchema.labelWidth
309
+ if (formLabelWidth !== undefined) {
310
+ return typeof formLabelWidth === "number" ? formLabelWidth + "px" : formLabelWidth
311
+ }
312
+ return undefined
313
+ }
314
+
315
+ // 获取表单项的 labelPosition
316
+ const getLabelPosition = (formItem: FormItemType) => {
317
+ return formItem.labelPosition || props.formSchema.labelPosition || ""
318
+ }
319
+
320
+ // 获取 choose 类型的额外样式类
321
+ const getChooseFormItemClass = (_formItem: FormItemType) => {
322
+ const classes: string[] = []
323
+ const labelPosition = getLabelPosition(_formItem)
324
+ if (labelPosition) {
325
+ classes.push("el-form-item--label-" + labelPosition)
326
+ }
327
+ return classes.join(" ")
328
+ }
329
+
330
+ // 获取 choose 类型的样式
331
+ const getChooseFormItemStyle = (formItem: FormItemType) => {
332
+ const style: Record<string, string> = {}
333
+ const labelPosition = getLabelPosition(formItem)
334
+ if (labelPosition === "top") {
335
+ // top 模式下不需要额外样式
336
+ } else {
337
+ const labelWidth = getLabelWidth(formItem)
338
+ if (labelWidth) {
339
+ // 用于让 content 区域正确对齐
340
+ }
341
+ }
342
+ return style
343
+ }
187
344
  const getFormStyle = () => {
188
345
  const gutter = props.formSchema.gutter
189
346
  if (gutter) {
@@ -207,6 +364,7 @@ curdFormContext.loadOptions = loadOptions
207
364
  curdFormContext.setOptions = setOptions
208
365
  curdFormContext.change = onChange
209
366
  curdFormContext.formModel = formModel
367
+ curdFormContext.formSchema = props.formSchema
210
368
 
211
369
  if (props.extendContext) Object.assign(curdFormContext, props.extendContext)
212
370
 
@@ -231,3 +389,58 @@ defineExpose({
231
389
  onChange,
232
390
  })
233
391
  </script>
392
+
393
+ <style scoped lang="scss">
394
+ // choose 类型容器样式,模拟 el-form-item 布局
395
+ /*
396
+ .choose-group-wrapper {
397
+ display: flex;
398
+ align-items: flex-start;
399
+
400
+ :deep(.el-form-item__label) {
401
+ display: inline-flex;
402
+ justify-content: flex-end;
403
+ align-items: flex-start;
404
+ flex-shrink: 0;
405
+ font-size: var(--el-font-size-base);
406
+ color: var(--el-text-color-regular);
407
+ height: 32px;
408
+ line-height: 32px;
409
+ padding: 0 12px 0 0;
410
+ box-sizing: border-box;
411
+ }
412
+
413
+ :deep(.el-form-item__asterisk) {
414
+ color: var(--el-color-danger);
415
+ font-size: var(--el-font-size-base);
416
+ margin-left: 4px;
417
+ }
418
+
419
+ :deep(.el-form-item__content) {
420
+ display: flex;
421
+ flex-wrap: wrap;
422
+ align-items: center;
423
+ flex: 1;
424
+ position: relative;
425
+ font-size: var(--el-font-size-base);
426
+ min-width: 0;
427
+ }
428
+
429
+ :deep(.top-label) {
430
+ justify-content: flex-start;
431
+ padding: 0 0 8px 0;
432
+ height: auto;
433
+ line-height: 1.5;
434
+ }
435
+
436
+ // label-top 模式
437
+ &.el-form-item--label-top {
438
+ flex-direction: column;
439
+
440
+ :deep(.el-form-item__content) {
441
+ margin-left: 0 !important;
442
+ }
443
+ }
444
+ }
445
+ */
446
+ </style>
@@ -2,6 +2,7 @@ import { isReactive, isRef, isVNode, type Component, type VNode } from "vue"
2
2
  import SchemaFormAutocomplete from "./schema-form-autocomplete.vue"
3
3
  import SchemaFormCascader from "./schema-form-cascader.vue"
4
4
  import SchemaFormCheckbox from "./schema-form-checkbox.vue"
5
+ import SchemaFormChoose from "./schema-form-choose.vue"
5
6
  import SchemaFormColorPicker from "./schema-form-color-picker.vue"
6
7
  import SchemaFormDatePicker from "./schema-form-date-picker.vue"
7
8
  import SchemaFormInputNumber from "./schema-form-input-number.vue"
@@ -31,6 +32,7 @@ const presetMap: PresetMap = {
31
32
  "schema-cascader": SchemaFormCascader,
32
33
  "schema-autocomplete": SchemaFormAutocomplete,
33
34
  "schema-tree-select": SchemaFormTreeSelect,
35
+ "schema-choose": SchemaFormChoose,
34
36
  }
35
37
 
36
38
  export default presetMap
@@ -0,0 +1,225 @@
1
+ <template>
2
+ <div class="schema-form-choose">
3
+ <div class="choose-content-wrapper">
4
+ <div v-if="formItem.loading" class="loading">
5
+ <el-icon class="is-loading"><Loading /></el-icon> {{ t("el.form.loading") }}
6
+ </div>
7
+ <el-radio-group v-else-if="options?.length" v-model="currentValue" :class="[props.props?.showType, chooseGroupClass]" v-bind="props.props" v-on="props.eventObject">
8
+ <template v-for="(option, index) in options" :key="option.value">
9
+ <component :is="props?.props?.componentName == 'button' ? 'el-radio-button' : 'el-radio'" :value="option.value" :disabled="option.disabled" :border="option.border" :size="option.size" :style="option.style">
10
+ <component v-if="option.component" :is="option.component" :row="option" :$index="index" :form-model="formModel" :form-item="formItem" :props="props" />
11
+ <span v-else-if="option.html" v-html="option.html"></span>
12
+ <span v-else>{{ option.label }}</span>
13
+ <FormTooltip v-if="option.tooltip" :tooltip="option.tooltip" :form-item="formItem" :form-model="formModel" />
14
+ </component>
15
+ </template>
16
+ </el-radio-group>
17
+ <div v-else class="empty">
18
+ <component :is="empty" v-if="empty" :form-model="formModel" :form-item="formItem" :props="props" />
19
+ <template v-else>
20
+ <el-icon><Warning /></el-icon> <span>{{ props.props?.noDataText || t("el.form.nodata") }}</span>
21
+ </template>
22
+ </div>
23
+
24
+ <!-- 子表单项区域 -->
25
+ <div class="choose-sub-items-wrapper" :style="wrapperStyle">
26
+ <div ref="innerRef" class="choose-sub-items" :class="subItemsClass">
27
+ <template v-for="subItem in displaySubItems" :key="subItem.prop">
28
+ <el-form-item :prop="subItem.prop" :label="subItem.label" :label-width="subItem.labelWidth" :class="getSubFormItemStyle(subItem)" v-bind="getSubFormItemProps(subItem)">
29
+ <template v-for="(item, key) in getSubFormItemProps(subItem)?.slots || {}" :key="key" #[key]="row">
30
+ <component :is="item" v-bind="row" />
31
+ </template>
32
+ <FormItem :form-item="subItem" :form-model="formModel" @change="onSubItemChange">
33
+ <template #prefix>
34
+ <slot :name="subItem.prop + 'Prefix'" :form-item="subItem" :form-model="formModel"></slot>
35
+ </template>
36
+ <template #suffix>
37
+ <slot :name="subItem.prop + 'Suffix'" :form-item="subItem" :form-model="formModel"></slot>
38
+ </template>
39
+ </FormItem>
40
+ </el-form-item>
41
+ </template>
42
+ </div>
43
+ </div>
44
+ </div>
45
+ </div>
46
+ </template>
47
+
48
+ <script lang="ts" setup>
49
+ import { Loading, Warning } from "@element-plus/icons-vue"
50
+ import { useLocale } from "easybill-ui"
51
+ import { computed, inject, nextTick, onUnmounted, ref, toRaw, watch, type PropType } from "vue"
52
+ import FormItem from "../FormItem.vue"
53
+ import FormTooltip from "../FormTooltip.vue"
54
+ import { FormItemProps, type CurdFormOptionItem, type Fields, type FormContext, type FormItem as FormItemType } from "../types"
55
+
56
+ const props = defineProps({
57
+ ...FormItemProps,
58
+ modelValue: {
59
+ type: [String, Number, Boolean] as PropType<string | number | boolean | null>,
60
+ default: null,
61
+ },
62
+ })
63
+
64
+ const emit = defineEmits(["update:modelValue"])
65
+ const { t } = useLocale()
66
+ const formContext = inject<FormContext>("curdFormContext")
67
+
68
+ const chooseGroupClass = computed(() => {
69
+ return props?.props?.showType || ""
70
+ })
71
+
72
+ const subItemsClass = computed(() => {
73
+ return props?.props?.subItemsClass || ""
74
+ })
75
+
76
+ const currentValue = computed({
77
+ get: () => props.modelValue,
78
+ set: (val) => {
79
+ emit("update:modelValue", val)
80
+ },
81
+ })
82
+
83
+ const options = computed(() => {
84
+ const allOptions: CurdFormOptionItem[] = []
85
+ if (props.props?.all) {
86
+ const optionItem: CurdFormOptionItem = { value: "", label: t("el.form.all") }
87
+ if (typeof props.props.all === "object") {
88
+ Object.assign(optionItem, props.props.all)
89
+ }
90
+ allOptions.push(optionItem)
91
+ }
92
+ return [...allOptions, ...(props.formItem.options || [])]
93
+ })
94
+
95
+ const empty = computed(() => toRaw(props.props?.empty) || "")
96
+
97
+ const currentOption = computed(() => {
98
+ if (!currentValue.value) return null
99
+ return options.value.find((opt) => opt.value === currentValue.value)
100
+ })
101
+
102
+ // 动画控制状态
103
+ const innerRef = ref<HTMLElement | null>(null)
104
+ const wrapperStyle = ref<Record<string, string>>({})
105
+ const displaySubItems = ref<FormItemType[]>([])
106
+ const isAnimating = ref(false)
107
+
108
+ // 辅助函数:从父级 schema 中查找指定的表单项
109
+ const findFormItemsByProps = (props: string[]) => {
110
+ const parentSchema = formContext?.formSchema || { formItem: [] }
111
+ const allFormItems = parentSchema.formItem || []
112
+ return allFormItems.filter((item: FormItemType) => props.includes(item.prop))
113
+ }
114
+
115
+ // 获取当前选项下需要显示的子表单项
116
+ const visibleSubItems = computed(() => {
117
+ const opt = currentOption.value
118
+ if (!opt) return []
119
+
120
+ if (opt.items?.length) return opt.items
121
+ if (opt.props?.length) return findFormItemsByProps(opt.props)
122
+
123
+ return []
124
+ })
125
+
126
+ // 更新外层高度
127
+ const updateWrapperHeight = (height: number, animate = true) => {
128
+ if (animate) {
129
+ wrapperStyle.value = { height: height + "px" }
130
+ } else {
131
+ wrapperStyle.value = { height: height + "px", transition: "none" }
132
+ nextTick(() => {
133
+ wrapperStyle.value.transition = ""
134
+ })
135
+ }
136
+ }
137
+
138
+ // 监听选项变化,动态计算高度实现平滑过渡
139
+ watch(
140
+ visibleSubItems,
141
+ async (newItems) => {
142
+ // 获取旧高度
143
+ const oldHeight = innerRef.value?.scrollHeight || 0
144
+
145
+ if (newItems.length > 0) {
146
+ // 更新内容
147
+ displaySubItems.value = newItems
148
+ // 等待 DOM 渲染
149
+ await nextTick()
150
+ // 获取新高度
151
+ const newHeight = innerRef.value?.scrollHeight || 0
152
+ if (oldHeight !== newHeight) {
153
+ // 先设置回旧高度(防止跳动)
154
+ wrapperStyle.value = { height: oldHeight + "px" }
155
+ isAnimating.value = true
156
+ // 下一帧设置新高度触发过渡
157
+ requestAnimationFrame(() => {
158
+ updateWrapperHeight(newHeight)
159
+ })
160
+ } else {
161
+ updateWrapperHeight(newHeight, false)
162
+ }
163
+ } else {
164
+ // 无内容时收起
165
+ updateWrapperHeight(0)
166
+ isAnimating.value = false
167
+ setTimeout(() => {
168
+ displaySubItems.value = []
169
+ }, 300)
170
+ }
171
+ },
172
+ { immediate: true },
173
+ )
174
+
175
+ // ResizeObserver 监听内层高度变化
176
+ let resizeObserver: ResizeObserver | null = null
177
+
178
+ watch(innerRef, (el) => {
179
+ if (el) {
180
+ resizeObserver = new ResizeObserver((entries) => {
181
+ // 只在非动画状态且高度变化时更新
182
+ const newHeight = entries[0]?.contentRect.height
183
+ if (newHeight !== undefined && !isAnimating.value) {
184
+ updateWrapperHeight(newHeight, false)
185
+ }
186
+ })
187
+ resizeObserver.observe(el as unknown as Element)
188
+ }
189
+ })
190
+
191
+ onUnmounted(() => {
192
+ if (resizeObserver) {
193
+ resizeObserver.disconnect()
194
+ }
195
+ })
196
+
197
+ // 获取子表单项的额外 props
198
+ const getSubFormItemProps = (subItem: FormItemType) => {
199
+ if (subItem.formItemProps) {
200
+ if (subItem.formItemProps instanceof Function) {
201
+ return subItem.formItemProps(props.formModel, subItem)
202
+ }
203
+ return { ...subItem.formItemProps }
204
+ }
205
+ return {}
206
+ }
207
+
208
+ // 获取子表单项的样式类
209
+ const getSubFormItemStyle = (subItem: FormItemType) => {
210
+ if (!subItem.span) return "el-form-item-full"
211
+ return "el-form-item-" + subItem.span
212
+ }
213
+
214
+ // 子表单项变化事件
215
+ const onSubItemChange = (formModel: Fields, formItem: FormItemType) => {
216
+ // 1. 先执行子表单项自己的 change 事件
217
+ if (formItem.eventObject?.change) {
218
+ formItem.eventObject.change(formModel, formItem, formContext!)
219
+ }
220
+ // 2. 向上传递到 CurdForm,保持与其他表单项一致
221
+ if (formContext?.change) {
222
+ formContext.change(formModel, formItem)
223
+ }
224
+ }
225
+ </script>
@@ -34,6 +34,7 @@ export interface FormItem {
34
34
  props?: FormItemPropObject | ((formModel: Fields, formItem: FormItem) => FormItemPropObject)
35
35
  formItemProps?: FormItemPropObject | ((formModel: Fields, formItem: FormItem) => void)
36
36
  labelWidth?: string | number
37
+ labelPosition?: "left" | "right" | "top" | string
37
38
  span?: number
38
39
  disabled?: boolean
39
40
  tooltip?: string | ((formModel: Fields, formItem: FormItem) => Partial<TooltipProps> | string) | Partial<TooltipProps>
@@ -43,7 +44,7 @@ export interface FormItem {
43
44
  empty?: string | unknown
44
45
  sortIndex?: number
45
46
  }
46
- export type FormItemTypeEmun = "input" | "select" | "radio" | "checkbox" | "input-number" | "switch" | "file" | "date-picker" | "time-picker" | "color-picker" | "value" | "tree-select" | "autocomplete"
47
+ export type FormItemTypeEmun = "input" | "select" | "radio" | "checkbox" | "input-number" | "switch" | "file" | "date-picker" | "time-picker" | "color-picker" | "value" | "tree-select" | "autocomplete" | "choose"
47
48
  export interface FormItemPropObject extends Fields {
48
49
  slots?: Record<string, (props?: FormItemPropObject) => VNode | VNode[] | string | null>
49
50
  all?: boolean | CurdFormOptionItem
@@ -74,6 +75,7 @@ export interface FormContext {
74
75
  setOptions: (prop: string, options: CurdFormOptionItem[], config?: unknown) => void
75
76
  change: (formModel: Fields, formItem: FormItem) => void
76
77
  formModel: Fields
78
+ formSchema: FormSchema
77
79
  formRef: InstanceType<typeof ElForm> | undefined
78
80
  components: Record<string, unknown>
79
81
  }
@@ -85,6 +87,10 @@ export interface CurdFormOptionItem extends OptionItem {
85
87
  disabled?: boolean
86
88
  type?: string | "radio" | "button"
87
89
  rawContent?: boolean
90
+ /** 引用的表单项 prop 数组,用于 choose 类型 */
91
+ props?: string[]
92
+ /** 内联表单项定义,用于 choose 类型 */
93
+ items?: FormItem[]
88
94
  }
89
95
  // interface EventObjectDefault {
90
96
  // change?: (formModel: Fields, formItem: FormItem, proxy: any) => void
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "easybill-ui",
3
- "version": "1.3.0",
3
+ "version": "1.3.1",
4
4
  "description": "A component library for easybill",
5
5
  "author": "tuchongyang <779311998@qq.com>",
6
6
  "private": false,
@@ -1 +1 @@
1
- .curd-form{display:flex;flex-wrap:wrap;position:relative;box-sizing:border-box;min-width:0;align-items:flex-start;margin-left:calc(-1 * var(--curd-form-gutter)/ 2);margin-right:calc(-1 * var(--curd-form-gutter)/ 2)}.curd-form .el-form-item{padding:0 calc(var(--curd-form-gutter)/ 2);box-sizing:border-box}.curd-form .el-form-item .el-form-item__label:before{margin-left:-10px}.curd-form.el-form--inline .el-form-item{flex:0 0 auto}.curd-form .el-form-item-full{flex:0 0 100%}.curd-form .el-form-item-1,.curd-form.el-form--inline .el-form-item-1{flex:0 0 calc(4.1666666667% * 1)}.curd-form .el-form-item-2,.curd-form.el-form--inline .el-form-item-2{flex:0 0 calc(4.1666666667% * 2)}.curd-form .el-form-item-3,.curd-form.el-form--inline .el-form-item-3{flex:0 0 calc(4.1666666667% * 3)}.curd-form .el-form-item-4,.curd-form.el-form--inline .el-form-item-4{flex:0 0 calc(4.1666666667% * 4)}.curd-form .el-form-item-5,.curd-form.el-form--inline .el-form-item-5{flex:0 0 calc(4.1666666667% * 5)}.curd-form .el-form-item-6,.curd-form.el-form--inline .el-form-item-6{flex:0 0 calc(4.1666666667% * 6)}.curd-form .el-form-item-7,.curd-form.el-form--inline .el-form-item-7{flex:0 0 calc(4.1666666667% * 7)}.curd-form .el-form-item-8,.curd-form.el-form--inline .el-form-item-8{flex:0 0 calc(4.1666666667% * 8)}.curd-form .el-form-item-9,.curd-form.el-form--inline .el-form-item-9{flex:0 0 calc(4.1666666667% * 9)}.curd-form .el-form-item-10,.curd-form.el-form--inline .el-form-item-10{flex:0 0 calc(4.1666666667% * 10)}.curd-form .el-form-item-11,.curd-form.el-form--inline .el-form-item-11{flex:0 0 calc(4.1666666667% * 11)}.curd-form .el-form-item-12,.curd-form.el-form--inline .el-form-item-12{flex:0 0 calc(4.1666666667% * 12)}.curd-form .el-form-item-13,.curd-form.el-form--inline .el-form-item-13{flex:0 0 calc(4.1666666667% * 13)}.curd-form .el-form-item-14,.curd-form.el-form--inline .el-form-item-14{flex:0 0 calc(4.1666666667% * 14)}.curd-form .el-form-item-15,.curd-form.el-form--inline .el-form-item-15{flex:0 0 calc(4.1666666667% * 15)}.curd-form .el-form-item-16,.curd-form.el-form--inline .el-form-item-16{flex:0 0 calc(4.1666666667% * 16)}.curd-form .el-form-item-17,.curd-form.el-form--inline .el-form-item-17{flex:0 0 calc(4.1666666667% * 17)}.curd-form .el-form-item-18,.curd-form.el-form--inline .el-form-item-18{flex:0 0 calc(4.1666666667% * 18)}.curd-form .el-form-item-19,.curd-form.el-form--inline .el-form-item-19{flex:0 0 calc(4.1666666667% * 19)}.curd-form .el-form-item-20,.curd-form.el-form--inline .el-form-item-20{flex:0 0 calc(4.1666666667% * 20)}.curd-form .el-form-item-21,.curd-form.el-form--inline .el-form-item-21{flex:0 0 calc(4.1666666667% * 21)}.curd-form .el-form-item-22,.curd-form.el-form--inline .el-form-item-22{flex:0 0 calc(4.1666666667% * 22)}.curd-form .el-form-item-23,.curd-form.el-form--inline .el-form-item-23{flex:0 0 calc(4.1666666667% * 23)}.curd-form .el-form-item-24,.curd-form.el-form--inline .el-form-item-24{flex:0 0 calc(4.1666666667% * 24)}.curd-form .form-item{width:100%;display:flex;min-width:0}.curd-form .form-item .tooltip{color:var(--el-button-text-color);margin-left:10px;vertical-align:middle;color:var(--el-text-color-secondary)}.curd-form .form-item .tooltip:hover{color:var(--color-primary)}.curd-form .form-item .empty{color:var(--el-text-color-secondary)}.curd-form .schema-form-radio .el-radio-group{vertical-align:top}.curd-form .schema-tree-select{width:100%}.curd-form .el-checkbox-group.single .el-checkbox-button+.el-checkbox-button{margin-left:10px}.curd-form .el-checkbox-group.single .el-checkbox-button .el-checkbox-button__inner{border:var(--el-border);border-radius:var(--el-border-radius-base);padding-left:20px;padding-right:20px}.curd-form .el-checkbox-group.single .el-checkbox-button.is-checked .el-checkbox-button__inner{border-color:var(--el-checkbox-button-checked-border-color)}.curd-form .tooltip{color:var(--el-button-text-color);margin-left:10px;vertical-align:middle}.schema-form-select-check{height:25px;margin-left:20px;margin-top:10px;display:block}.schema-form-select-check :deep(.el-checkbox__input){vertical-align:middle}
1
+ .curd-form{display:flex;flex-wrap:wrap;position:relative;box-sizing:border-box;min-width:0;align-items:flex-start;margin-left:calc(-1 * var(--curd-form-gutter)/ 2);margin-right:calc(-1 * var(--curd-form-gutter)/ 2)}.curd-form .el-form-item{padding:0 calc(var(--curd-form-gutter)/ 2);box-sizing:border-box}.curd-form .el-form-item .el-form-item__label:before{margin-left:-10px}.curd-form.el-form--inline .el-form-item{flex:0 0 auto}.curd-form .el-form-item-full{flex:0 0 100%}.curd-form .el-form-item-1,.curd-form.el-form--inline .el-form-item-1{flex:0 0 calc(4.1666666667% * 1)}.curd-form .el-form-item-2,.curd-form.el-form--inline .el-form-item-2{flex:0 0 calc(4.1666666667% * 2)}.curd-form .el-form-item-3,.curd-form.el-form--inline .el-form-item-3{flex:0 0 calc(4.1666666667% * 3)}.curd-form .el-form-item-4,.curd-form.el-form--inline .el-form-item-4{flex:0 0 calc(4.1666666667% * 4)}.curd-form .el-form-item-5,.curd-form.el-form--inline .el-form-item-5{flex:0 0 calc(4.1666666667% * 5)}.curd-form .el-form-item-6,.curd-form.el-form--inline .el-form-item-6{flex:0 0 calc(4.1666666667% * 6)}.curd-form .el-form-item-7,.curd-form.el-form--inline .el-form-item-7{flex:0 0 calc(4.1666666667% * 7)}.curd-form .el-form-item-8,.curd-form.el-form--inline .el-form-item-8{flex:0 0 calc(4.1666666667% * 8)}.curd-form .el-form-item-9,.curd-form.el-form--inline .el-form-item-9{flex:0 0 calc(4.1666666667% * 9)}.curd-form .el-form-item-10,.curd-form.el-form--inline .el-form-item-10{flex:0 0 calc(4.1666666667% * 10)}.curd-form .el-form-item-11,.curd-form.el-form--inline .el-form-item-11{flex:0 0 calc(4.1666666667% * 11)}.curd-form .el-form-item-12,.curd-form.el-form--inline .el-form-item-12{flex:0 0 calc(4.1666666667% * 12)}.curd-form .el-form-item-13,.curd-form.el-form--inline .el-form-item-13{flex:0 0 calc(4.1666666667% * 13)}.curd-form .el-form-item-14,.curd-form.el-form--inline .el-form-item-14{flex:0 0 calc(4.1666666667% * 14)}.curd-form .el-form-item-15,.curd-form.el-form--inline .el-form-item-15{flex:0 0 calc(4.1666666667% * 15)}.curd-form .el-form-item-16,.curd-form.el-form--inline .el-form-item-16{flex:0 0 calc(4.1666666667% * 16)}.curd-form .el-form-item-17,.curd-form.el-form--inline .el-form-item-17{flex:0 0 calc(4.1666666667% * 17)}.curd-form .el-form-item-18,.curd-form.el-form--inline .el-form-item-18{flex:0 0 calc(4.1666666667% * 18)}.curd-form .el-form-item-19,.curd-form.el-form--inline .el-form-item-19{flex:0 0 calc(4.1666666667% * 19)}.curd-form .el-form-item-20,.curd-form.el-form--inline .el-form-item-20{flex:0 0 calc(4.1666666667% * 20)}.curd-form .el-form-item-21,.curd-form.el-form--inline .el-form-item-21{flex:0 0 calc(4.1666666667% * 21)}.curd-form .el-form-item-22,.curd-form.el-form--inline .el-form-item-22{flex:0 0 calc(4.1666666667% * 22)}.curd-form .el-form-item-23,.curd-form.el-form--inline .el-form-item-23{flex:0 0 calc(4.1666666667% * 23)}.curd-form .el-form-item-24,.curd-form.el-form--inline .el-form-item-24{flex:0 0 calc(4.1666666667% * 24)}.curd-form .form-item{width:100%;display:flex;min-width:0}.curd-form .form-item .tooltip{color:var(--el-button-text-color);margin-left:10px;vertical-align:middle;color:var(--el-text-color-secondary)}.curd-form .form-item .tooltip:hover{color:var(--color-primary)}.curd-form .form-item .empty{color:var(--el-text-color-secondary)}.curd-form .schema-form-radio .el-radio-group{vertical-align:top}.curd-form .schema-tree-select{width:100%}.curd-form .el-checkbox-group.single .el-checkbox-button+.el-checkbox-button{margin-left:10px}.curd-form .el-checkbox-group.single .el-checkbox-button .el-checkbox-button__inner{border:var(--el-border);border-radius:var(--el-border-radius-base);padding-left:20px;padding-right:20px}.curd-form .el-checkbox-group.single .el-checkbox-button.is-checked .el-checkbox-button__inner{border-color:var(--el-checkbox-button-checked-border-color)}.curd-form .tooltip{color:var(--el-button-text-color);margin-left:10px;vertical-align:middle}.schema-form-select-check{height:25px;margin-left:20px;margin-top:10px;display:block}.schema-form-select-check :deep(.el-checkbox__input){vertical-align:middle}.schema-form-choose{width:100%}.schema-form-choose .choose-content-wrapper{width:100%}.schema-form-choose .choose-content-wrapper .choose-sub-items-wrapper{overflow:hidden;transition:height .3s ease-out}.schema-form-choose .choose-content-wrapper .choose-sub-items{padding-top:12px;padding-bottom:1px;overflow:hidden}.schema-form-choose .choose-content-wrapper .choose-sub-items .el-form-item{margin-bottom:18px}.schema-form-choose .choose-content-wrapper .choose-sub-items .el-form-item:last-child{margin-bottom:0}.schema-form-choose .empty,.schema-form-choose .loading{display:flex;align-items:center;justify-content:center;gap:4px;padding:8px 0;color:var(--el-text-color-secondary)}
@@ -1 +1 @@
1
- .constant-status{--el-tag-border-opacity:1;--el-tag-bg-opacity:1;--el-tag-font-size:var(--el-font-size-base)}.constant-status .el-tag__content{display:flex;align-items:center;line-height:1}.constant-status .el-icon,.constant-status .name{vertical-align:top;line-height:1}.constant-status .dot{width:5px;height:5px;display:inline-block;vertical-align:middle;border-radius:50%;background:var(--el-tag-text-color);margin-right:5px}.constant-status.no-border{padding:0}.constant-status.dot-status{padding:0}.constant-status.dot-status .name{color:var(--el-text-color-primary)}.constant-status.el-tag--default{padding:0;--el-tag-bg-color:transparent;--el-tag-border-color:transparent;--el-tag-hover-color:var(--el-text-color-primary);--el-tag-text-color:var(--el-text-color-primary)}.constant-status.el-tag--blue{--el-tag-bg-color:rgba(236, 245, 255, var(--el-tag-bg-color));--el-tag-border-color:rgba(217, 236, 255, var(--el-tag-border-color));--el-tag-hover-color:rgba(111, 122, 175, 1);--el-tag-text-color:rgba(111, 122, 175, 1)}.constant-status.el-tag--blue.el-tag--dark{--el-tag-bg-color:rgba(111, 122, 175, 1);--el-tag-border-color:rgba(111, 122, 175, 1);--el-tag-hover-color:rgba(111, 122, 175, 0.8);--el-tag-text-color:#fff}.constant-status.el-tag--blue.el-tag--plain{--el-tag-bg-color:var(--el-fill-color-blank)}.constant-status.el-tag--yellow{--el-tag-bg-color:rgba(255, 251, 230, var(--el-tag-bg-opacity));--el-tag-border-color:rgba(255, 229, 143, var(--el-tag-borer-opacity));--el-tag-hover-color:rgba(212, 136, 6, 1);--el-tag-text-color:rgba(212, 136, 6, 1)}.constant-status.el-tag--yellow.el-tag--dark{--el-tag-bg-color:rgba(212, 136, 6, var(--el-tag-bg-opacity));--el-tag-border-color:rgba(212, 136, 6, var(--el-tag-border-opacity));--el-tag-hover-color:rgba(212, 136, 6, 1);--el-tag-text-color:#fff}.constant-status.el-tag--yellow.el-tag--plain{--el-tag-bg-color:var(--el-fill-color-blank)}.constant-status.el-tag--blue-dark{--el-tag-bg-color:rgba(240, 245, 255, var(--el-tag-bg-opacity));--el-tag-border-color:rgba(173, 198, 255, var(--el-tag-border-opacity));--el-tag-hover-color:rgba(29, 57, 196, 1);--el-tag-text-color:rgba(29, 57, 196, 1)}.constant-status.el-tag--blue-dark.el-tag--dark{--el-tag-bg-color:rgba(29, 57, 196, var(--el-tag-bg-opacity));--el-tag-border-color:rgba(29, 57, 196, var(--el-tag-border-opacity));--el-tag-hover-color:rgba(29, 57, 196, 1);--el-tag-text-color:#fff}.constant-status.el-tag--blue-dark.el-tag--plain{--el-tag-bg-color:var(--el-fill-color-blank)}.constant-status.el-tag--red-purple{--el-tag-bg-color:rgba(251, 243, 248, var(--el-tag-bg-opacity));--el-tag-border-color:rgba(227, 206, 219, var(--el-tag-border-opacity));--el-tag-hover-color:rgba(191, 117, 163, 1);--el-tag-text-color:rgba(191, 117, 163, 1)}.constant-status.el-tag--red-purple.el-tag--dark{--el-tag-bg-color:rgba(191, 117, 163, var(--el-tag-bg-opacity));--el-tag-border-color:rgba(191, 117, 163, var(--el-tag-border-opacity));--el-tag-hover-color:rgba(191, 117, 163, 1);--el-tag-text-color:#fff}.constant-status.el-tag--red-purple.el-tag--plain{--el-tag-bg-color:var(--el-fill-color-blank)}.constant-status.el-tag--blueness{--el-tag-bg-color:rgba(243, 250, 251, var(--el-tag-bg-opacity));--el-tag-border-color:rgba(194, 213, 221, var(--el-tag-border-opacity));--el-tag-hover-color:rgba(99, 150, 177, 1);--el-tag-text-color:rgba(99, 150, 177, 1)}.constant-status.el-tag--blueness.el-tag--dark{--el-tag-bg-color:rgba(99, 150, 177, var(--el-tag-bg-opacity));--el-tag-border-color:rgba(99, 150, 177, var(--el-tag-border-opacity));--el-tag-hover-color:rgba(99, 150, 177, 1);--el-tag-text-color:#fff}.constant-status.el-tag--blueness.el-tag--plain{--el-tag-bg-color:var(--el-fill-color-blank)}.constant-status.no-border{border:0!important;background:0 0}.curd-form{display:flex;flex-wrap:wrap;position:relative;box-sizing:border-box;min-width:0;align-items:flex-start;margin-left:calc(-1 * var(--curd-form-gutter)/ 2);margin-right:calc(-1 * var(--curd-form-gutter)/ 2)}.curd-form .el-form-item{padding:0 calc(var(--curd-form-gutter)/ 2);box-sizing:border-box}.curd-form .el-form-item .el-form-item__label:before{margin-left:-10px}.curd-form.el-form--inline .el-form-item{flex:0 0 auto}.curd-form .el-form-item-full{flex:0 0 100%}.curd-form .el-form-item-1,.curd-form.el-form--inline .el-form-item-1{flex:0 0 calc(4.1666666667% * 1)}.curd-form .el-form-item-2,.curd-form.el-form--inline .el-form-item-2{flex:0 0 calc(4.1666666667% * 2)}.curd-form .el-form-item-3,.curd-form.el-form--inline .el-form-item-3{flex:0 0 calc(4.1666666667% * 3)}.curd-form .el-form-item-4,.curd-form.el-form--inline .el-form-item-4{flex:0 0 calc(4.1666666667% * 4)}.curd-form .el-form-item-5,.curd-form.el-form--inline .el-form-item-5{flex:0 0 calc(4.1666666667% * 5)}.curd-form .el-form-item-6,.curd-form.el-form--inline .el-form-item-6{flex:0 0 calc(4.1666666667% * 6)}.curd-form .el-form-item-7,.curd-form.el-form--inline .el-form-item-7{flex:0 0 calc(4.1666666667% * 7)}.curd-form .el-form-item-8,.curd-form.el-form--inline .el-form-item-8{flex:0 0 calc(4.1666666667% * 8)}.curd-form .el-form-item-9,.curd-form.el-form--inline .el-form-item-9{flex:0 0 calc(4.1666666667% * 9)}.curd-form .el-form-item-10,.curd-form.el-form--inline .el-form-item-10{flex:0 0 calc(4.1666666667% * 10)}.curd-form .el-form-item-11,.curd-form.el-form--inline .el-form-item-11{flex:0 0 calc(4.1666666667% * 11)}.curd-form .el-form-item-12,.curd-form.el-form--inline .el-form-item-12{flex:0 0 calc(4.1666666667% * 12)}.curd-form .el-form-item-13,.curd-form.el-form--inline .el-form-item-13{flex:0 0 calc(4.1666666667% * 13)}.curd-form .el-form-item-14,.curd-form.el-form--inline .el-form-item-14{flex:0 0 calc(4.1666666667% * 14)}.curd-form .el-form-item-15,.curd-form.el-form--inline .el-form-item-15{flex:0 0 calc(4.1666666667% * 15)}.curd-form .el-form-item-16,.curd-form.el-form--inline .el-form-item-16{flex:0 0 calc(4.1666666667% * 16)}.curd-form .el-form-item-17,.curd-form.el-form--inline .el-form-item-17{flex:0 0 calc(4.1666666667% * 17)}.curd-form .el-form-item-18,.curd-form.el-form--inline .el-form-item-18{flex:0 0 calc(4.1666666667% * 18)}.curd-form .el-form-item-19,.curd-form.el-form--inline .el-form-item-19{flex:0 0 calc(4.1666666667% * 19)}.curd-form .el-form-item-20,.curd-form.el-form--inline .el-form-item-20{flex:0 0 calc(4.1666666667% * 20)}.curd-form .el-form-item-21,.curd-form.el-form--inline .el-form-item-21{flex:0 0 calc(4.1666666667% * 21)}.curd-form .el-form-item-22,.curd-form.el-form--inline .el-form-item-22{flex:0 0 calc(4.1666666667% * 22)}.curd-form .el-form-item-23,.curd-form.el-form--inline .el-form-item-23{flex:0 0 calc(4.1666666667% * 23)}.curd-form .el-form-item-24,.curd-form.el-form--inline .el-form-item-24{flex:0 0 calc(4.1666666667% * 24)}.curd-form .form-item{width:100%;display:flex;min-width:0}.curd-form .form-item .tooltip{color:var(--el-button-text-color);margin-left:10px;vertical-align:middle;color:var(--el-text-color-secondary)}.curd-form .form-item .tooltip:hover{color:var(--color-primary)}.curd-form .form-item .empty{color:var(--el-text-color-secondary)}.curd-form .schema-form-radio .el-radio-group{vertical-align:top}.curd-form .schema-tree-select{width:100%}.curd-form .el-checkbox-group.single .el-checkbox-button+.el-checkbox-button{margin-left:10px}.curd-form .el-checkbox-group.single .el-checkbox-button .el-checkbox-button__inner{border:var(--el-border);border-radius:var(--el-border-radius-base);padding-left:20px;padding-right:20px}.curd-form .el-checkbox-group.single .el-checkbox-button.is-checked .el-checkbox-button__inner{border-color:var(--el-checkbox-button-checked-border-color)}.curd-form .tooltip{color:var(--el-button-text-color);margin-left:10px;vertical-align:middle}.schema-form-select-check{height:25px;margin-left:20px;margin-top:10px;display:block}.schema-form-select-check :deep(.el-checkbox__input){vertical-align:middle}.table-container .table-pager{margin:15px 0;display:flex;justify-content:space-between;align-items:center}.table-container .table-pager .pagination{justify-content:end;font-weight:400}.table-container .table-control{display:flex;justify-content:space-between;padding-bottom:10px;align-items:flex-end}.table-container .table-control .min-control>.el-button{margin-right:10px}.table-container .s-table-filter .el-form--inline .el-form-item{margin-right:15px}.table-container .el-button+.dropdown-item{margin-left:10px}.table-container .copy{cursor:pointer;margin-right:3px}.table-container .header-td{display:inline-flex;align-items:center;word-break:break-word}.table-container .header-td.center{justify-content:center}.table-container .header-td.right{justify-content:flex-end}.table-container .filter-dropdown-toggle{display:inline-block;line-height:1;cursor:pointer;position:relative;margin-left:3px}.table-container .filter-dropdown-toggle.active{color:var(--el-color-primary)}.table-container .table-menu{display:inline-block;vertical-align:middle;position:relative}.table-container .table-menu .table-menu-item{color:var(--el-button-text-color);font-size:14px;border-radius:4px;border:1px solid var(--el-button-border-color);padding:0;height:28px;width:28px;vertical-align:top;vertical-align:middle}.table-container .table-menu .table-menu-item:not(.is-disabled):active,.table-container .table-menu .table-menu-item:not(.is-disabled):focus{border-color:var(--el-button-border-color)}.table-container .table-menu .table-menu-item+.table-menu-item{margin-left:3px}.table-container .table-menu .table-menu-item:hover{background-color:var(--el-fill-color-light);border-color:var(--el-button-border-color)}.table-container .table-menu .current-size{color:var(--el-color-primary)}.table-container .simple-page{padding:20px 0;text-align:right}.table-container .simple-page>span{margin:0 10px}.curd-table-dropdown-menu .el-dropdown-menu__item{padding:0}.curd-table-dropdown-menu .el-dropdown-menu__item:hover{background-color:var(--el-fill-color-light)}.curd-table-dropdown-menu .el-dropdown-menu__item .el-button{display:block;padding:5px 16px;flex:1;text-align:left;font-size:12px}.table-main-filter-dropdown{padding:0}.table-main-filter-dropdown .search{position:relative;margin-bottom:5px}.table-main-filter-dropdown .search input{outline:0;border:0;width:100%;padding:5px 10px;background:#f4f4f4}.table-main-filter-dropdown .search .icon-suffix{position:absolute;right:10px;top:50%;transform:translateY(-50%)}.table-main-filter-dropdown .search .icon-close1{position:absolute;right:30px;top:50%;transform:translateY(-50%);cursor:pointer;opacity:.7}.table-main-filter-dropdown .search .icon-close1:hover{opacity:1;color:#444}.table-main-filter-dropdown .select li{line-height:30px;padding:0 20px;list-style:none;cursor:pointer}.table-main-filter-dropdown .select li:hover{background:#f4f4f4}.table-main-filter-dropdown .select li.active{color:var(--el-color-primary)}.filter-type-popper{width:auto!important;min-width:0!important;padding:0!important;box-shadow:none!important}.table-filter{display:flex;flex-direction:column;position:relative}.table-filter .filter-search-box{min-height:32px;border-width:1px;border-style:solid;border-color:var(--el-border-color);display:flex;min-width:460px;align-items:center;justify-items:center;justify-content:space-between;overflow:hidden;border-radius:var(--el-border-radius-base);transition:all .3s}.table-filter .filter-search-box.is-focus{border-color:var(--el-color-primary)}.table-filter .filter-search-box .filter-action{height:32px;line-height:32px;align-self:flex-end;display:flex}.table-filter .filter-search-box .filter-action div{cursor:pointer}.table-filter .filter-search-box .filter-action .empty{color:var(--el-color-info);margin-right:15px;padding-left:10px}.table-filter .filter-search-box .filter-action .empty:hover{color:var(--el-color-primary)}.table-filter .filter-search-box .filter-action .search{padding:0 20px;text-align:center;position:relative;display:flex;align-items:center}.table-filter .filter-search-box .filter-action .search:before{content:"";display:block;width:1px;height:20px;background:var(--el-border-color);position:absolute;left:0;top:50%;transform:translateY(-50%)}.table-filter .filter-search-box .filter-action .search:hover{color:var(--el-color-primary)}.table-filter .filter-external .el-form-item{margin-bottom:10px}.table-filter .filter-tags{height:100%;flex-wrap:wrap;display:flex;flex:1;align-items:flex-start;justify-items:center}.table-filter .filter-tags .tag-title{font-size:12px;color:var(--el-text-color-placeholder);height:24px;line-height:24px;margin:0 15px 5px 0}.table-filter .filter-tags .dropdown-toggle{white-space:nowrap;display:flex;align-items:center;justify-items:center;font-size:12px}.table-filter .filter-tags .tag-list{flex:1;display:flex;flex-wrap:wrap}.table-filter .filter-tags .tag-item{height:24px;line-height:24px;white-space:nowrap;display:flex;align-items:center;justify-items:center;padding:0 10px;color:var(--el-color-info-dark-2);background:var(--el-color-info-light-9);font-size:12px;border-radius:var(--el-border-radius-base);margin-right:5px;margin-bottom:10px;cursor:pointer}.table-filter .filter-tags .tag-item .action{color:var(--el-color-info-light-5);text-align:center;width:14px;height:14px;line-height:14px;border-radius:50%;margin-left:10px;font-size:14px;cursor:pointer}.table-filter .filter-tags .tag-item .action:hover{color:var(--el-color-primary)}.table-filter .tag-clear{margin-bottom:2px;margin-left:10px}.table-filter .filter-item .el-form-item{margin:0}.table-filter .filter-item .el-form-item__label{display:none}.table-filter .filter-item .el-input{--el-input-border:none;--el-input-border-color:transparent;--el-input-focus-border-color:transparent;--el-input-hover-border-color:transparent}.table-filter .filter-item .el-select{--el-select-border-color-hover:transparent;--el-select-input-focus-border-color:transparent}.table-filter .filter-item .el-select__wrapper{box-shadow:none}.table-filter-type{box-shadow:var(--el-box-shadow-light);background:var(--el-bg-color);z-index:3060;min-width:150px;max-height:300px;overflow:hidden;--el-font-size-base:12px}.table-filter-type .base-select{--el-font-size-base:12px;height:100%;max-height:300px;display:flex;flex-direction:column}.table-filter-type .base-select .remote-input{width:100%}.table-filter-type .base-select .remote-input .el-input{--el-input-border-radius:0;--el-input-bg-color:var(--el-bg-color-page);--el-input-border:none;--el-input-hover-border-color:transparent;--el-input-focus-border-color:var(--el-border-color)}.table-filter-type .base-select .el-empty__image svg{height:50px}.table-filter-type .base-select .select-spinner{flex:1;position:relative;overflow-y:auto}.table-filter-type .base-select .select-spinner ul{margin:0;padding:0}.table-filter-type .base-select .select-spinner ul li{list-style:none;padding:6px 10px;cursor:pointer;width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;box-sizing:border-box;font-size:var(--el-font-size-base)}.table-filter-type .base-select .select-spinner ul li.active{color:var(--el-color-primary)}.table-filter-type .base-select .select-spinner ul li:hover{background:var(--el-color-primary-light-9);color:var(--el-color-primary)}.table-filter-toggle{padding:0 10px;cursor:pointer;display:flex;justify-content:space-between;align-items:center;min-width:120px;font-size:12px}.table-filter-toggle .current-filter-label{margin-right:20px}.table-filter-List{box-shadow:0 2px 8px 0 rgba(0,0,0,.2);background:var(--el-bg-color);z-index:3060;border-radius:2px;max-height:300px;overflow-y:auto;font-size:12px}.table-filter-List ul{width:100%;margin:0;padding:0}.table-filter-List ul li{width:100%;list-style:none;padding:6px 10px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;box-sizing:border-box;cursor:pointer}.table-filter-List ul li:hover{background:var(--el-color-primary-light-9);color:var(--el-color-primary)}.table-filter-List ul li.active{color:var(--el-color-primary);font-weight:600}.table-filter-tag-popper{max-height:400px;overflow:auto;padding:0!important;width:250px!important}.table-filter-tag-popper .base-select{--el-font-size-base:12px;height:100%;max-height:300px;display:flex;flex-direction:column}.table-filter-tag-popper .base-select .remote-input{width:100%}.table-filter-tag-popper .base-select .remote-input :deep(.el-input){--el-input-border-radius:0;--el-input-bg-color:var(--el-bg-color-page);--el-input-border:none;--el-input-hover-border-color:transparent;--el-input-focus-border-color:var(--el-border-color)}.table-filter-tag-popper .base-select :deep(.el-empty__imagesvg){height:50px}.table-filter-tag-popper .base-select .select-spinner{flex:1;position:relative;overflow-y:auto}.table-filter-tag-popper .base-select .select-spinner ul{margin:0;padding:0}.table-filter-tag-popper .base-select .select-spinner ul li{list-style:none;padding:6px 10px;cursor:pointer;width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:var(--el-font-size-base);box-sizing:border-box}.table-filter-tag-popper .base-select .select-spinner ul li.active{color:var(--el-color-primary)}.table-filter-tag-popper .base-select .select-spinner ul li:hover{background:var(--el-color-primary-light-9);color:var(--el-color-primary)}.detail-info{flex:1}.detail-info .detail-info-header{display:flex;justify-content:space-between;align-items:center;margin-bottom:10px}.detail-info .title{border-left:3px solid var(--el-color-primary);padding-left:10px;line-height:1.2}.detail-info+.detail-info{margin-top:30px}.detail-info.card{background:var(--el-bg-color);border-radius:0;opacity:1;border:1px solid var(--el-border-color)}.detail-info.card[shadow]{box-shadow:var(--el-box-shadow-lighter)}.detail-info.card .detail-info-header{height:50px;border-bottom:1px solid var(--el-border-color);margin:0;padding:0 20px}.detail-info.card .detail-info-header .title{border-left:0;padding:0}.detail-info.card .detail-info-body{padding:10px 20px 20px 20px;margin:0}.detail-info .detail-info-body{display:flex;flex-wrap:wrap;position:relative;box-sizing:border-box}.detail-info .detail-info-body:not(.table){margin-left:-calc(var(--gutter)/2);margin-right:-calc(var(--gutter)/2)}.detail-info .detail-info-body .table-detail-col{box-sizing:border-box}.detail-info .detail-info-body .item-col{line-height:20px;height:100%;box-sizing:border-box;display:flex}.detail-info .detail-info-body .item-col.item-col-top{flex-direction:column}.detail-info .detail-info-body .item-col.item-col-top .det{padding:0}.detail-info .detail-info-body .item-col .label{padding:4px 0;color:var(--el-text-color-secondary);box-sizing:border-box;vertical-align:middle;float:left;display:flex;align-items:center}.detail-info .detail-info-body .item-col .det{flex:1;padding:4px 10px;box-sizing:border-box;min-height:20px;height:100%;word-break:break-all;overflow:hidden}.detail-info .detail-info-body.table{border-top:1px solid var(--el-border-color);border-left:1px solid var(--el-border-color)}.detail-info .detail-info-body.table .table-detail-col{padding:0!important;border-bottom:1px solid var(--el-border-color);border-right:1px solid var(--el-border-color)}.detail-info .detail-info-body.table .item-col{background:var(--el-fill-color-light);border:1px solid var(--el-bg-color)}.detail-info .detail-info-body.table .item-col .label{padding-left:10px;padding-right:10px;width:100px}.detail-info .detail-info-body.table .item-col .det{border-left:1px solid var(--el-border-color);background-color:var(--el-bg-color)}.curdform-group{background-color:var(--el-bg-color);width:100%;margin:10px auto;border-radius:var(--el-border-radius-base)}.curdform-group .curdform-group-head{padding:15px 28px 5px;margin-bottom:10px;box-sizing:border-box;display:flex;justify-content:space-between;align-items:center}.curdform-group .curdform-group-head+.curdform-group-desc{margin-top:-10px}.curdform-group .curdform-group-head+.curdform-group-body{padding-top:0}.curdform-group .curdform-group-head .left{display:flex;align-items:center;gap:10px}.curdform-group .curdform-group-head .left .icon{background:#f3f4f6;border-radius:50%;width:36px;height:36px;display:inline-flex;align-items:center;justify-content:center;color:#9ca3af}.curdform-group .curdform-group-head .left .icon i{font-size:22px}.curdform-group .curdform-group-head .left .title{font-size:calc(var(--el-font-size-base) + 2px);font-weight:700}.curdform-group .curdform-group-desc{font-size:var(--el-font-size-base);color:var(--el-text-color-secondary);margin:0 28px}.curdform-group .curdform-group-body{padding:18px 28px 10px}
1
+ .constant-status{--el-tag-border-opacity:1;--el-tag-bg-opacity:1;--el-tag-font-size:var(--el-font-size-base)}.constant-status .el-tag__content{display:flex;align-items:center;line-height:1}.constant-status .el-icon,.constant-status .name{vertical-align:top;line-height:1}.constant-status .dot{width:5px;height:5px;display:inline-block;vertical-align:middle;border-radius:50%;background:var(--el-tag-text-color);margin-right:5px}.constant-status.no-border{padding:0}.constant-status.dot-status{padding:0}.constant-status.dot-status .name{color:var(--el-text-color-primary)}.constant-status.el-tag--default{padding:0;--el-tag-bg-color:transparent;--el-tag-border-color:transparent;--el-tag-hover-color:var(--el-text-color-primary);--el-tag-text-color:var(--el-text-color-primary)}.constant-status.el-tag--blue{--el-tag-bg-color:rgba(236, 245, 255, var(--el-tag-bg-color));--el-tag-border-color:rgba(217, 236, 255, var(--el-tag-border-color));--el-tag-hover-color:rgba(111, 122, 175, 1);--el-tag-text-color:rgba(111, 122, 175, 1)}.constant-status.el-tag--blue.el-tag--dark{--el-tag-bg-color:rgba(111, 122, 175, 1);--el-tag-border-color:rgba(111, 122, 175, 1);--el-tag-hover-color:rgba(111, 122, 175, 0.8);--el-tag-text-color:#fff}.constant-status.el-tag--blue.el-tag--plain{--el-tag-bg-color:var(--el-fill-color-blank)}.constant-status.el-tag--yellow{--el-tag-bg-color:rgba(255, 251, 230, var(--el-tag-bg-opacity));--el-tag-border-color:rgba(255, 229, 143, var(--el-tag-borer-opacity));--el-tag-hover-color:rgba(212, 136, 6, 1);--el-tag-text-color:rgba(212, 136, 6, 1)}.constant-status.el-tag--yellow.el-tag--dark{--el-tag-bg-color:rgba(212, 136, 6, var(--el-tag-bg-opacity));--el-tag-border-color:rgba(212, 136, 6, var(--el-tag-border-opacity));--el-tag-hover-color:rgba(212, 136, 6, 1);--el-tag-text-color:#fff}.constant-status.el-tag--yellow.el-tag--plain{--el-tag-bg-color:var(--el-fill-color-blank)}.constant-status.el-tag--blue-dark{--el-tag-bg-color:rgba(240, 245, 255, var(--el-tag-bg-opacity));--el-tag-border-color:rgba(173, 198, 255, var(--el-tag-border-opacity));--el-tag-hover-color:rgba(29, 57, 196, 1);--el-tag-text-color:rgba(29, 57, 196, 1)}.constant-status.el-tag--blue-dark.el-tag--dark{--el-tag-bg-color:rgba(29, 57, 196, var(--el-tag-bg-opacity));--el-tag-border-color:rgba(29, 57, 196, var(--el-tag-border-opacity));--el-tag-hover-color:rgba(29, 57, 196, 1);--el-tag-text-color:#fff}.constant-status.el-tag--blue-dark.el-tag--plain{--el-tag-bg-color:var(--el-fill-color-blank)}.constant-status.el-tag--red-purple{--el-tag-bg-color:rgba(251, 243, 248, var(--el-tag-bg-opacity));--el-tag-border-color:rgba(227, 206, 219, var(--el-tag-border-opacity));--el-tag-hover-color:rgba(191, 117, 163, 1);--el-tag-text-color:rgba(191, 117, 163, 1)}.constant-status.el-tag--red-purple.el-tag--dark{--el-tag-bg-color:rgba(191, 117, 163, var(--el-tag-bg-opacity));--el-tag-border-color:rgba(191, 117, 163, var(--el-tag-border-opacity));--el-tag-hover-color:rgba(191, 117, 163, 1);--el-tag-text-color:#fff}.constant-status.el-tag--red-purple.el-tag--plain{--el-tag-bg-color:var(--el-fill-color-blank)}.constant-status.el-tag--blueness{--el-tag-bg-color:rgba(243, 250, 251, var(--el-tag-bg-opacity));--el-tag-border-color:rgba(194, 213, 221, var(--el-tag-border-opacity));--el-tag-hover-color:rgba(99, 150, 177, 1);--el-tag-text-color:rgba(99, 150, 177, 1)}.constant-status.el-tag--blueness.el-tag--dark{--el-tag-bg-color:rgba(99, 150, 177, var(--el-tag-bg-opacity));--el-tag-border-color:rgba(99, 150, 177, var(--el-tag-border-opacity));--el-tag-hover-color:rgba(99, 150, 177, 1);--el-tag-text-color:#fff}.constant-status.el-tag--blueness.el-tag--plain{--el-tag-bg-color:var(--el-fill-color-blank)}.constant-status.no-border{border:0!important;background:0 0}.curd-form{display:flex;flex-wrap:wrap;position:relative;box-sizing:border-box;min-width:0;align-items:flex-start;margin-left:calc(-1 * var(--curd-form-gutter)/ 2);margin-right:calc(-1 * var(--curd-form-gutter)/ 2)}.curd-form .el-form-item{padding:0 calc(var(--curd-form-gutter)/ 2);box-sizing:border-box}.curd-form .el-form-item .el-form-item__label:before{margin-left:-10px}.curd-form.el-form--inline .el-form-item{flex:0 0 auto}.curd-form .el-form-item-full{flex:0 0 100%}.curd-form .el-form-item-1,.curd-form.el-form--inline .el-form-item-1{flex:0 0 calc(4.1666666667% * 1)}.curd-form .el-form-item-2,.curd-form.el-form--inline .el-form-item-2{flex:0 0 calc(4.1666666667% * 2)}.curd-form .el-form-item-3,.curd-form.el-form--inline .el-form-item-3{flex:0 0 calc(4.1666666667% * 3)}.curd-form .el-form-item-4,.curd-form.el-form--inline .el-form-item-4{flex:0 0 calc(4.1666666667% * 4)}.curd-form .el-form-item-5,.curd-form.el-form--inline .el-form-item-5{flex:0 0 calc(4.1666666667% * 5)}.curd-form .el-form-item-6,.curd-form.el-form--inline .el-form-item-6{flex:0 0 calc(4.1666666667% * 6)}.curd-form .el-form-item-7,.curd-form.el-form--inline .el-form-item-7{flex:0 0 calc(4.1666666667% * 7)}.curd-form .el-form-item-8,.curd-form.el-form--inline .el-form-item-8{flex:0 0 calc(4.1666666667% * 8)}.curd-form .el-form-item-9,.curd-form.el-form--inline .el-form-item-9{flex:0 0 calc(4.1666666667% * 9)}.curd-form .el-form-item-10,.curd-form.el-form--inline .el-form-item-10{flex:0 0 calc(4.1666666667% * 10)}.curd-form .el-form-item-11,.curd-form.el-form--inline .el-form-item-11{flex:0 0 calc(4.1666666667% * 11)}.curd-form .el-form-item-12,.curd-form.el-form--inline .el-form-item-12{flex:0 0 calc(4.1666666667% * 12)}.curd-form .el-form-item-13,.curd-form.el-form--inline .el-form-item-13{flex:0 0 calc(4.1666666667% * 13)}.curd-form .el-form-item-14,.curd-form.el-form--inline .el-form-item-14{flex:0 0 calc(4.1666666667% * 14)}.curd-form .el-form-item-15,.curd-form.el-form--inline .el-form-item-15{flex:0 0 calc(4.1666666667% * 15)}.curd-form .el-form-item-16,.curd-form.el-form--inline .el-form-item-16{flex:0 0 calc(4.1666666667% * 16)}.curd-form .el-form-item-17,.curd-form.el-form--inline .el-form-item-17{flex:0 0 calc(4.1666666667% * 17)}.curd-form .el-form-item-18,.curd-form.el-form--inline .el-form-item-18{flex:0 0 calc(4.1666666667% * 18)}.curd-form .el-form-item-19,.curd-form.el-form--inline .el-form-item-19{flex:0 0 calc(4.1666666667% * 19)}.curd-form .el-form-item-20,.curd-form.el-form--inline .el-form-item-20{flex:0 0 calc(4.1666666667% * 20)}.curd-form .el-form-item-21,.curd-form.el-form--inline .el-form-item-21{flex:0 0 calc(4.1666666667% * 21)}.curd-form .el-form-item-22,.curd-form.el-form--inline .el-form-item-22{flex:0 0 calc(4.1666666667% * 22)}.curd-form .el-form-item-23,.curd-form.el-form--inline .el-form-item-23{flex:0 0 calc(4.1666666667% * 23)}.curd-form .el-form-item-24,.curd-form.el-form--inline .el-form-item-24{flex:0 0 calc(4.1666666667% * 24)}.curd-form .form-item{width:100%;display:flex;min-width:0}.curd-form .form-item .tooltip{color:var(--el-button-text-color);margin-left:10px;vertical-align:middle;color:var(--el-text-color-secondary)}.curd-form .form-item .tooltip:hover{color:var(--color-primary)}.curd-form .form-item .empty{color:var(--el-text-color-secondary)}.curd-form .schema-form-radio .el-radio-group{vertical-align:top}.curd-form .schema-tree-select{width:100%}.curd-form .el-checkbox-group.single .el-checkbox-button+.el-checkbox-button{margin-left:10px}.curd-form .el-checkbox-group.single .el-checkbox-button .el-checkbox-button__inner{border:var(--el-border);border-radius:var(--el-border-radius-base);padding-left:20px;padding-right:20px}.curd-form .el-checkbox-group.single .el-checkbox-button.is-checked .el-checkbox-button__inner{border-color:var(--el-checkbox-button-checked-border-color)}.curd-form .tooltip{color:var(--el-button-text-color);margin-left:10px;vertical-align:middle}.schema-form-select-check{height:25px;margin-left:20px;margin-top:10px;display:block}.schema-form-select-check :deep(.el-checkbox__input){vertical-align:middle}.schema-form-choose{width:100%}.schema-form-choose .choose-content-wrapper{width:100%}.schema-form-choose .choose-content-wrapper .choose-sub-items-wrapper{overflow:hidden;transition:height .3s ease-out}.schema-form-choose .choose-content-wrapper .choose-sub-items{padding-top:12px;padding-bottom:1px;overflow:hidden}.schema-form-choose .choose-content-wrapper .choose-sub-items .el-form-item{margin-bottom:18px}.schema-form-choose .choose-content-wrapper .choose-sub-items .el-form-item:last-child{margin-bottom:0}.schema-form-choose .empty,.schema-form-choose .loading{display:flex;align-items:center;justify-content:center;gap:4px;padding:8px 0;color:var(--el-text-color-secondary)}.table-container .table-pager{margin:15px 0;display:flex;justify-content:space-between;align-items:center}.table-container .table-pager .pagination{justify-content:end;font-weight:400}.table-container .table-control{display:flex;justify-content:space-between;padding-bottom:10px;align-items:flex-end}.table-container .table-control .min-control>.el-button{margin-right:10px}.table-container .s-table-filter .el-form--inline .el-form-item{margin-right:15px}.table-container .el-button+.dropdown-item{margin-left:10px}.table-container .copy{cursor:pointer;margin-right:3px}.table-container .header-td{display:inline-flex;align-items:center;word-break:break-word}.table-container .header-td.center{justify-content:center}.table-container .header-td.right{justify-content:flex-end}.table-container .filter-dropdown-toggle{display:inline-block;line-height:1;cursor:pointer;position:relative;margin-left:3px}.table-container .filter-dropdown-toggle.active{color:var(--el-color-primary)}.table-container .table-menu{display:inline-block;vertical-align:middle;position:relative}.table-container .table-menu .table-menu-item{color:var(--el-button-text-color);font-size:14px;border-radius:4px;border:1px solid var(--el-button-border-color);padding:0;height:28px;width:28px;vertical-align:top;vertical-align:middle}.table-container .table-menu .table-menu-item:not(.is-disabled):active,.table-container .table-menu .table-menu-item:not(.is-disabled):focus{border-color:var(--el-button-border-color)}.table-container .table-menu .table-menu-item+.table-menu-item{margin-left:3px}.table-container .table-menu .table-menu-item:hover{background-color:var(--el-fill-color-light);border-color:var(--el-button-border-color)}.table-container .table-menu .current-size{color:var(--el-color-primary)}.table-container .simple-page{padding:20px 0;text-align:right}.table-container .simple-page>span{margin:0 10px}.curd-table-dropdown-menu .el-dropdown-menu__item{padding:0}.curd-table-dropdown-menu .el-dropdown-menu__item:hover{background-color:var(--el-fill-color-light)}.curd-table-dropdown-menu .el-dropdown-menu__item .el-button{display:block;padding:5px 16px;flex:1;text-align:left;font-size:12px}.table-main-filter-dropdown{padding:0}.table-main-filter-dropdown .search{position:relative;margin-bottom:5px}.table-main-filter-dropdown .search input{outline:0;border:0;width:100%;padding:5px 10px;background:#f4f4f4}.table-main-filter-dropdown .search .icon-suffix{position:absolute;right:10px;top:50%;transform:translateY(-50%)}.table-main-filter-dropdown .search .icon-close1{position:absolute;right:30px;top:50%;transform:translateY(-50%);cursor:pointer;opacity:.7}.table-main-filter-dropdown .search .icon-close1:hover{opacity:1;color:#444}.table-main-filter-dropdown .select li{line-height:30px;padding:0 20px;list-style:none;cursor:pointer}.table-main-filter-dropdown .select li:hover{background:#f4f4f4}.table-main-filter-dropdown .select li.active{color:var(--el-color-primary)}.filter-type-popper{width:auto!important;min-width:0!important;padding:0!important;box-shadow:none!important}.table-filter{display:flex;flex-direction:column;position:relative}.table-filter .filter-search-box{min-height:32px;border-width:1px;border-style:solid;border-color:var(--el-border-color);display:flex;min-width:460px;align-items:center;justify-items:center;justify-content:space-between;overflow:hidden;border-radius:var(--el-border-radius-base);transition:all .3s}.table-filter .filter-search-box.is-focus{border-color:var(--el-color-primary)}.table-filter .filter-search-box .filter-action{height:32px;line-height:32px;align-self:flex-end;display:flex}.table-filter .filter-search-box .filter-action div{cursor:pointer}.table-filter .filter-search-box .filter-action .empty{color:var(--el-color-info);margin-right:15px;padding-left:10px}.table-filter .filter-search-box .filter-action .empty:hover{color:var(--el-color-primary)}.table-filter .filter-search-box .filter-action .search{padding:0 20px;text-align:center;position:relative;display:flex;align-items:center}.table-filter .filter-search-box .filter-action .search:before{content:"";display:block;width:1px;height:20px;background:var(--el-border-color);position:absolute;left:0;top:50%;transform:translateY(-50%)}.table-filter .filter-search-box .filter-action .search:hover{color:var(--el-color-primary)}.table-filter .filter-external .el-form-item{margin-bottom:10px}.table-filter .filter-tags{height:100%;flex-wrap:wrap;display:flex;flex:1;align-items:flex-start;justify-items:center}.table-filter .filter-tags .tag-title{font-size:12px;color:var(--el-text-color-placeholder);height:24px;line-height:24px;margin:0 15px 5px 0}.table-filter .filter-tags .dropdown-toggle{white-space:nowrap;display:flex;align-items:center;justify-items:center;font-size:12px}.table-filter .filter-tags .tag-list{flex:1;display:flex;flex-wrap:wrap}.table-filter .filter-tags .tag-item{height:24px;line-height:24px;white-space:nowrap;display:flex;align-items:center;justify-items:center;padding:0 10px;color:var(--el-color-info-dark-2);background:var(--el-color-info-light-9);font-size:12px;border-radius:var(--el-border-radius-base);margin-right:5px;margin-bottom:10px;cursor:pointer}.table-filter .filter-tags .tag-item .action{color:var(--el-color-info-light-5);text-align:center;width:14px;height:14px;line-height:14px;border-radius:50%;margin-left:10px;font-size:14px;cursor:pointer}.table-filter .filter-tags .tag-item .action:hover{color:var(--el-color-primary)}.table-filter .tag-clear{margin-bottom:2px;margin-left:10px}.table-filter .filter-item .el-form-item{margin:0}.table-filter .filter-item .el-form-item__label{display:none}.table-filter .filter-item .el-input{--el-input-border:none;--el-input-border-color:transparent;--el-input-focus-border-color:transparent;--el-input-hover-border-color:transparent}.table-filter .filter-item .el-select{--el-select-border-color-hover:transparent;--el-select-input-focus-border-color:transparent}.table-filter .filter-item .el-select__wrapper{box-shadow:none}.table-filter-type{box-shadow:var(--el-box-shadow-light);background:var(--el-bg-color);z-index:3060;min-width:150px;max-height:300px;overflow:hidden;--el-font-size-base:12px}.table-filter-type .base-select{--el-font-size-base:12px;height:100%;max-height:300px;display:flex;flex-direction:column}.table-filter-type .base-select .remote-input{width:100%}.table-filter-type .base-select .remote-input .el-input{--el-input-border-radius:0;--el-input-bg-color:var(--el-bg-color-page);--el-input-border:none;--el-input-hover-border-color:transparent;--el-input-focus-border-color:var(--el-border-color)}.table-filter-type .base-select .el-empty__image svg{height:50px}.table-filter-type .base-select .select-spinner{flex:1;position:relative;overflow-y:auto}.table-filter-type .base-select .select-spinner ul{margin:0;padding:0}.table-filter-type .base-select .select-spinner ul li{list-style:none;padding:6px 10px;cursor:pointer;width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;box-sizing:border-box;font-size:var(--el-font-size-base)}.table-filter-type .base-select .select-spinner ul li.active{color:var(--el-color-primary)}.table-filter-type .base-select .select-spinner ul li:hover{background:var(--el-color-primary-light-9);color:var(--el-color-primary)}.table-filter-toggle{padding:0 10px;cursor:pointer;display:flex;justify-content:space-between;align-items:center;min-width:120px;font-size:12px}.table-filter-toggle .current-filter-label{margin-right:20px}.table-filter-List{box-shadow:0 2px 8px 0 rgba(0,0,0,.2);background:var(--el-bg-color);z-index:3060;border-radius:2px;max-height:300px;overflow-y:auto;font-size:12px}.table-filter-List ul{width:100%;margin:0;padding:0}.table-filter-List ul li{width:100%;list-style:none;padding:6px 10px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;box-sizing:border-box;cursor:pointer}.table-filter-List ul li:hover{background:var(--el-color-primary-light-9);color:var(--el-color-primary)}.table-filter-List ul li.active{color:var(--el-color-primary);font-weight:600}.table-filter-tag-popper{max-height:400px;overflow:auto;padding:0!important;width:250px!important}.table-filter-tag-popper .base-select{--el-font-size-base:12px;height:100%;max-height:300px;display:flex;flex-direction:column}.table-filter-tag-popper .base-select .remote-input{width:100%}.table-filter-tag-popper .base-select .remote-input :deep(.el-input){--el-input-border-radius:0;--el-input-bg-color:var(--el-bg-color-page);--el-input-border:none;--el-input-hover-border-color:transparent;--el-input-focus-border-color:var(--el-border-color)}.table-filter-tag-popper .base-select :deep(.el-empty__imagesvg){height:50px}.table-filter-tag-popper .base-select .select-spinner{flex:1;position:relative;overflow-y:auto}.table-filter-tag-popper .base-select .select-spinner ul{margin:0;padding:0}.table-filter-tag-popper .base-select .select-spinner ul li{list-style:none;padding:6px 10px;cursor:pointer;width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:var(--el-font-size-base);box-sizing:border-box}.table-filter-tag-popper .base-select .select-spinner ul li.active{color:var(--el-color-primary)}.table-filter-tag-popper .base-select .select-spinner ul li:hover{background:var(--el-color-primary-light-9);color:var(--el-color-primary)}.detail-info{flex:1}.detail-info .detail-info-header{display:flex;justify-content:space-between;align-items:center;margin-bottom:10px}.detail-info .title{border-left:3px solid var(--el-color-primary);padding-left:10px;line-height:1.2}.detail-info+.detail-info{margin-top:30px}.detail-info.card{background:var(--el-bg-color);border-radius:0;opacity:1;border:1px solid var(--el-border-color)}.detail-info.card[shadow]{box-shadow:var(--el-box-shadow-lighter)}.detail-info.card .detail-info-header{height:50px;border-bottom:1px solid var(--el-border-color);margin:0;padding:0 20px}.detail-info.card .detail-info-header .title{border-left:0;padding:0}.detail-info.card .detail-info-body{padding:10px 20px 20px 20px;margin:0}.detail-info .detail-info-body{display:flex;flex-wrap:wrap;position:relative;box-sizing:border-box}.detail-info .detail-info-body:not(.table){margin-left:-calc(var(--gutter)/2);margin-right:-calc(var(--gutter)/2)}.detail-info .detail-info-body .table-detail-col{box-sizing:border-box}.detail-info .detail-info-body .item-col{line-height:20px;height:100%;box-sizing:border-box;display:flex}.detail-info .detail-info-body .item-col.item-col-top{flex-direction:column}.detail-info .detail-info-body .item-col.item-col-top .det{padding:0}.detail-info .detail-info-body .item-col .label{padding:4px 0;color:var(--el-text-color-secondary);box-sizing:border-box;vertical-align:middle;float:left;display:flex;align-items:center}.detail-info .detail-info-body .item-col .det{flex:1;padding:4px 10px;box-sizing:border-box;min-height:20px;height:100%;word-break:break-all;overflow:hidden}.detail-info .detail-info-body.table{border-top:1px solid var(--el-border-color);border-left:1px solid var(--el-border-color)}.detail-info .detail-info-body.table .table-detail-col{padding:0!important;border-bottom:1px solid var(--el-border-color);border-right:1px solid var(--el-border-color)}.detail-info .detail-info-body.table .item-col{background:var(--el-fill-color-light);border:1px solid var(--el-bg-color)}.detail-info .detail-info-body.table .item-col .label{padding-left:10px;padding-right:10px;width:100px}.detail-info .detail-info-body.table .item-col .det{border-left:1px solid var(--el-border-color);background-color:var(--el-bg-color)}.curdform-group{background-color:var(--el-bg-color);width:100%;margin:10px auto;border-radius:var(--el-border-radius-base)}.curdform-group .curdform-group-head{padding:15px 28px 5px;margin-bottom:10px;box-sizing:border-box;display:flex;justify-content:space-between;align-items:center}.curdform-group .curdform-group-head+.curdform-group-desc{margin-top:-10px}.curdform-group .curdform-group-head+.curdform-group-body{padding-top:0}.curdform-group .curdform-group-head .left{display:flex;align-items:center;gap:10px}.curdform-group .curdform-group-head .left .icon{background:#f3f4f6;border-radius:50%;width:36px;height:36px;display:inline-flex;align-items:center;justify-content:center;color:#9ca3af}.curdform-group .curdform-group-head .left .icon i{font-size:22px}.curdform-group .curdform-group-head .left .title{font-size:calc(var(--el-font-size-base) + 2px);font-weight:700}.curdform-group .curdform-group-desc{font-size:var(--el-font-size-base);color:var(--el-text-color-secondary);margin:0 28px}.curdform-group .curdform-group-body{padding:18px 28px 10px}