easybill-ui 1.2.25 → 1.3.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.
@@ -0,0 +1,2 @@
1
+ export { default as CurdGroupForm } from "./src/CurdGroupForm.vue"
2
+ export * from "./types"
@@ -0,0 +1,95 @@
1
+ <template>
2
+ <CurdFormGroup v-for="(item, index) in props.schema.items" v-show="!schemaItemHidden(item)" :key="index" :item="item" :title="item.groupName" :icon="item.icon" :label-position="item.labelPosition">
3
+ <template v-if="item.headerRight" #headerRight>
4
+ <component :is="item.headerRight" :schema="props.schema" :schemaItem="item" :form-model="form" />
5
+ </template>
6
+ <template v-if="item.headerTitle" #title>
7
+ <component :is="item.headerTitle" :schema="props.schema" :schemaItem="item" :form-model="form" />
8
+ </template>
9
+ <template v-if="item.headerBottom" #headerBottom>
10
+ <component :is="item.headerBottom" :schema="props.schema" :schemaItem="item" :form-model="form" />
11
+ </template>
12
+ <div class="curdform-group-content" data-instance-form-wrap>
13
+ <CurdForm
14
+ :ref="(el: Element | ComponentPublicInstance | null) => (formRef[(item.step || '') + item.groupName + index] = el as InstanceType<typeof CurdForm>)"
15
+ v-model="form"
16
+ :form-schema="item.schema"
17
+ :extend-context="extendContext"
18
+ :validateOnRuleChange="false"
19
+ :scroll-to-error="true"
20
+ @change="onChange"
21
+ />
22
+ </div>
23
+ </CurdFormGroup>
24
+ </template>
25
+
26
+ <script lang="ts" setup>
27
+ import { CurdForm } from "easybill-ui"
28
+ import type { ComponentPublicInstance, PropType } from "vue"
29
+ import { watch } from "vue"
30
+ import type { CurdGroupFormSchema } from "../types"
31
+ import CurdFormGroup from "./components/CurdFormGroup.vue"
32
+ import { useFormHook } from "./hooks/useFormHook"
33
+ const props = defineProps({
34
+ modelValue: {
35
+ type: Object as PropType<Record<string, unknown>>,
36
+ default: () => ({}),
37
+ },
38
+ schema: {
39
+ type: Object as PropType<CurdGroupFormSchema>,
40
+ default: () => ({}),
41
+ },
42
+ })
43
+
44
+ const emits = defineEmits(["update:modelValue", "change", "loadOptions"])
45
+ const { form, formRef, schema: formSchema, validate, schemaItemHidden } = useFormHook()
46
+ const init = () => {
47
+ form.value = props.modelValue || {}
48
+ formSchema.value = props.schema
49
+ }
50
+ init()
51
+ watch(
52
+ () => props.schema,
53
+ () => {
54
+ formSchema.value = props.schema
55
+ },
56
+ )
57
+
58
+ watch(
59
+ () => props.modelValue,
60
+ () => {
61
+ if (form.value != props.modelValue) {
62
+ form.value = props.modelValue
63
+ // emits("update:modelValue", form.value)
64
+ }
65
+ },
66
+ )
67
+
68
+ const loadOptions = (prop: string, config?: unknown) => {
69
+ if (!props.schema) return
70
+ let has = false
71
+ for (const index in props.schema.items) {
72
+ const group = props.schema.items[index]
73
+ const formItem = group.schema.formItem
74
+ for (const i in formItem) {
75
+ const item = formItem[i]
76
+ if (item.prop == prop) {
77
+ has = true
78
+ formRef.value[(group.step || "") + group.groupName + index]?.loadOptions(prop, config)
79
+ }
80
+ }
81
+ }
82
+ if (!has) {
83
+ emits("loadOptions", prop)
84
+ }
85
+ }
86
+ const extendContext = {
87
+ loadOptions,
88
+ }
89
+
90
+ const onChange = (v: unknown, l: unknown) => {
91
+ emits("change", v, l)
92
+ }
93
+
94
+ defineExpose({ loadOptions, validate })
95
+ </script>
@@ -0,0 +1,39 @@
1
+ <template>
2
+ <div class="curdform-group" :style="props.item.style" :class="props.item.class">
3
+ <div v-if="props.title || $slots.title" class="curdform-group-head">
4
+ <div class="left">
5
+ <span v-if="props.icon" class="icon"><i v-if="typeof props.icon == 'string'" :class="props.icon"></i><component v-else :is="props.icon"></component></span>
6
+ <div v-if="!$slots.title" class="title">{{ props.title }}</div>
7
+ <slot name="title"></slot>
8
+ </div>
9
+ <div class="right">
10
+ <slot name="headerRight"></slot>
11
+ </div>
12
+ </div>
13
+ <div v-if="props.item.desc" class="curdform-group-desc">{{ props.item.desc }}</div>
14
+ <slot name="headerBottom"></slot>
15
+ <div v-if="$slots.default" class="curdform-group-body">
16
+ <slot></slot>
17
+ </div>
18
+ </div>
19
+ </template>
20
+
21
+ <script lang="ts" setup>
22
+ import type { PropType } from "vue"
23
+ import type { CurdGroupFormSchemaItem } from "../../types"
24
+
25
+ const props = defineProps({
26
+ title: {
27
+ type: String,
28
+ default: "",
29
+ },
30
+ icon: {
31
+ type: String,
32
+ default: "",
33
+ },
34
+ item: {
35
+ type: Object as PropType<CurdGroupFormSchemaItem>,
36
+ default: () => ({}),
37
+ },
38
+ })
39
+ </script>
@@ -0,0 +1,55 @@
1
+ import { CurdForm } from "easybill-ui"
2
+ import { ref, type Ref } from "vue"
3
+ import type { Schema, SchemaItem } from "../../types"
4
+
5
+ export const useFormHook = (): {
6
+ form: Ref<Record<string, unknown>>
7
+ formRef: Ref<Record<string, InstanceType<typeof CurdForm>>>
8
+ submit: () => void
9
+ schema: Ref<Schema | undefined>
10
+ validate: (callback: (valid: boolean) => void) => void
11
+ loading: Ref<boolean>
12
+ schemaItemHidden: (item: SchemaItem) => boolean
13
+ } => {
14
+ const formRef = ref<Record<string, InstanceType<typeof CurdForm>>>({})
15
+ const form = ref<Record<string, unknown>>({})
16
+ const schema = ref<Schema>()
17
+ const loading = ref(false)
18
+ const schemaItemHidden = (item: SchemaItem) => {
19
+ if (item?.hidden && item?.hidden instanceof Function) {
20
+ return item.hidden(form.value, item)
21
+ }
22
+ return !!item?.hidden
23
+ }
24
+ const validate = (callback: (valid: boolean) => void) => {
25
+ const validMap: boolean[] = []
26
+ for (const i in formRef.value) {
27
+ const curSchema = schema.value?.items.find((a, index) => (a.step || "") + a.groupName + index == i)
28
+ // 如果当前item隐藏了,则直接跳过校验
29
+ if (curSchema && schemaItemHidden(curSchema)) {
30
+ validMap.push(true)
31
+ continue
32
+ }
33
+ const cur = formRef.value[i]
34
+ cur.validate((valid: boolean) => {
35
+ validMap.push(valid)
36
+ if (validMap.length >= Object.keys(formRef.value).length && callback) callback(validMap.every((a) => a))
37
+ })
38
+ }
39
+ }
40
+ const submit = () => {
41
+ validate((valid) => {
42
+ if (!valid) return
43
+ })
44
+ }
45
+
46
+ return {
47
+ form,
48
+ formRef,
49
+ submit,
50
+ schema,
51
+ validate,
52
+ loading,
53
+ schemaItemHidden,
54
+ }
55
+ }
@@ -0,0 +1,22 @@
1
+ import type { Fields, FormSchema } from "easybill-ui"
2
+ import type { Component, VNode } from "vue"
3
+ export interface CurdGroupFormSchema {
4
+ items: CurdGroupFormSchemaItem[]
5
+ }
6
+
7
+ export interface CurdGroupFormSchemaItem {
8
+ groupName: string
9
+ schema: FormSchema
10
+ icon?: string
11
+ prop?: string // 唯一标识 不可修改
12
+ desc?: string
13
+ step?: string
14
+ stepIndex?: number
15
+ class?: string
16
+ style?: string
17
+ labelPosition?: string | "left" | "right" | "top"
18
+ hidden?: boolean | ((form: Fields, schemaItem: CurdGroupFormSchemaItem) => boolean)
19
+ headerRight?: Component | ((props: { schema: CurdGroupFormSchema; schemaItem: CurdGroupFormSchemaItem; formModel: Fields }) => VNode | VNode[])
20
+ headerBottom?: Component | ((props: { schema: CurdGroupFormSchema; schemaItem: CurdGroupFormSchemaItem; formModel: Fields }) => VNode | VNode[])
21
+ headerTitle?: Component | ((props: { schema: CurdGroupFormSchema; schemaItem: CurdGroupFormSchemaItem; formModel: Fields }) => VNode | VNode[])
22
+ }
@@ -276,7 +276,6 @@ const onItemChange = (prop: string, value: string, filter: FilterItem) => {
276
276
  listQuery.pageIndex = 1
277
277
  fetchData()
278
278
  }
