@dt-frames/ui 1.0.2 → 1.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (183) hide show
  1. package/README.md +1 -15
  2. package/es/assets/style/reset.less +0 -3
  3. package/es/index.css +1 -1
  4. package/es/index.js +1 -0
  5. package/es/style/assets/style/reset.less +0 -3
  6. package/es/style/theme/sider/index.less +25 -25
  7. package/es/theme/content/index.d.ts +27 -29
  8. package/es/theme/header/components/menu-search.d.ts +528 -528
  9. package/es/theme/header/components/setting-theme.d.ts +2580 -2550
  10. package/es/theme/header/index.d.ts +4369 -4369
  11. package/es/theme/tabs/components/TabRedo.d.ts +7 -49
  12. package/es/theme/tabs/index.d.ts +2478 -1399
  13. package/es/theme/theme/initTheme.d.ts +3 -3
  14. package/es/theme/theme.d.ts +22 -0
  15. package/package.json +50 -40
  16. package/src/assets/data/icons/actions.ts +427 -0
  17. package/src/assets/data/icons/code.ts +10 -0
  18. package/src/assets/data/icons/commuticate.ts +190 -0
  19. package/src/assets/data/icons/currency.ts +46 -0
  20. package/src/assets/data/icons/devices.ts +128 -0
  21. package/src/assets/data/icons/edit.ts +165 -0
  22. package/src/assets/data/icons/file.ts +104 -0
  23. package/src/assets/data/icons/math.ts +53 -0
  24. package/src/assets/data/icons/message.ts +75 -0
  25. package/src/assets/data/icons/navigate.ts +181 -0
  26. package/src/assets/data/icons/other.ts +333 -0
  27. package/src/assets/data/icons.ts +58 -0
  28. package/src/assets/imgs/logo/logo.png +0 -0
  29. package/src/assets/locales/en_US.json +3 -0
  30. package/src/assets/locales/zh_CN.json +3 -0
  31. package/src/assets/style/index.less +10 -0
  32. package/src/assets/style/reset.less +17 -0
  33. package/src/components/container/index.less +85 -0
  34. package/src/components/container/index.ts +8 -0
  35. package/src/components/container/src/bar.ts +107 -0
  36. package/src/components/container/src/lazy-container.vue +9 -0
  37. package/src/components/container/src/scroll-bar.vue +117 -0
  38. package/src/components/container/src/scroll-container.vue +61 -0
  39. package/src/components/curd/index.ts +5 -0
  40. package/src/components/curd/src/components/dialog.vue +65 -0
  41. package/src/components/curd/src/components/props.ts +32 -0
  42. package/src/components/curd/src/hooks/useCurd.tsx +72 -0
  43. package/src/components/curd/src/types/curd.type.ts +29 -0
  44. package/src/components/excel/index.ts +6 -0
  45. package/src/components/excel/src/export2Excel.ts +44 -0
  46. package/src/components/forms/index.ts +12 -0
  47. package/src/components/forms/src/componentMap.ts +44 -0
  48. package/src/components/forms/src/components/formButton.vue +150 -0
  49. package/src/components/forms/src/components/formIcon.vue +50 -0
  50. package/src/components/forms/src/components/formItem.vue +407 -0
  51. package/src/components/forms/src/components/radioButton.vue +58 -0
  52. package/src/components/forms/src/const/form.const.ts +7 -0
  53. package/src/components/forms/src/hooks/helper.ts +70 -0
  54. package/src/components/forms/src/hooks/useForm.ts +130 -0
  55. package/src/components/forms/src/hooks/useFormActions.ts +63 -0
  56. package/src/components/forms/src/hooks/useFormEvents.ts +247 -0
  57. package/src/components/forms/src/hooks/useFormValue.ts +49 -0
  58. package/src/components/forms/src/hooks/useFormValues.ts +131 -0
  59. package/src/components/forms/src/hooks/useLabelWidth.ts +57 -0
  60. package/src/components/forms/src/index.less +82 -0
  61. package/src/components/forms/src/index.vue +306 -0
  62. package/src/components/forms/src/prop.ts +80 -0
  63. package/src/components/forms/src/types/form.type.ts +269 -0
  64. package/src/components/icons/index.ts +7 -0
  65. package/src/components/icons/src/index.less +96 -0
  66. package/src/components/icons/src/pick-icon.vue +117 -0
  67. package/src/components/icons/src/svg-icon.vue +117 -0
  68. package/src/components/iframe/index.ts +5 -0
  69. package/src/components/iframe/src/index.less +3 -0
  70. package/src/components/iframe/src/index.vue +38 -0
  71. package/src/components/index.ts +46 -0
  72. package/src/components/modal/index.ts +8 -0
  73. package/src/components/modal/src/components/close-icon.vue +47 -0
  74. package/src/components/modal/src/components/modal-wrap.vue +118 -0
  75. package/src/components/modal/src/components/modal.tsx +30 -0
  76. package/src/components/modal/src/components/modalFooter.vue +38 -0
  77. package/src/components/modal/src/hooks/useDrag.ts +107 -0
  78. package/src/components/modal/src/hooks/useFullScreen.ts +27 -0
  79. package/src/components/modal/src/hooks/useModal.ts +177 -0
  80. package/src/components/modal/src/index.less +60 -0
  81. package/src/components/modal/src/index.vue +173 -0
  82. package/src/components/modal/src/props.ts +43 -0
  83. package/src/components/modal/src/types/modal.type.ts +27 -0
  84. package/src/components/router/base-router.vue +11 -0
  85. package/src/components/router/index.ts +3 -0
  86. package/src/components/source/index.ts +1 -0
  87. package/src/components/source/src/hooks/useFetch.ts +70 -0
  88. package/src/components/source/src/hooks/usePage.ts +3 -0
  89. package/src/components/source/src/hooks/useSource.ts +178 -0
  90. package/src/components/source/src/index.ts +5 -0
  91. package/src/components/source/src/types/source.type.ts +68 -0
  92. package/src/components/source/src/types/table.type.ts +8 -0
  93. package/src/components/table/index.ts +7 -0
  94. package/src/components/table/src/components/TableActions.vue +108 -0
  95. package/src/components/table/src/components/TableHeader.vue +77 -0
  96. package/src/components/table/src/components/TableRender.vue +76 -0
  97. package/src/components/table/src/components/setting/Column.vue +355 -0
  98. package/src/components/table/src/components/setting/Download.vue +55 -0
  99. package/src/components/table/src/components/setting/Fullscreen.vue +43 -0
  100. package/src/components/table/src/components/setting/Size.vue +42 -0
  101. package/src/components/table/src/components/setting/index.vue +64 -0
  102. package/src/components/table/src/const.ts +13 -0
  103. package/src/components/table/src/hooks/useColumns.ts +319 -0
  104. package/src/components/table/src/hooks/useCustomRow.ts +0 -0
  105. package/src/components/table/src/hooks/useDataSource.ts +99 -0
  106. package/src/components/table/src/hooks/useLoading.ts +29 -0
  107. package/src/components/table/src/hooks/usePagination.ts +76 -0
  108. package/src/components/table/src/hooks/useRowSelection.ts +146 -0
  109. package/src/components/table/src/hooks/useRows.ts +30 -0
  110. package/src/components/table/src/hooks/useTable.ts +77 -0
  111. package/src/components/table/src/hooks/useTableHeader.ts +48 -0
  112. package/src/components/table/src/hooks/useTableInstance.ts +29 -0
  113. package/src/components/table/src/hooks/useTableScroll.ts +227 -0
  114. package/src/components/table/src/index.less +162 -0
  115. package/src/components/table/src/index.vue +198 -0
  116. package/src/components/table/src/props.ts +152 -0
  117. package/src/components/table/src/types/table.type.ts +133 -0
  118. package/src/components/table/src/types/tableHeader.type.ts +27 -0
  119. package/src/components/type.ts +0 -0
  120. package/src/directives/icon.ts +36 -0
  121. package/src/directives/index.ts +27 -0
  122. package/src/directives/permission.ts +21 -0
  123. package/src/global.d.ts +8 -0
  124. package/src/index.ts +4 -0
  125. package/src/theme/content/index.vue +37 -0
  126. package/src/theme/feature/back-top.vue +11 -0
  127. package/src/theme/feature/index.vue +7 -0
  128. package/src/theme/footer/index.less +16 -0
  129. package/src/theme/footer/index.vue +24 -0
  130. package/src/theme/header/components/bread-crumb.vue +26 -0
  131. package/src/theme/header/components/fullscreen.vue +14 -0
  132. package/src/theme/header/components/handler.ts +81 -0
  133. package/src/theme/header/components/index.ts +21 -0
  134. package/src/theme/header/components/lang-picker.vue +36 -0
  135. package/src/theme/header/components/logo.vue +33 -0
  136. package/src/theme/header/components/menu-search.vue +62 -0
  137. package/src/theme/header/components/notify.vue +23 -0
  138. package/src/theme/header/components/setting-theme.vue +123 -0
  139. package/src/theme/header/components/theme-drawer/enum.ts +12 -0
  140. package/src/theme/header/components/theme-drawer/feature.vue +75 -0
  141. package/src/theme/header/components/theme-drawer/index.ts +7 -0
  142. package/src/theme/header/components/theme-drawer/menu-type.vue +40 -0
  143. package/src/theme/header/components/theme-drawer/select-item.vue +46 -0
  144. package/src/theme/header/components/theme-drawer/switch-item.vue +39 -0
  145. package/src/theme/header/components/theme-drawer/theme-color.vue +26 -0
  146. package/src/theme/header/components/trigger.vue +14 -0
  147. package/src/theme/header/components/user-info.vue +43 -0
  148. package/src/theme/header/const/index.ts +40 -0
  149. package/src/theme/header/helper/menu-tree.ts +67 -0
  150. package/src/theme/header/index.less +438 -0
  151. package/src/theme/header/index.ts +0 -0
  152. package/src/theme/header/index.vue +96 -0
  153. package/src/theme/header/multiple-header.vue +67 -0
  154. package/src/theme/header/set-theme.less +68 -0
  155. package/src/theme/index.ts +3 -0
  156. package/src/theme/sider/components/basic-menu/basic-menu-item.vue +14 -0
  157. package/src/theme/sider/components/basic-menu/basic-menu.vue +122 -0
  158. package/src/theme/sider/components/basic-menu/basic-sub-menu-item.vue +46 -0
  159. package/src/theme/sider/components/basic-menu/menu-item-content.vue +13 -0
  160. package/src/theme/sider/components/drag-bar.vue +26 -0
  161. package/src/theme/sider/components/layout-menu.vue +132 -0
  162. package/src/theme/sider/components/props.ts +97 -0
  163. package/src/theme/sider/components/sider-trigger.vue +24 -0
  164. package/src/theme/sider/helper/sider.ts +52 -0
  165. package/src/theme/sider/helper/split-menu.ts +147 -0
  166. package/src/theme/sider/hooks/useDragLine.ts +86 -0
  167. package/src/theme/sider/hooks/useOpenKeys.ts +57 -0
  168. package/src/theme/sider/index.less +203 -0
  169. package/src/theme/sider/index.vue +88 -0
  170. package/src/theme/tabs/components/TabContent.vue +37 -0
  171. package/src/theme/tabs/components/TabRedo.vue +18 -0
  172. package/src/theme/tabs/hooks/useMultifyTabs.ts +96 -0
  173. package/src/theme/tabs/hooks/useTabDropdown.ts +89 -0
  174. package/src/theme/tabs/index.less +165 -0
  175. package/src/theme/tabs/index.vue +98 -0
  176. package/src/theme/tabs/types/tabs.type.ts +8 -0
  177. package/src/theme/theme.less +66 -0
  178. package/src/theme/theme.vue +89 -0
  179. package/src/theme/transition.less +99 -0
  180. package/es/themes/generate.ts +0 -74
  181. package/es/themes/index.ts +0 -10
  182. package/es/themes/modifyVars.ts +0 -33
  183. package/es/themes/themePlugiin.ts +0 -74