279
-
280
279
  let hasInit = false
281
280
  onActivated(() => {
282
281
  // option?.customActivatedFetch为true时,参考/system/partner/account/vendor写法
@@ -1,5 +1,5 @@
1
1
  <template>
2
- <el-table-column v-if="!props.schema.hidden" :fixed="props.schema.fixed" v-bind="getColumnAttrs">
2
+ <el-table-column v-if="!getColumnHidden" :fixed="props.schema.fixed" v-bind="getColumnAttrs">
3
3
  <template #header="scope">
4
4
  <div class="header-td" :class="[props.schema.align]">
5
5
  <slot :name="props.schema.prop + 'Header'" v-bind="scope"></slot>
@@ -94,16 +94,23 @@ const copyValue = async (value: unknown) => {
94
94
  ElMessage.success(t("el.table.clickCopySuccess"))
95
95
  }
96
96
  const emits = defineEmits(["search"])
97
+ const search = inject("search")
98
+ const getColumnHidden = computed(() => {
99
+ if (props.schema.hidden && props.schema.hidden instanceof Function) {
100
+ return props.schema.hidden(props.schema, search)
101
+ }
102
+ return props.schema.hidden
103
+ })
97
104
  const onChange = (prop: string, value: string) => {
98
105
  emits("search", prop, value, filterSchema.value)
99
106
  }
100
107
  const tableItemFilterRef = ref<InstanceType<typeof STableItemFilter>>()
101
- const search = (opt: { listQuery: Record<string, unknown> }) => {
108
+ const onSearch = (opt: { listQuery: Record<string, unknown> }) => {
102
109
  if (tableItemFilterRef.value) tableItemFilterRef.value.search(opt)
103
110
  }
104
111
  const tableItemRefs: Ref<Record<string, unknown>> = ref({})
105
112
  const onItemChange = (prop: string, value: string) => {
106
113
  emits("search", prop, value, filterSchema.value)
107
114
  }
108
- defineExpose({ search })
115
+ defineExpose({ search: onSearch })
109
116
  </script>
@@ -24,7 +24,7 @@ export interface ColumnItemCtx<T> extends Partial<TableColumnCtx<T>> {
24
24
  prop: string
25
25
  label: string
26
26
  type?: string
27
- hidden?: boolean
27
+ hidden?: boolean | ((item: ColumnItemCtx<T>, search: (opt: { listQuery: Record<string, unknown> }) => void) => boolean)
28
28
  neverShow?: boolean // 表示不在列控制器里
29
29
  children?: ColumnItem<T>[]
30
30
  options?: Array<OptionItem> //数据字典
@@ -1,30 +1,43 @@
1
1
  <template>
2
2
  <component :is="componentName" v-bind="containerProps">
3
- <el-steps v-if="stepSchemaList.length > 1" :active="step" align-center style="margin-bottom: 20px; position: sticky; top: 0; z-index: 2000; background: var(--el-bg-color)" v-bind="stepProps">
4
- <el-step v-for="(item, i) in stepSchemaList" :key="i" :title="item.name" :description="item.description" />
3
+ <el-steps v-if="isGroupMode && hasMultipleSteps && !stepComponent" :active="activeStep" align-center style="margin-bottom: 20px; position: sticky; top: 0; z-index: 2000; background: var(--el-bg-color)" v-bind="stepProps">
4
+ <el-step v-for="(stepItem, i) in stepList" :key="i" :title="stepItem.name" />
5
5
  </el-steps>
6
+ <component v-if="stepComponent" :is="stepComponent" :step="activeStep" :steps="stepList" />
6
7
  <div v-loading="confirmLoading" class="form-dialog-content">
7
- <template v-for="(item, i) in stepSchemaList" :key="i">
8
- <curd-form v-show="step == i" ref="curdFormRef" v-model="form" :fields="fields" :form-schema="item.formSchema" :extend-context="extendContexts" />
8
+ <!-- 单表单模式 -->
9
+ <curd-form v-if="isFormMode" ref="curdFormRef" v-model="form" :fields="fields" :form-schema="formSchema" :extend-context="extendContexts" />
10
+ <!-- 分组表单模式 -->
11
+ <template v-else-if="isGroupMode">
12
+ <div v-for="(stepItem, i) in stepList" :key="i" class="form-dialog-step" v-show="activeStep === i">
13
+ <curd-group-form :ref="(el: any) => el && (groupFormRef[i] = el)" v-model="form" :schema="stepItem.schema" :fields="fields" :extend-context="extendContexts" />
14
+ </div>
9
15
  </template>
10
16
  </div>
11
17
  <template #footer>
12
- <span v-if="handleOk" class="dialog-footer">
18
+ <component v-if="footerComponent" :is="footerComponent" />
19
+ <span v-else-if="handleOk" class="dialog-footer">
13
20
  <el-button v-if="cancelBtnTextLabel" :disabled="confirmLoading" type="default" @click="onCancel()">{{ cancelBtnTextLabel }}</el-button>
14
- <el-button v-if="stepSchemaList.length > 1 && step > 0" :disabled="confirmLoading" type="primary" plain @click="prev">{{ t("el.formDialog.preStep") }}</el-button>
15
- <el-button v-if="stepSchemaList.length > 1 && step < stepSchemaList.length - 1" :disabled="confirmLoading" type="primary" plain @click="next">{{ t("el.formDialog.nextStep") }}</el-button>
16
- <el-button v-if="step >= stepSchemaList.length - 1" :disabled="confirmLoading" type="primary" :loading="confirmLoading" @click="onOk">{{ confirmBtnTextLabel }}</el-button>
21
+ <el-button v-if="isGroupMode && hasMultipleSteps && canPrev" :disabled="confirmLoading" type="primary" plain @click="prev()">{{ t("el.formDialog.preStep") }}</el-button>
22
+ <el-button v-if="isGroupMode && hasMultipleSteps && canNext" :disabled="confirmLoading" type="primary" plain @click="next()">{{ t("el.formDialog.nextStep") }}</el-button>
23
+ <el-button v-if="!isGroupMode || isLastStep" :disabled="confirmLoading" type="primary" :loading="confirmLoading" @click="onOk">{{ confirmBtnTextLabel }}</el-button>
17
24
  </span>
18
25
  </template>
19
26
  </component>
20
27
  </template>
21
28
 
22
29
  <script lang="ts">
23
- import { useLocale } from "easybill-ui"
24
- import { computed, defineComponent, type PropType, provide, reactive, ref, type Ref, shallowRef, toRefs, useAttrs } from "vue"
30
+ import { CurdForm, CurdGroupForm, type CurdGroupFormSchema, useLocale } from "easybill-ui"
31
+ import { computed, defineComponent, type PropType, provide, reactive, ref, type Ref, toRefs, useAttrs } from "vue"
25
32
  import { type Fields, type FormSchema } from "../../CurdForm"
33
+ import { useStepList } from "./hooks/useStepList"
34
+ import { useStepNavigation } from "./hooks/useStepNavigation"
26
35
  export default defineComponent({
27
36
  name: "FormDialog",
37
+ components: {
38
+ CurdForm,
39
+ CurdGroupForm,
40
+ },
28
41
  props: {
29
42
  title: {
30
43
  type: String,
@@ -35,14 +48,15 @@ export default defineComponent({
35
48
  type: Function as PropType<() => void>,
36
49
  default: null,
37
50
  },
38
- stepSchema: {
39
- type: Array as PropType<{ name: string; description?: string; formSchema: FormSchema }[]>,
40
- default: () => [],
41
- },
42
51
  formSchema: {
43
52
  // 表单项
44
53
  type: Object as PropType<FormSchema>,
45
- default: () => ({}),
54
+ default: () => null,
55
+ },
56
+ groupSchema: {
57
+ // 分组表单项
58
+ type: Object as PropType<CurdGroupFormSchema>,
59
+ default: () => null,
46
60
  },
47
61
  fields: {
48
62
  // 默认值,一般编辑时传入
@@ -84,45 +98,66 @@ export default defineComponent({
84
98
  type: String as PropType<"dialog" | "drawer">,
85
99
  default: "dialog",
86
100
  },
101
+ stepComponent: {
102
+ type: Object,
103
+ default: null,
104
+ },
105
+ footerComponent: {
106
+ type: Object,
107
+ default: null,
108
+ },
87
109
  },
88
110
  setup(props) {
89
111
  const attrs = useAttrs()
90
112
  const curdFormRef = ref()
91
113
  const form = ref<Fields>({})
92
114
  const state = reactive({
93
- step: 0,
94
115
  visible: true,
95
116
  confirmLoading: false,
96
117
  })
97
118
  const { t } = useLocale()
98
- const stepSchemaList = props.stepSchema?.length ? shallowRef(props.stepSchema) : shallowRef([{ name: "step1", description: "", formSchema: props.formSchema }])
99
- const prev = () => {
100
- if (state.step > 0) {
101
- state.step--
102
- }
103
- }
104
- const next = () => {
105
- if (state.step < stepSchemaList.value.length - 1) {
106
- state.confirmLoading = true
107
- curdFormRef.value[state.step]?.validate((valid: boolean) => {
108
- state.confirmLoading = false
109
- if (valid) state.step++
110
- })
111
- }
112
- }
119
+
120
+ // 模式判断
121
+ const isGroupMode = computed(() => !!props.groupSchema)
122
+ const isFormMode = computed(() => !!props.formSchema && !isGroupMode.value)
123
+
124
+ // 步骤列表
125
+ const { stepList, stepCount, hasMultipleSteps } = useStepList(computed(() => props.groupSchema))
126
+
127
+ // 步骤导航
128
+ const { activeStep, groupFormRef, canPrev, canNext, isLastStep, prev, next, validateCurrentStep } = useStepNavigation(stepCount)
129
+
113
130
  const onOk = () => {
114
131
  state.confirmLoading = true
115
- curdFormRef.value[state.step]
116
- ?.validate()
117
- .then(async () => {
132
+
133
+ const getValidatePromise = (): Promise<boolean> => {
134
+ if (isFormMode.value) {
135
+ return (
136
+ curdFormRef.value
137
+ ?.validate()
138
+ .then(() => true)
139
+ .catch(() => false) ?? Promise.resolve(true)
140
+ )
141
+ }
142
+
143
+ return new Promise<boolean>((resolve) => {
144
+ validateCurrentStep((valid) => resolve(valid))
145
+ })
146
+ }
147
+
148
+ getValidatePromise()
149
+ .then(async (valid) => {
150
+ if (!valid) {
151
+ state.confirmLoading = false
152
+ return
153
+ }
118
154
  const pass = await (props.handleOk && props.handleOk(form.value, state)).finally(() => (state.confirmLoading = false))
119
155
  if (typeof pass == "undefined" || pass) {
120
156
  state.visible = false
121
157
  onCancel()
122
158
  }
123
159
  })
124
- .catch((e: Error) => {
125
- console.error(e)
160
+ .catch(() => {
126
161
  state.confirmLoading = false
127
162
  })
128
163
  }
@@ -141,16 +176,12 @@ export default defineComponent({
141
176
  }, 300)
142
177
  }
143
178
  const loadOptions = (prop: string, config?: unknown) => {
144
- if (!stepSchemaList.value.length) return
145
- for (const i in stepSchemaList.value) {
146
- const group = stepSchemaList.value[i]
147
- const formItem = group.formSchema.formItem
148
- for (const j in formItem) {
149
- const item = formItem[j]
150
- if (item.prop == prop) {
151
- curdFormRef.value[i]?.loadOptions(prop, config)
152
- }
153
- }
179
+ if (isFormMode.value) {
180
+ curdFormRef.value?.loadOptions(prop, config)
181
+ } else if (isGroupMode.value) {
182
+ Object.values(groupFormRef.value).forEach((form) => {
183
+ form?.loadOptions(prop, config)
184
+ })
154
185
  }
155
186
  }
156
187
  const extendContexts = {
@@ -186,11 +217,31 @@ export default defineComponent({
186
217
  const formDialogContext = reactive({
187
218
  form,
188
219
  state,
220
+ stepList,
221
+ activeStep,
189
222
  loadOptions,
190
223
  prev,
191
224
  next,
225
+ goTo: (step: number) => {
226
+ if (step >= 0 && step < stepCount.value) {
227
+ // 验证当前步骤
228
+ validateCurrentStep((valid) => {
229
+ if (valid) {
230
+ activeStep.value = step
231
+ }
232
+ })
233
+ }
234
+ },
192
235
  close: onBeforeClose,
193
236
  handleOk: onOk,
237
+ validateCurrentStep,
238
+ canPrev,
239
+ canNext,
240
+ isLastStep,
241
+ isGroupMode,
242
+ isFormMode,
243
+ confirmBtnTextLabel,
244
+ cancelBtnTextLabel,
194
245
  })
195
246
  provide("formDialogContext", formDialogContext)
196
247
  return {
@@ -199,7 +250,7 @@ export default defineComponent({
199
250
  onCancel,
200
251
  onBeforeClose,
201
252
  curdFormRef,
202
- stepSchemaList,
253
+ stepList,
203
254
  form,
204
255
  prev,
205
256
  next,
@@ -209,6 +260,15 @@ export default defineComponent({
209
260
  cancelBtnTextLabel,
210
261
  componentName,
211
262
  containerProps,
263
+ isGroupMode,
264
+ isFormMode,
265
+ hasMultipleSteps,
266
+ activeStep,
267
+ groupFormRef,
268
+ canPrev,
269
+ canNext,
270
+ isLastStep,
271
+ validateCurrentStep,
212
272
  }
213
273
  },
214
274
  })
@@ -0,0 +1,2 @@
1
+ export { useStepList, type StepItem } from "./useStepList"
2
+ export { useStepNavigation } from "./useStepNavigation"
@@ -0,0 +1,49 @@
1
+ import { computed, type ComputedRef } from "vue"
2
+ import type { CurdGroupFormSchema } from "../../../CurdGroupForm/types"
3
+
4
+ export interface StepItem {
5
+ name: string
6
+ stepIndex?: number
7
+ schema: {
8
+ items: CurdGroupFormSchema["items"]
9
+ }
10
+ }
11
+
12
+ export function useStepList(groupSchema: ComputedRef<CurdGroupFormSchema | null>) {
13
+ const stepList = computed<StepItem[]>(() => {
14
+ if (!groupSchema.value?.items) return []
15
+
16
+ const groups = new Map<string, StepItem>()
17
+
18
+ groupSchema.value.items.forEach((item) => {
19
+ const stepName = item.step || "其他"
20
+
21
+ if (!groups.has(stepName)) {
22
+ groups.set(stepName, {
23
+ name: stepName,
24
+ stepIndex: item.stepIndex,
25
+ schema: { items: [] }
26
+ })
27
+ }
28
+
29
+ groups.get(stepName)!.schema.items.push(item)
30
+ })
31
+
32
+ // 按 stepIndex 排序(undefined 排最后)
33
+ return Array.from(groups.values()).sort((a, b) => {
34
+ const indexA = a.stepIndex ?? Infinity
35
+ const indexB = b.stepIndex ?? Infinity
36
+ return indexA - indexB
37
+ })
38
+ })
39
+
40
+ const stepCount = computed(() => stepList.value.length)
41
+
42
+ const hasMultipleSteps = computed(() => stepList.value.length > 1)
43
+
44
+ return {
45
+ stepList,
46
+ stepCount,
47
+ hasMultipleSteps
48
+ }
49
+ }
@@ -0,0 +1,74 @@
1
+ import { computed, ref, type Ref } from "vue"
2
+ import type { CurdGroupForm } from "../../../CurdGroupForm"
3
+
4
+ interface ValidateFunction {
5
+ validate: (callback: (valid: boolean) => void) => void
6
+ }
7
+
8
+ export function useStepNavigation(stepCount: Ref<number>, onStepChange?: (step: number) => void) {
9
+ const activeStep = ref(0)
10
+ const groupFormRef = ref<Record<number, InstanceType<typeof CurdGroupForm>>>({})
11
+
12
+ const canPrev = computed(() => activeStep.value > 0)
13
+ const canNext = computed(() => activeStep.value < stepCount.value - 1)
14
+ const isLastStep = computed(() => activeStep.value >= stepCount.value - 1)
15
+
16
+ const setStep = (newStep: number) => {
17
+ if (newStep >= 0 && newStep < stepCount.value) {
18
+ activeStep.value = newStep
19
+ onStepChange?.(newStep)
20
+ }
21
+ }
22
+
23
+ const prev = () => {
24
+ if (canPrev.value) {
25
+ setStep(activeStep.value - 1)
26
+ }
27
+ }
28
+
29
+ const next = (onValidateFail?: () => void) => {
30
+ if (!canNext.value) return false
31
+
32
+ const currentForm = groupFormRef.value[activeStep.value] as unknown as ValidateFunction | undefined
33
+ if (currentForm?.validate) {
34
+ currentForm.validate((valid: boolean) => {
35
+ if (valid) {
36
+ setStep(activeStep.value + 1)
37
+ } else if (onValidateFail) {
38
+ onValidateFail()
39
+ }
40
+ })
41
+ } else {
42
+ setStep(activeStep.value + 1)
43
+ }
44
+ return true
45
+ }
46
+
47
+ const validateCurrentStep = (callback: (valid: boolean) => void) => {
48
+ const currentForm = groupFormRef.value[activeStep.value] as unknown as ValidateFunction | undefined
49
+ if (currentForm?.validate) {
50
+ currentForm.validate(callback)
51
+ } else {
52
+ callback(true)
53
+ }
54
+ }
55
+
56
+ const validateCurrentStepAsync = (): Promise<boolean> => {
57
+ return new Promise((resolve) => {
58
+ validateCurrentStep((valid) => resolve(valid))
59
+ })
60
+ }
61
+
62
+ return {
63
+ activeStep,
64
+ groupFormRef,
65
+ canPrev,
66
+ canNext,
67
+ isLastStep,
68
+ setStep,
69
+ prev,
70
+ next,
71
+ validateCurrentStep,
72
+ validateCurrentStepAsync,
73
+ }
74
+ }
@@ -1,12 +1,14 @@
1
+ import type { CurdGroupFormSchema } from "../../CurdGroupForm/types"
1
2
  import type { DialogProps, StepProps } from "element-plus"
2
3
  import type { Fields, FormContext, FormSchema } from "../../CurdForm"
4
+ import type { StepItem } from "./hooks/useStepList"
3
5
 
4
6
  export interface FormDialogOptions extends Partial<DialogProps> {
5
7
  title?: string
6
8
  width?: string | number
7
9
  fields?: Fields
8
- stepSchema?: { name: string; description?: string; formSchema: FormSchema }[]
9
10
  formSchema?: FormSchema
11
+ groupSchema?: CurdGroupFormSchema
10
12
  handleOk?: (modelRef: Fields) => Promise<void>
11
13
  handleClose?: (e: "close" | "cancel") => void
12
14
  setForm?: (form: Fields) => void
@@ -14,4 +16,30 @@ export interface FormDialogOptions extends Partial<DialogProps> {
14
16
  extendContext?: Partial<FormContext>
15
17
  confirmBtnText?: string
16
18
  cancelBtnText?: string
19
+ stepComponent?: object
20
+ footerComponent?: object
21
+ }
22
+
23
+ export interface FormDialogContext {
24
+ form: Fields
25
+ state: {
26
+ visible: boolean
27
+ confirmLoading: boolean
28
+ }
29
+ stepList: StepItem[]
30
+ activeStep: { value: number }
31
+ loadOptions: (prop: string, config?: unknown) => void
32
+ prev: () => void
33
+ next: () => void
34
+ goTo: (step: number) => void
35
+ close: () => void
36
+ handleOk: () => void
37
+ validateCurrentStep: (callback: (valid: boolean) => void) => void
38
+ canPrev: { value: boolean }
39
+ canNext: { value: boolean }
40
+ isLastStep: { value: boolean }
41
+ isGroupMode: { value: boolean }
42
+ isFormMode: { value: boolean }
43
+ confirmBtnTextLabel: { value: string }
44
+ cancelBtnTextLabel: { value: string }
17
45
  }
package/index.ts CHANGED
@@ -2,21 +2,24 @@ import type { Plugin } from "vue"
2
2
  import ConstantStatus from "./components/ConstantStatus"
3
3
  import CurdForm from "./components/CurdForm"
4
4
  import CurdFormItem from "./components/CurdForm/src/CurdFormItem.vue"
5
+ import { CurdGroupForm } from "./components/CurdGroupForm"
5
6
  import CurdTable from "./components/CurdTable"
6
7
  import DetailInfo from "./components/DetailInfo"
7
8
  import FormDialog from "./components/FormDialog"
8
9
  import TableFilter from "./components/TableFilter"
9
10
  import { makeInstaller } from "./utils/vue/make-installer"
10
11
 
11
- const Components = [ConstantStatus, CurdForm, TableFilter, DetailInfo, CurdFormItem, CurdTable, FormDialog] as Plugin[]
12
+ const Components = [ConstantStatus, CurdForm, TableFilter, DetailInfo, CurdFormItem, CurdTable, FormDialog, CurdGroupForm] as Plugin[]
12
13
  export * from "./components/ConstantStatus/src/types"
13
14
  export * from "./components/CurdForm"
15
+ export * from "./components/CurdGroupForm/types"
14
16
  export * from "./components/CurdTable/src/types"
15
17
  export * from "./components/DetailInfo/src/types"
16
18
  export * from "./components/FormDialog/src/types"
17
19
  export * from "./components/TableFilter/types"
18
20
  export * from "./utils/hooks/useGlobalConfig"
19
21
  export * from "./utils/hooks/useLocal"
20
- export { ConstantStatus, CurdForm, CurdFormItem, DetailInfo, TableFilter, CurdTable, FormDialog}
22
+
23
+ export { ConstantStatus, CurdForm, CurdFormItem, CurdGroupForm, CurdTable, DetailInfo, FormDialog, TableFilter }
21
24
 
22
25
  export default makeInstaller([...Components])
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "easybill-ui",
3
- "version": "1.2.25",
3
+ "version": "1.3.0",
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(0 - var(--curd-form-gutter)/ 2);margin-right:calc(0 - 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}
@@ -0,0 +1 @@
1
+ .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 +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(0 - var(--curd-form-gutter)/ 2);margin-right:calc(0 - 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)}
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}