@@ -0,0 +1,131 @@
1
+ /** =========================================================
2
+ * 处理表单的值
3
+ * ==========================================================*/
4
+ import { dateFormat, isFunction, isObject, isString, Recordable } from "@dt-frames/core";
5
+ import { isArray } from "@vue/shared";
6
+ import { set } from "lodash-es";
7
+ import dayjs from "dayjs";
8
+ import { ComputedRef, Ref, unref } from "vue";
9
+ import { FormProps, FormSchema } from "../types/form.type";
10
+ import { datePickerType } from "./helper";
11
+
12
+ type FormValueOptions = {
13
+ getProps: ComputedRef<FormProps>
14
+ defaultValue: Ref<any>
15
+ getSchema: ComputedRef<FormSchema[]>
16
+ formModel: Recordable
17
+ }
18
+
19
+ export function useFormValues({
20
+ defaultValue,
21
+ getSchema,
22
+ formModel,
23
+ getProps
24
+ }: FormValueOptions) {
25
+
26
+ /**
27
+ * 可以动态获取formModel的值
28
+ */
29
+ function handleFormValues(values: Recordable) {
30
+ if( !isObject(values) ) return { }
31
+
32
+ const res: Recordable = {}
33
+
34
+ for(let [key, value] of Object.entries(values)) {
35
+ if( !key || (Array.isArray(value) && value.length === 0) || isFunction(value) ) {
36
+ continue
37
+ }
38
+
39
+ /**
40
+ * TODO 这里需要对时间进行处理
41
+ */
42
+
43
+
44
+ if ( isString(value) ) {
45
+ value = value.trim();
46
+ }
47
+
48
+ set(res, key, value)
49
+ }
50
+
51
+ return res
52
+ }
53
+
54
+
55
+ /**
56
+ * 设置默认值
57
+ * 设置初始化的formModel值
58
+ */
59
+ function initDefault() {
60
+ const schema = unref( getSchema )
61
+ const obj: Recordable = {}
62
+
63
+ schema.forEach( item => {
64
+
65
+ const { props = {}, name, component } = item
66
+
67
+ let { defaultValue, mode, format, treeCheckable } = isFunction( props ) ? props() : props
68
+ const names: string[] = isString(name) ? [ name ] : name
69
+
70
+ if( defaultValue !== null && defaultValue !== undefined ) {
71
+
72
+ // 处理时间
73
+ if( datePickerType.includes(component) ) {
74
+ const modeType = {
75
+ time: 'YYYY-MM-DD HH:mm:ss',
76
+ date: 'YYYY-MM-DD',
77
+ month: 'YYYY-MM',
78
+ year: 'YYYY'
79
+ }
80
+
81
+ const _format = format || ( modeType[mode] ) || modeType.date
82
+
83
+ if ( !isArray(defaultValue) ) {
84
+ // 单个时间
85
+ obj[names[0]] = dayjs(defaultValue, _format)
86
+ formModel[names[0]] = dayjs(defaultValue, _format)
87
+ } else {
88
+
89
+ // 范围时间
90
+ let rangeTimes = defaultValue.reduce(( t, it ) => {
91
+ t.push( dayjs(it, _format) )
92
+ return t
93
+ }, [])
94
+
95
+ obj[names[0]] = rangeTimes
96
+ formModel[names[0]] = rangeTimes
97
+ }
98
+ } else {
99
+ // 如果names是数组 则代表有多个默认值 如 InputGroup
100
+ if( names.length > 1 ) {
101
+ names.forEach( ( key, index ) => {
102
+ obj[ key ] = defaultValue[ index ]
103
+ formModel[ key ] = defaultValue[ index ]
104
+ } )
105
+ } else {
106
+ obj[names[0]] = defaultValue
107
+ formModel[names[0]] = defaultValue
108
+ }
109
+ }
110
+ } else {
111
+ names.forEach( ( key, index ) => {
112
+ let defaultV = null
113
+ // 如果为树结构且为多选 或者复选框为多选状态
114
+ if( (component === 'TreeSelect' && (mode === 'multiple' || treeCheckable)) ||
115
+ (component === 'Select' && mode === 'multiple') ) {
116
+ defaultV = []
117
+ }
118
+
119
+ formModel[ key ] = obj[ key ] = defaultV
120
+ } )
121
+ }
122
+ } )
123
+
124
+ defaultValue.value = obj
125
+ }
126
+
127
+ return {
128
+ handleFormValues,
129
+ initDefault
130
+ }
131
+ }
@@ -0,0 +1,57 @@
1
+ /** =========================================================
2
+ * 处理表单的label宽度问题
3
+ * ==========================================================*/
4
+
5
+ import { isString, isNumber, useAppStore } from "@dt-frames/core";
6
+ import { computed, Ref, unref } from "vue";
7
+ import { FormProps, FormSchema } from "../types/form.type";
8
+
9
+ // 计算label的宽度
10
+ export function useLabelWidth(schemaItemRef: Ref<FormSchema>, propsRef: Ref<FormProps>) {
11
+ return computed(() => {
12
+ // 当前元素上关于label的设置
13
+ const { labelWidth, labelCol = { }, wrapperCol = { } } = unref( schemaItemRef )
14
+ // 获取全局配置
15
+ const { appConf } = useAppStore()
16
+
17
+ // 整个form关于label的设置
18
+ const {
19
+ labelWidth: gLabelWidth,
20
+ labelCol: glabelCol,
21
+ wrapperCol: gwrapperCol,
22
+ layout = appConf.ui.form.layout
23
+ } = unref( propsRef )
24
+
25
+ // 如果宽度设置为0
26
+ if( (isString(labelWidth) || isNumber(labelWidth)) && Number(labelWidth.toString()) === 0 ) {
27
+ return {
28
+ labelCol: {
29
+ ...labelCol,
30
+ ...{ style: { textAlign: 'left' } }
31
+ },
32
+ wrapperCol
33
+ }
34
+ }
35
+
36
+ let width = labelWidth || gLabelWidth
37
+ const labelcol = { ...glabelCol, ...labelCol }
38
+ const wrapcol = { ...gwrapperCol, ...wrapperCol }
39
+
40
+ if (width) {
41
+ width = isNumber(width) ? `${width}px` : width
42
+ }
43
+
44
+ return {
45
+ labelCol: {
46
+ style: { width },
47
+ ...labelcol
48
+ },
49
+ wrapperCol: {
50
+ style: { width: layout === 'vertical' ? '100%' : `calc(100% - ${width})` },
51
+ ...wrapcol
52
+ }
53
+ }
54
+
55
+ })
56
+ }
57
+
@@ -0,0 +1,82 @@
1
+ .text-secondary{
2
+ color: #666;
3
+ }
4
+
5
+ .suffix-item .suffix {
6
+ display: inline-flex;
7
+ padding-left: 6px;
8
+ margin-top: 1px;
9
+ line-height: 1;
10
+ align-items: center;
11
+ }
12
+
13
+ .form-btns{
14
+ button{
15
+ margin-left: 12px;
16
+ }
17
+
18
+ .advanced{
19
+ margin-left: 8px;
20
+ .text{
21
+ margin-right: 5px;
22
+ }
23
+ .basic-arrow{
24
+ margin-left: -8px;
25
+ }
26
+ }
27
+ }
28
+
29
+ .basic-arrow{
30
+ display: inline-block;
31
+ cursor: pointer;
32
+ transform: rotate(0deg);
33
+ transition: all 0.3s ease 0.1s;
34
+ transform-origin: center center;
35
+
36
+
37
+ .dt-icon{
38
+ vertical-align: middle;
39
+ color: @primary-color !important;
40
+ }
41
+
42
+ &--active{
43
+ transform: rotate(180deg);
44
+ }
45
+ }
46
+
47
+ .form-btns{
48
+ .ant-form-item-control-input-content{
49
+ display: flex;
50
+ .ant-btn{
51
+ display: flex;
52
+ align-items: center;
53
+ }
54
+ .ant-btn .dt-icon{
55
+ font-size: 20px;
56
+ height: 100%;
57
+
58
+ svg{
59
+ display: block;
60
+ height: 100%;
61
+ text-align: center;
62
+ }
63
+
64
+ .preIcon{
65
+ padding-right: 2px;
66
+ }
67
+ }
68
+
69
+ .ant-btn-primary .dt-icon svg{
70
+ color: #fff;
71
+ }
72
+ }
73
+ }
74
+
75
+ .basic-form--compact{
76
+ .ant-form-item {
77
+ margin-bottom: 14px !important;
78
+ }
79
+ }
80
+
81
+
82
+
@@ -0,0 +1,306 @@
1
+ <template>
2
+ <Form
3
+ v-bind="getFormBindValue"
4
+ ref="formElRef"
5
+ :class="getFormClass"
6
+ :model="formModel"
7
+ :layout="getLayout"
8
+ >
9
+ <Row v-bind="getProps.rowProps">
10
+ <template v-for="schema in getSchema" :key="schema.prop">
11
+ <FormItem
12
+ :schema="schema"
13
+ :formProps="getProps"
14
+ :formModel="formModel"
15
+ :defaultValues="defaultValue"
16
+ :setFormModel="setFormModel"
17
+ :formActionType="formActionMethods"
18
+ >
19
+ <template #[item]="data" v-for="item in Object.keys($slots)">
20
+ <slot :name="item" v-bind="data || {}"></slot>
21
+ </template>
22
+ </FormItem>
23
+ </template>
24
+
25
+ <FormButtons
26
+ v-if="getActionsProps.buttonList?.length && getProps.mode === 'search'"
27
+ v-bind="getActionsProps"
28
+ @handle-method="handleMethod"
29
+ ></FormButtons>
30
+ </Row>
31
+ </Form>
32
+ </template>
33
+
34
+ <script lang="ts">
35
+ import { computed, ref, reactive, unref, onMounted, Ref, watch, defineComponent, toRaw } from 'vue'
36
+ import { Form, Row } from 'ant-design-vue'
37
+ import { Nullable, Recordable, deepMerge, useAppStore, isFunction, useTimeoutFn } from '@dt-frames/core'
38
+
39
+ import FormItem from './components/formItem.vue'
40
+ import FormButtons from './components/formButton.vue'
41
+ import { ButtonProps, FormActionType, FormProps, FormSchema } from './types/form.type'
42
+ import { BasicProps } from './prop'
43
+ import { useFormValues } from './hooks/useFormValues'
44
+ import { useFormEvents } from './hooks/useFormEvents'
45
+ import { useFormActions } from './hooks/useFormActions'
46
+ import { SEARCH_BTNS, SEARCH_BTN_NAME } from './const/form.const'
47
+
48
+
49
+ export default defineComponent({
50
+ name: 'dt-form',
51
+ components: {
52
+ Form,
53
+ Row,
54
+ FormItem,
55
+ FormButtons
56
+ },
57
+ props: BasicProps,
58
+ emits: [ 'register', 'reset' ],
59
+ setup(props, { emit, attrs }) {
60
+ const { appConf } = useAppStore()
61
+ const formElRef = ref(null)
62
+
63
+ // 表单绑定的变量
64
+ const formModel = reactive<Recordable>({})
65
+ // 表单默认值
66
+ const defaultValue = ref<Recordable>({})
67
+ // 定义一个新的propref,防止污染原来的prop
68
+ const propsRef = ref<Partial<FormProps>>({})
69
+ // 表单条目
70
+ const schemaRef = ref<Nullable<FormSchema[]>>(null)
71
+
72
+ // 计算容器的css样式
73
+ const formStyle = computed(() => {
74
+ const { style, mode } = unref(getProps)
75
+ return {
76
+ style: deepMerge({
77
+ padding: mode === 'dialog' ? '20px' : null
78
+ }, style)
79
+ }
80
+ })
81
+
82
+ // form绑定的属性
83
+ const getFormBindValue = computed( () => ({
84
+ ...attrs,
85
+ ...props,
86
+ ...unref(getProps),
87
+ ...unref(formStyle)
88
+ } as Recordable))
89
+
90
+ /**
91
+ * 获取form的所有配置信息
92
+ */
93
+ const getProps = computed( (): FormProps => {
94
+ const { labelAlign, rowProps } = props
95
+
96
+ // 全局设置
97
+ const globalProps = {
98
+ labelAlign: labelAlign || appConf.ui.form.labelAlign,
99
+ rowProps: rowProps || appConf.ui.form.rowProps
100
+ }
101
+
102
+ return { ...props, ...globalProps, ...(unref(propsRef) as any) } as unknown as FormProps
103
+ } )
104
+
105
+ // 计算布局方式
106
+ const getLayout = computed(() => {
107
+ return unref(getProps).layout || appConf.ui.form.layout
108
+ })
109
+
110
+ // form表单样式[紧凑型 | 正常]
111
+ const getFormClass = computed(() => {
112
+ const { compact, mode } = unref(getProps)
113
+
114
+ const getCompact = compact === null
115
+ ? ( mode === 'dialog' ? false : true)
116
+ : compact
117
+
118
+ return [
119
+ 'basic-form',
120
+ {
121
+ 'basic-form--compact': getCompact,
122
+ 'basic-form--search': (mode === 'search' || mode === undefined) ? true : false
123
+ },
124
+ ];
125
+ })
126
+
127
+ const getSchema = computed(() => {
128
+ const schemas = unref(schemaRef) || (unref(getProps).schemas as any)
129
+ return schemas as FormSchema[];
130
+ })
131
+
132
+
133
+
134
+ /**
135
+ * 处理表单的初始化数据
136
+ */
137
+ const { handleFormValues, initDefault } = useFormValues({
138
+ getProps,
139
+ defaultValue,
140
+ getSchema,
141
+ formModel,
142
+ })
143
+
144
+ /**
145
+ * 处理表单函数
146
+ */
147
+ // 表单注册
148
+ async function setProps(formProps: Partial<FormProps>): Promise<void> {
149
+ propsRef.value = deepMerge(unref(propsRef) || {}, formProps);
150
+ }
151
+
152
+ // 设置formModel
153
+ function setFormModel(key: string, value: any) {
154
+ formModel[ key ] = value
155
+ const { validateTrigger } = unref(getFormBindValue)
156
+
157
+ if (!validateTrigger || validateTrigger === 'change') {
158
+ validateFields([key]).catch((_) => {});
159
+ }
160
+ }
161
+
162
+ const {
163
+ updateSchema,
164
+ resetSchema,
165
+ clearValidate,
166
+ resetForms,
167
+ removeFormByName,
168
+ setFormValues,
169
+ appendFormItems,
170
+ getFormValues,
171
+ validate,
172
+ validateFields
173
+ } = useFormEvents({
174
+ emit,
175
+ getProps,
176
+ getSchema,
177
+ formModel,
178
+ formElRef: formElRef as Ref<FormActionType>,
179
+ defaultValue,
180
+ schemaRef: schemaRef as unknown as Ref<FormSchema[]>,
181
+ handleFormValues
182
+ })
183
+
184
+ const formActionMethods: FormActionType = {
185
+ setProps,
186
+ updateSchema,
187
+ resetSchema,
188
+ clearValidate,
189
+ resetForms,
190
+ removeFormByName,
191
+ setFormValues,
192
+ appendFormItems,
193
+ getFormValues,
194
+ validate,
195
+ validateFields
196
+ }
197
+
198
+ // 操作按钮相关操作
199
+ const [ handleMethod ] = useFormActions({
200
+ getProps,
201
+ getSchema,
202
+ defaultValue,
203
+ updateSchema,
204
+ getFormValues,
205
+ setFormValues
206
+ })
207
+
208
+
209
+ watch(
210
+ () => unref(getProps).model,
211
+ () => {
212
+ const { model } = unref(getProps);
213
+ if (!model) return;
214
+ setFormValues(model);
215
+ },
216
+ {
217
+ immediate: true,
218
+ },
219
+ )
220
+
221
+ watch(
222
+ () => unref(getProps).schemas,
223
+ (schemas) => resetSchema(schemas ?? [])
224
+ )
225
+
226
+ onMounted(() => {
227
+ // 每次加载 进行重置
228
+ setFormValues( null )
229
+ emit('register', formActionMethods)
230
+ initDefault()
231
+
232
+ // 为了保证table的数据能够成功传入useSource中,这里需要延迟执行search
233
+ useTimeoutFn(() => {
234
+ // 如果有onSearch默认查询
235
+ const { onSearch, autoFetch } = unref(getProps)
236
+
237
+ if( autoFetch && onSearch && isFunction(onSearch) ) {
238
+ onSearch(toRaw(defaultValue.value))
239
+ }
240
+ }, 20)
241
+ })
242
+
243
+ const getActionsProps = computed((): Recordable => {
244
+ const {
245
+ mode,
246
+ minShowColumn = appConf.ui.form.minShowColumn || 2,
247
+ schemas = [],
248
+ showAdvancedButton: advanced,
249
+ loading,
250
+ buttons
251
+ } = unref(getProps)
252
+
253
+ let showAdvancedButton = mode === 'search' ? true : false
254
+
255
+ if( advanced !== undefined ) {
256
+ showAdvancedButton = advanced
257
+ }
258
+
259
+ if( schemas.length <= minShowColumn ) {
260
+ showAdvancedButton = false
261
+ }
262
+
263
+ let buttonList: ButtonProps[] = []
264
+ if( !buttons && mode === 'search' ) {
265
+ SEARCH_BTNS.forEach((it: any) => {
266
+ it.loading = it.name === SEARCH_BTN_NAME ? loading?.onSearch : loading?.onReset
267
+ buttonList.push(it)
268
+ })
269
+ } else {
270
+ buttonList = [...(buttons||[])]
271
+ }
272
+
273
+ let colspan = mode === 'search' ? appConf.ui.form.searchColspan : appConf.ui.form.dialogColspan
274
+
275
+ return {
276
+ ...colspan,
277
+ ...{
278
+ showAdvancedButton,
279
+ buttonList
280
+ },
281
+ }
282
+ })
283
+
284
+ return {
285
+ getFormBindValue,
286
+ getFormClass,
287
+ formModel,
288
+ getLayout,
289
+ getProps,
290
+ getSchema,
291
+ defaultValue,
292
+ formActionMethods,
293
+ formElRef,
294
+ props,
295
+ setFormModel,
296
+ handleMethod,
297
+ getActionsProps
298
+ }
299
+ }
300
+ })
301
+
302
+
303
+
304
+
305
+
306
+ </script>
@@ -0,0 +1,80 @@
1
+ import { Recordable } from "@dt-frames/core"
2
+ import { PropType } from "vue"
3
+ import { ColEx, FormActionType, FormProps, FormSchema } from "./types/form.type"
4
+ import type { RowProps } from 'ant-design-vue/lib/grid/Row'
5
+
6
+
7
+ export const BasicProps = {
8
+ mode: {
9
+ type: String as PropType<'search' | 'dialog' | null>,
10
+ default: 'search'
11
+ },
12
+ // 自动查询
13
+ autoFetch: {
14
+ type: Boolean,
15
+ default: true
16
+ },
17
+ // 绑定的model
18
+ model: {
19
+ type: Object as PropType<Recordable>,
20
+ default: {}
21
+ },
22
+ labelWidth: {
23
+ type: Number, String,
24
+ default: 100
25
+ },
26
+ // 表单配置规则
27
+ schemas: {
28
+ type: [Array] as PropType<FormSchema[]>,
29
+ default: () => [],
30
+ },
31
+ // 是否使用紧凑布局
32
+ compact: {
33
+ type: Boolean,
34
+ default: null
35
+ },
36
+ // 表单尺寸
37
+ size: {
38
+ type: String as PropType<'default' | 'small' | 'large'>
39
+ },
40
+ formActions: {
41
+ type: Object as PropType<FormActionType>
42
+ },
43
+ labelAlign: {
44
+ type: String as PropType<'left' | 'right'>
45
+ },
46
+ rowProps: Object as PropType<RowProps>,
47
+ colProps: Object as PropType<ColEx>
48
+ }
49
+
50
+ export const FormItemProps = {
51
+ // 配置参数
52
+ schema: {
53
+ type: Object as PropType<FormSchema>
54
+ },
55
+ // 表单属性
56
+ formProps: {
57
+ type: Object as PropType<FormProps>,
58
+ default: () => ({})
59
+ },
60
+ // 默认值
61
+ defaultValues: {
62
+ type: Object as PropType<Recordable>,
63
+ default: () => ({})
64
+ },
65
+ // 绑定的model
66
+ formModel: {
67
+ type: Object as PropType<Recordable>,
68
+ default: () => ({})
69
+ },
70
+ // 设置formModel
71
+ setFormModel: {
72
+ type: Function as PropType<(key: string, value: any) => void>
73
+ },
74
+ formActionType: {
75
+ type: Object as PropType<FormActionType>
76
+ },
77
+ style: {
78
+ type: Object as PropType<Recordable>
79
+ }
80
+ }