gi-component 0.0.49 → 0.0.51

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 (267) hide show
  1. package/dist/components/button/index.d.ts +2 -1
  2. package/dist/components/button/index.d.ts.map +1 -0
  3. package/dist/components/button/src/{button.vue.d.ts → button.d.ts} +5 -3
  4. package/dist/components/button/src/button.d.ts.map +1 -0
  5. package/dist/components/button/src/type.d.ts +1 -0
  6. package/dist/components/button/src/type.d.ts.map +1 -0
  7. package/dist/components/card/index.d.ts +2 -1
  8. package/dist/components/card/index.d.ts.map +1 -0
  9. package/dist/components/card/src/card.d.ts +37 -0
  10. package/dist/components/card/src/card.d.ts.map +1 -0
  11. package/dist/components/card/src/type.d.ts +1 -0
  12. package/dist/components/card/src/type.d.ts.map +1 -0
  13. package/dist/components/descriptions/index.d.ts +2 -2
  14. package/dist/components/descriptions/index.d.ts.map +1 -0
  15. package/dist/components/descriptions/src/descriptions.d.ts +25 -0
  16. package/dist/components/descriptions/src/descriptions.d.ts.map +1 -0
  17. package/dist/components/descriptions/src/type.d.ts +25 -11
  18. package/dist/components/descriptions/src/type.d.ts.map +1 -0
  19. package/dist/components/dialog/index.d.ts +3 -2
  20. package/dist/components/dialog/index.d.ts.map +1 -0
  21. package/dist/components/dialog/src/create-dialog.d.ts +27 -0
  22. package/dist/components/dialog/src/create-dialog.d.ts.map +1 -0
  23. package/dist/components/dialog/src/dialog-content.d.ts +11 -0
  24. package/dist/components/dialog/src/dialog-content.d.ts.map +1 -0
  25. package/dist/components/dialog/src/dialog.d.ts +42 -24
  26. package/dist/components/dialog/src/dialog.d.ts.map +1 -0
  27. package/dist/components/dialog/src/type.d.ts +1 -0
  28. package/dist/components/dialog/src/type.d.ts.map +1 -0
  29. package/dist/components/dot/index.d.ts +2 -1
  30. package/dist/components/dot/index.d.ts.map +1 -0
  31. package/dist/components/dot/src/dot.d.ts +9 -0
  32. package/dist/components/dot/src/dot.d.ts.map +1 -0
  33. package/dist/components/dot/src/type.d.ts +1 -0
  34. package/dist/components/dot/src/type.d.ts.map +1 -0
  35. package/dist/components/drawer/index.d.ts +3 -2
  36. package/dist/components/drawer/index.d.ts.map +1 -0
  37. package/dist/components/drawer/src/create-drawer.d.ts +19 -0
  38. package/dist/components/drawer/src/create-drawer.d.ts.map +1 -0
  39. package/dist/components/drawer/src/drawer.d.ts +46 -16
  40. package/dist/components/drawer/src/drawer.d.ts.map +1 -0
  41. package/dist/components/drawer/src/type.d.ts +1 -0
  42. package/dist/components/drawer/src/type.d.ts.map +1 -0
  43. package/dist/components/edit-table/index.d.ts +2 -1
  44. package/dist/components/edit-table/index.d.ts.map +1 -0
  45. package/dist/components/edit-table/src/type.d.ts +1 -0
  46. package/dist/components/edit-table/src/type.d.ts.map +1 -0
  47. package/dist/components/flex/index.d.ts +2 -1
  48. package/dist/components/flex/index.d.ts.map +1 -0
  49. package/dist/components/flex/src/{flex.vue.d.ts → flex.d.ts} +4 -2
  50. package/dist/components/flex/src/flex.d.ts.map +1 -0
  51. package/dist/components/flex/src/type.d.ts +1 -0
  52. package/dist/components/flex/src/type.d.ts.map +1 -0
  53. package/dist/components/form/index.d.ts +2 -1
  54. package/dist/components/form/index.d.ts.map +1 -0
  55. package/dist/components/form/src/type.d.ts +1 -0
  56. package/dist/components/form/src/type.d.ts.map +1 -0
  57. package/dist/components/grid/index.d.ts +3 -2
  58. package/dist/components/grid/index.d.ts.map +1 -0
  59. package/dist/components/grid/src/context.d.ts +1 -0
  60. package/dist/components/grid/src/context.d.ts.map +1 -0
  61. package/dist/components/grid/src/{grid-item.vue.d.ts → grid-item.d.ts} +9 -8
  62. package/dist/components/grid/src/grid-item.d.ts.map +1 -0
  63. package/dist/components/grid/src/{grid.vue.d.ts → grid.d.ts} +7 -6
  64. package/dist/components/grid/src/grid.d.ts.map +1 -0
  65. package/dist/components/grid/src/hook/use-index.d.ts +3 -2
  66. package/dist/components/grid/src/hook/use-index.d.ts.map +1 -0
  67. package/dist/components/grid/src/hook/use-responsive-state.d.ts +3 -2
  68. package/dist/components/grid/src/hook/use-responsive-state.d.ts.map +1 -0
  69. package/dist/components/grid/src/hook/use-responsive-value.d.ts +3 -2
  70. package/dist/components/grid/src/hook/use-responsive-value.d.ts.map +1 -0
  71. package/dist/components/grid/src/interface.d.ts +1 -0
  72. package/dist/components/grid/src/interface.d.ts.map +1 -0
  73. package/dist/components/grid/src/type.d.ts +1 -0
  74. package/dist/components/grid/src/type.d.ts.map +1 -0
  75. package/dist/components/grid/src/utils/global-config.d.ts +1 -0
  76. package/dist/components/grid/src/utils/global-config.d.ts.map +1 -0
  77. package/dist/components/grid/src/utils/index.d.ts +1 -0
  78. package/dist/components/grid/src/utils/index.d.ts.map +1 -0
  79. package/dist/components/grid/src/utils/is.d.ts +1 -0
  80. package/dist/components/grid/src/utils/is.d.ts.map +1 -0
  81. package/dist/components/grid/src/utils/responsive-observe.d.ts +1 -0
  82. package/dist/components/grid/src/utils/responsive-observe.d.ts.map +1 -0
  83. package/dist/components/input-group/index.d.ts +2 -1
  84. package/dist/components/input-group/index.d.ts.map +1 -0
  85. package/dist/components/input-group/src/{input-group.vue.d.ts → input-group.d.ts} +3 -1
  86. package/dist/components/input-group/src/input-group.d.ts.map +1 -0
  87. package/dist/components/input-group/src/type.d.ts +1 -0
  88. package/dist/components/input-group/src/type.d.ts.map +1 -0
  89. package/dist/components/input-search/index.d.ts +2 -1
  90. package/dist/components/input-search/index.d.ts.map +1 -0
  91. package/dist/components/input-search/src/{input-search.vue.d.ts → input-search.d.ts} +6 -4
  92. package/dist/components/input-search/src/input-search.d.ts.map +1 -0
  93. package/dist/components/input-search/src/type.d.ts +1 -0
  94. package/dist/components/input-search/src/type.d.ts.map +1 -0
  95. package/dist/components/nav-tabs/index.d.ts +2 -1
  96. package/dist/components/nav-tabs/index.d.ts.map +1 -0
  97. package/dist/components/nav-tabs/src/{nav-tabs.vue.d.ts → nav-tabs.d.ts} +6 -4
  98. package/dist/components/nav-tabs/src/nav-tabs.d.ts.map +1 -0
  99. package/dist/components/nav-tabs/src/type.d.ts +1 -0
  100. package/dist/components/nav-tabs/src/type.d.ts.map +1 -0
  101. package/dist/components/page-layout/index.d.ts +2 -1
  102. package/dist/components/page-layout/index.d.ts.map +1 -0
  103. package/dist/components/page-layout/src/page-layout.d.ts +219 -0
  104. package/dist/components/page-layout/src/page-layout.d.ts.map +1 -0
  105. package/dist/components/page-layout/src/{split-button.vue.d.ts → split-button.d.ts} +5 -3
  106. package/dist/components/page-layout/src/split-button.d.ts.map +1 -0
  107. package/dist/components/page-layout/src/type.d.ts +8 -0
  108. package/dist/components/page-layout/src/type.d.ts.map +1 -0
  109. package/dist/components/page-layout/src/useAutoCollapse.d.ts +1 -0
  110. package/dist/components/page-layout/src/useAutoCollapse.d.ts.map +1 -0
  111. package/dist/components/table/index.d.ts +22 -3
  112. package/dist/components/table/index.d.ts.map +1 -0
  113. package/dist/components/table/src/table-column.d.ts +21 -0
  114. package/dist/components/table/src/table-column.d.ts.map +1 -0
  115. package/dist/components/table/src/type.d.ts +225 -9
  116. package/dist/components/table/src/type.d.ts.map +1 -0
  117. package/dist/components/tabs/index.d.ts +2 -1
  118. package/dist/components/tabs/index.d.ts.map +1 -0
  119. package/dist/components/tabs/src/{tabs.vue.d.ts → tabs.d.ts} +16 -14
  120. package/dist/components/tabs/src/tabs.d.ts.map +1 -0
  121. package/dist/components/tabs/src/type.d.ts +1 -0
  122. package/dist/components/tabs/src/type.d.ts.map +1 -0
  123. package/dist/components/tag/index.d.ts +2 -1
  124. package/dist/components/tag/index.d.ts.map +1 -0
  125. package/dist/components/tag/src/{tag.vue.d.ts → tag.d.ts} +7 -5
  126. package/dist/components/tag/src/tag.d.ts.map +1 -0
  127. package/dist/components/tag/src/type.d.ts +1 -0
  128. package/dist/components/tag/src/type.d.ts.map +1 -0
  129. package/dist/components/tree-transfer/index.d.ts +2 -1
  130. package/dist/components/tree-transfer/index.d.ts.map +1 -0
  131. package/dist/components/tree-transfer/src/tree-transfer.d.ts +14438 -0
  132. package/dist/components/tree-transfer/src/tree-transfer.d.ts.map +1 -0
  133. package/dist/components/tree-transfer/src/type.d.ts +1 -0
  134. package/dist/components/tree-transfer/src/type.d.ts.map +1 -0
  135. package/dist/components/tree-transfer/src/utils.d.ts +1 -0
  136. package/dist/components/tree-transfer/src/utils.d.ts.map +1 -0
  137. package/dist/gi.css +1 -1
  138. package/dist/global.d.ts +26 -0
  139. package/dist/hooks/index.d.ts +1 -0
  140. package/dist/hooks/index.d.ts.map +1 -0
  141. package/dist/hooks/useBemClass.d.ts +1 -0
  142. package/dist/hooks/useBemClass.d.ts.map +1 -0
  143. package/dist/hooks/useNavTabs.d.ts +1 -0
  144. package/dist/hooks/useNavTabs.d.ts.map +1 -0
  145. package/dist/index.d.ts +3 -2
  146. package/dist/index.d.ts.map +1 -0
  147. package/dist/index.es.js +327 -321
  148. package/dist/index.es.js.map +1 -1
  149. package/dist/index.umd.js +1 -1
  150. package/dist/index.umd.js.map +1 -1
  151. package/dist/types/tool.d.ts +1 -0
  152. package/dist/types/tool.d.ts.map +1 -0
  153. package/dist/utils/createSelectDialog.d.ts +1 -0
  154. package/dist/utils/createSelectDialog.d.ts.map +1 -0
  155. package/dist/utils/index.d.ts +1 -0
  156. package/dist/utils/index.d.ts.map +1 -0
  157. package/package.json +10 -8
  158. package/dist/components/card/src/card.vue.d.ts +0 -35
  159. package/dist/components/descriptions/src/descriptions.vue.d.ts +0 -20
  160. package/dist/components/dialog/src/dialog-content.vue.d.ts +0 -9
  161. package/dist/components/dialog/src/dialog.vue.d.ts +0 -43
  162. package/dist/components/dot/src/dot.vue.d.ts +0 -7
  163. package/dist/components/drawer/src/drawer.vue.d.ts +0 -47
  164. package/dist/components/page-layout/src/page-layout.vue.d.ts +0 -21
  165. package/dist/components/plus-tabs/index.d.ts +0 -8
  166. package/dist/components/plus-tabs/src/context.d.ts +0 -26
  167. package/dist/components/plus-tabs/src/plus-tab-pane.vue.d.ts +0 -39
  168. package/dist/components/plus-tabs/src/plus-tabs.vue.d.ts +0 -78
  169. package/dist/components/plus-tabs/src/type.d.ts +0 -5
  170. package/dist/components/tab/index.d.ts +0 -2
  171. package/dist/components/tab/src/context.d.ts +0 -10
  172. package/dist/components/tab/src/tab-item.vue.d.ts +0 -26
  173. package/dist/components/tab/src/tab.vue.d.ts +0 -44
  174. package/dist/components/tab/src/type.d.ts +0 -21
  175. package/dist/components/tab/src/use-nav-tabs.d.ts +0 -2
  176. package/dist/components/tab/src/use-tabs.d.ts +0 -13
  177. package/dist/components/table/src/TableColumn.vue.d.ts +0 -10
  178. package/dist/components/table/src/table.d.ts +0 -4
  179. package/dist/components/table/src/table.vue.d.ts +0 -4
  180. package/dist/components/table-pro/index.d.ts +0 -4
  181. package/dist/components/table-pro/src/table-pro-column-setting.vue.d.ts +0 -13
  182. package/dist/components/table-pro/src/type.d.ts +0 -5
  183. package/dist/components/tree-transfer/src/tree-transfer.vue.d.ts +0 -14436
  184. package/dist/components.d.ts +0 -27
  185. package/packages/components/button/index.ts +0 -5
  186. package/packages/components/button/src/button.vue +0 -60
  187. package/packages/components/button/src/type.ts +0 -15
  188. package/packages/components/card/index.ts +0 -5
  189. package/packages/components/card/src/card.vue +0 -171
  190. package/packages/components/card/src/type.ts +0 -12
  191. package/packages/components/descriptions/index.ts +0 -5
  192. package/packages/components/descriptions/src/descriptions.vue +0 -72
  193. package/packages/components/descriptions/src/type.ts +0 -44
  194. package/packages/components/dialog/index.ts +0 -6
  195. package/packages/components/dialog/src/dialog-content.vue +0 -40
  196. package/packages/components/dialog/src/dialog.ts +0 -131
  197. package/packages/components/dialog/src/dialog.vue +0 -114
  198. package/packages/components/dialog/src/type.ts +0 -16
  199. package/packages/components/dot/index.ts +0 -5
  200. package/packages/components/dot/src/dot.vue +0 -107
  201. package/packages/components/dot/src/type.ts +0 -6
  202. package/packages/components/drawer/index.ts +0 -6
  203. package/packages/components/drawer/src/drawer.ts +0 -84
  204. package/packages/components/drawer/src/drawer.vue +0 -114
  205. package/packages/components/drawer/src/type.ts +0 -15
  206. package/packages/components/edit-table/index.ts +0 -5
  207. package/packages/components/edit-table/src/edit-table.vue +0 -201
  208. package/packages/components/edit-table/src/type.ts +0 -51
  209. package/packages/components/flex/index.ts +0 -5
  210. package/packages/components/flex/src/flex.vue +0 -95
  211. package/packages/components/flex/src/type.ts +0 -18
  212. package/packages/components/form/index.ts +0 -5
  213. package/packages/components/form/src/form.vue +0 -424
  214. package/packages/components/form/src/type.ts +0 -85
  215. package/packages/components/grid/index.ts +0 -8
  216. package/packages/components/grid/src/context.ts +0 -30
  217. package/packages/components/grid/src/grid-item.vue +0 -143
  218. package/packages/components/grid/src/grid.vue +0 -151
  219. package/packages/components/grid/src/hook/use-index.ts +0 -63
  220. package/packages/components/grid/src/hook/use-responsive-state.ts +0 -66
  221. package/packages/components/grid/src/hook/use-responsive-value.ts +0 -36
  222. package/packages/components/grid/src/interface.ts +0 -74
  223. package/packages/components/grid/src/type.ts +0 -0
  224. package/packages/components/grid/src/utils/global-config.ts +0 -6
  225. package/packages/components/grid/src/utils/index.ts +0 -73
  226. package/packages/components/grid/src/utils/is.ts +0 -9
  227. package/packages/components/grid/src/utils/responsive-observe.ts +0 -135
  228. package/packages/components/input-group/index.ts +0 -5
  229. package/packages/components/input-group/src/input-group.vue +0 -79
  230. package/packages/components/input-group/src/type.ts +0 -1
  231. package/packages/components/input-search/index.ts +0 -5
  232. package/packages/components/input-search/src/input-search.vue +0 -48
  233. package/packages/components/input-search/src/type.ts +0 -6
  234. package/packages/components/nav-tabs/index.ts +0 -8
  235. package/packages/components/nav-tabs/src/nav-tabs.vue +0 -235
  236. package/packages/components/nav-tabs/src/type.ts +0 -24
  237. package/packages/components/page-layout/index.ts +0 -5
  238. package/packages/components/page-layout/src/page-layout.vue +0 -203
  239. package/packages/components/page-layout/src/split-button.vue +0 -107
  240. package/packages/components/page-layout/src/type.ts +0 -16
  241. package/packages/components/page-layout/src/useAutoCollapse.ts +0 -88
  242. package/packages/components/table/index.ts +0 -5
  243. package/packages/components/table/src/TableColumn.vue +0 -43
  244. package/packages/components/table/src/table.vue +0 -89
  245. package/packages/components/table/src/type.ts +0 -24
  246. package/packages/components/tabs/index.ts +0 -5
  247. package/packages/components/tabs/src/tabs.vue +0 -139
  248. package/packages/components/tabs/src/type.ts +0 -15
  249. package/packages/components/tag/index.ts +0 -5
  250. package/packages/components/tag/src/tag.vue +0 -355
  251. package/packages/components/tag/src/type.ts +0 -38
  252. package/packages/components/tree-transfer/index.ts +0 -5
  253. package/packages/components/tree-transfer/src/tree-transfer.vue +0 -225
  254. package/packages/components/tree-transfer/src/type.ts +0 -7
  255. package/packages/components/tree-transfer/src/utils.ts +0 -23
  256. package/packages/components.d.ts +0 -34
  257. package/packages/hooks/index.ts +0 -2
  258. package/packages/hooks/useBemClass.ts +0 -11
  259. package/packages/hooks/useNavTabs.ts +0 -497
  260. package/packages/index.ts +0 -118
  261. package/packages/styles/el.scss +0 -90
  262. package/packages/styles/index.scss +0 -141
  263. package/packages/styles/var.scss +0 -1
  264. package/packages/types/global.d.ts +0 -7
  265. package/packages/types/tool.ts +0 -14
  266. package/packages/utils/createSelectDialog.ts +0 -74
  267. package/packages/utils/index.ts +0 -1
@@ -1,51 +0,0 @@
1
- import type * as El from 'element-plus'
2
- import type { MergeMultiple } from '../../../types/tool'
3
- import type { InputSearchInstance } from '../../input-search'
4
-
5
- export type EditTableColumnItemType
6
- = | 'input'
7
- | 'textarea'
8
- | 'input-number'
9
- | 'input-tag'
10
- | 'select'
11
- | 'select-v2'
12
- | 'tree-select'
13
- | 'cascader'
14
- | 'slider'
15
- | 'switch'
16
- | 'rate'
17
- | 'checkbox-group'
18
- | 'checkbox'
19
- | 'radio-group'
20
- | 'radio'
21
- | 'date-picker'
22
- | 'time-picker'
23
- | 'time-select'
24
- | 'color-picker'
25
- | 'transfer'
26
- | 'autocomplete'
27
- | 'upload'
28
- | 'slot'
29
- | 'input-search'
30
-
31
- export interface EditTableColumnItem {
32
- type?: EditTableColumnItemType
33
- label: string
34
- prop: string
35
- width?: number | string
36
- required?: boolean
37
- rules?: El.FormItemRule[] // 表单校验规则
38
- componentProps?: EditTableColumnItemProps
39
- columnProps?: El.TableColumnInstance['$props']
40
- formItemProps?: El.FormItemProps
41
- slotName?: string
42
- }
43
-
44
- export type EditTableColumnItemProps = MergeMultiple<[El.InputProps, El.InputNumberProps, El.InputTagProps, El.SelectProps, El.SelectV2Props, El.TreeInstance['$props'], El.CascaderProps, El.SliderProps, El.SwitchProps, El.RateProps, El.CheckboxGroupProps, El.CheckboxProps, El.RadioGroupProps, El.RadioProps, El.DatePickerProps, El.TimePickerDefaultProps, El.TimeSelectProps, El.ColorPickerProps, El.TransferProps, El.AutocompleteProps, El.UploadProps, InputSearchInstance['$props']]>
45
-
46
- export interface EditTableProps {
47
- rowKey?: string
48
- data?: any[]
49
- columns?: EditTableColumnItem[]
50
- cellDisabled?: any
51
- }
@@ -1,5 +0,0 @@
1
- import Flex from './src/flex.vue'
2
-
3
- export type FlexInstance = InstanceType<typeof Flex>
4
- export * from './src/type'
5
- export default Flex
@@ -1,95 +0,0 @@
1
- <template>
2
- <div :class="classNames" :style="style">
3
- <slot />
4
- </div>
5
- </template>
6
-
7
- <script setup lang="ts">
8
- import type { CSSProperties } from 'vue'
9
- import type { FlexProps } from './type'
10
- import { computed } from 'vue'
11
- import { useBemClass } from '../../../hooks'
12
-
13
- const props = withDefaults(defineProps<FlexProps>(), {
14
- vertical: false,
15
- wrap: false,
16
- justify: 'normal',
17
- align: 'normal',
18
- flex: 'normal',
19
- full: false
20
- })
21
-
22
- const { b } = useBemClass()
23
-
24
- const classNames = computed(() => {
25
- const arr: string[] = [b('flex'), b(`flex__size--${props.gap}`)]
26
- if (props.full) {
27
- arr.push(b('flex--full'))
28
- }
29
- return arr
30
- })
31
-
32
- const SIZE_MAP = ['small', 'middle', 'large']
33
-
34
- const resolvedGap = computed(() => {
35
- if (props.gap === undefined || props.gap === null || props.gap === '' || SIZE_MAP.includes(props.gap as string))
36
- return undefined
37
- if (typeof props.gap === 'number')
38
- return `${props.gap}px`
39
- return String(props.gap)
40
- })
41
-
42
- const resolvedWrap = computed(() => {
43
- if (typeof props.wrap === 'boolean')
44
- return props.wrap ? 'wrap' : 'nowrap'
45
- // 模板中写 wrap 无值时 Vue 传空字符串,视为开启换行
46
- if (props.wrap === '')
47
- return 'wrap'
48
- return props.wrap
49
- })
50
-
51
- const style = computed<CSSProperties>(() => {
52
- const obj: CSSProperties = {
53
- display: 'flex',
54
- flexDirection: props.column || props.vertical ? 'column' : 'row',
55
- flexWrap: resolvedWrap.value,
56
- justifyContent: props.justify,
57
- alignItems: props.align
58
- }
59
- if (props.flex !== 'normal') {
60
- obj.flex = props.flex
61
- }
62
- if (resolvedGap.value) {
63
- obj.gap = resolvedGap.value
64
- }
65
- return obj
66
- })
67
- </script>
68
-
69
- <style scoped lang="scss">
70
- @use '../../../styles/var.scss' as a;
71
-
72
- :deep(.el-button+.el-button) {
73
- margin-left: 0;
74
- }
75
-
76
- .#{a.$prefix}-flex {
77
- &--full {
78
- width: 100%;
79
- height: 100%;
80
- overflow: hidden;
81
- }
82
-
83
- &__size--small {
84
- gap: 8px;
85
- }
86
-
87
- &__size--middle {
88
- gap: 12px;
89
- }
90
-
91
- &__size--large {
92
- gap: 16px;
93
- }
94
- }
95
- </style>
@@ -1,18 +0,0 @@
1
- export interface FlexProps {
2
- /** Flex 主轴的方向是否垂直,使用 flex-direction: column */
3
- column?: boolean
4
- /** 与 column 同义,保留用于兼容旧版 API */
5
- vertical?: boolean
6
- /** 设置元素单行显示还是多行显示,参考 flex-wrap;支持布尔值,true 为 wrap,false 为 nowrap */
7
- wrap?: 'nowrap' | 'wrap' | 'wrap-reverse' | boolean | ''
8
- /** 设置元素在主轴方向上的对齐方式,参考 justify-content */
9
- justify?: 'normal' | 'start' | 'end' | 'flex-start' | 'flex-end' | 'center' | 'space-between' | 'space-around' | 'space-evenly'
10
- /** 设置元素在交叉轴方向上的对齐方式,参考 align-items */
11
- align?: 'normal' | 'start' | 'end' | 'flex-start' | 'flex-end' | 'center' | 'stretch' | 'baseline'
12
- /** flex CSS 简写属性 */
13
- flex?: string
14
- /** 设置网格之间的间隙,可选预设 small / middle / large 或 string / number */
15
- gap?: 'small' | 'middle' | 'large' | string | number
16
- /** 是否撑满父容器宽高 */
17
- full?: boolean
18
- }
@@ -1,5 +0,0 @@
1
- import Form from './src/form.vue'
2
-
3
- export type FormInstance = InstanceType<typeof Form>
4
- export * from './src/type'
5
- export default Form
@@ -1,424 +0,0 @@
1
- <template>
2
- <ElForm ref="formRef" :class="getClass" v-bind="formProps" :model="props.modelValue">
3
- <Grid class="w-full" :col-gap="12" v-bind="props.gridProps" :collapsed="collapsed">
4
- <template v-for="(item, index) in props.columns">
5
- <GridItem v-if="item.type === 'title'" :key="`title${index}`" :span="24">
6
- <ElFormItem label-width="0">
7
- <el-alert :class="b('form-item__title')" :title="typeof item.label === 'string' ? item.label : ''"
8
- type="info" :closable="false" />
9
- </ElFormItem>
10
- </GridItem>
11
-
12
- <template v-else>
13
- <GridItem v-if="!isHide(item)" :key="item.field + index" v-bind="item.gridItemProps || props.gridItemProps"
14
- :span="item.span || item.gridItemProps?.span || props?.gridItemProps?.span">
15
- <ElFormItem :key="item.field + index" :prop="item.field" :label="item.label" :rules="getFormItemRules(item)"
16
- v-bind="item.formItemProps">
17
- <template v-if="item?.labelRender" #label>
18
- <component :is="item.labelRender"></component>
19
- </template>
20
- <div v-if="item.type === 'slot'" class="w-full">
21
- <slot :name="item.field" :item="item"></slot>
22
- </div>
23
- <template v-else>
24
- <div :class="b('form-item__content')">
25
- <div :class="b('form-item__component')">
26
- <component :is="CompMap[item.type] || item.type" :disabled="isDisabled(item)" class="w-full"
27
- v-bind="getComponentBindProps(item)" :model-value="props.modelValue[item.fieldName || item.field]"
28
- @update:model-value="updateModelValue($event, item)">
29
- <template v-for="(slotValue, slotKey) in item?.slots || {}" :key="slotKey" #[slotKey]="scope">
30
- <template v-if="typeof slotValue === 'string'">
31
- {{ slotValue }}
32
- </template>
33
- <template v-else-if="slotValue">
34
- <component :is="slotValue(scope)"></component>
35
- </template>
36
- </template>
37
- </component>
38
- <ElText v-if="item.tip" :class="b('form-item__tip')" type="info" size="small">
39
- {{ item.tip }}
40
- </ElText>
41
- </div>
42
- <!-- 额外信息 -->
43
- <div v-if="item.extra" :class="b('form-item__extra')">
44
- <template v-if="typeof item.extra === 'string'">
45
- <ElText type="info" size="small">
46
- {{
47
- item.extra
48
- }}
49
- </ElText>
50
- </template>
51
- <template v-else-if="item.extra">
52
- <component :is="item.extra"></component>
53
- </template>
54
- </div>
55
- </div>
56
- </template>
57
- </ElFormItem>
58
- </GridItem>
59
- </template>
60
- </template>
61
-
62
- <GridItem v-if="props.search" :suffix="props.suffix && props.search" :span="props?.gridItemProps?.span">
63
- <ElSpace :class="b('form__search-btns')">
64
- <ElButton type="primary" @click="emit('search')">
65
- {{ searchText }}
66
- </ElButton>
67
- <ElButton @click="emit('reset')"> 重置 </ElButton>
68
- <ElButton v-if="!props.hideFoldBtn" class="form__fold-btn" type="primary"
69
- :icon="collapsed ? ArrowDown : ArrowUp" text size="small" @click="collapsed = !collapsed">
70
- {{ collapsed ? '展开' : '收起' }}
71
- </ElButton>
72
- </ElSpace>
73
- </GridItem>
74
- </Grid>
75
- </ElForm>
76
- </template>
77
-
78
- <script lang="tsx" setup>
79
- import type { FormInstance } from 'element-plus'
80
- import type { FormColumnItem, FormColumnType, FormProps } from './type'
81
- import { ArrowDown, ArrowUp } from '@element-plus/icons-vue'
82
- import { ElButton, ElForm, ElFormItem, ElMessage, ElSpace, ElText } from 'element-plus'
83
- import * as El from 'element-plus'
84
- import {
85
- computed,
86
- getCurrentInstance,
87
- onMounted,
88
- ref,
89
- toRaw,
90
- useAttrs,
91
- watch
92
- } from 'vue'
93
- import { useBemClass } from '../../../hooks'
94
- import { Grid, GridItem } from '../../grid'
95
- import InputSearch from '../../input-search'
96
-
97
- const props = withDefaults(defineProps<FormProps>(), {
98
- columns: () => [],
99
- labelWidth: 'auto',
100
- scrollToError: true,
101
- showMessage: true,
102
- gridItemProps: () => ({ span: { xs: 24, sm: 24, md: 12 } }), // xs, sm, md, lg, xl, xxl
103
- search: false,
104
- searchText: '查询',
105
- hideFoldBtn: false,
106
- defaultCollapsed: undefined,
107
- suffix: true,
108
- fc: () => ({})
109
- })
110
-
111
- const emit = defineEmits<{
112
- (e: 'update:modelValue', value: any): void
113
- (e: 'search'): void
114
- (e: 'reset'): void
115
- }>()
116
-
117
- const attrs = useAttrs()
118
- const { b } = useBemClass()
119
- const collapsed = ref(props?.defaultCollapsed ?? props.search)
120
- const instance = getCurrentInstance()
121
-
122
- const globalConfig = instance?.appContext.config.globalProperties.$config
123
- const clearable = globalConfig?.clearable ?? false
124
- // 字典数据存储
125
- const dictData = ref<Record<string, any[]>>({})
126
-
127
- /** 组件静态配置 */
128
- const STATIC_PROPS = new Map([
129
- ['input', { clearable, maxlength: 20 }],
130
- [
131
- 'textarea',
132
- { clearable, type: 'textarea', maxlength: 200, showWordLimit: true }
133
- ],
134
- ['input-number', {}],
135
- ['input-tag', { clearable }],
136
- ['select', { clearable }],
137
- ['select-v2', { clearable }],
138
- ['tree-select', { clearable }],
139
- ['cascader', { clearable }],
140
- ['slider', {}],
141
- ['switch', {}],
142
- ['rate', {}],
143
- ['checkbox-group', {}],
144
- ['checkbox', {}],
145
- ['radio-group', {}],
146
- ['radio', {}],
147
- ['date-picker', { clearable }],
148
- ['time-picker', { clearable }],
149
- ['time-select', { clearable }],
150
- ['color-picker', {}],
151
- ['transfer', {}],
152
- ['autocomplete', {}],
153
- ['upload', {}],
154
- ['title', {}]
155
- ])
156
-
157
- /** 占位符文本映射 */
158
- const PLACEHOLDER_MAP = new Map<FormColumnType, (label?: string) => string | undefined>([
159
- ['input', (label) => `请输入${label}`],
160
- ['input-number', (label) => `请输入${label}`],
161
- ['input-tag', (label) => `请输入${label}`],
162
- ['textarea', (label) => `请填写${label}`],
163
- ['select', (label) => `请选择${label}`],
164
- ['select-v2', (label) => `请选择${label}`],
165
- ['tree-select', (label) => `请选择${label}`],
166
- ['cascader', (label) => `请选择${label}`],
167
- ['time-select', (label) => `请选择${label}`],
168
- ['input-search', (label) => `请选择${label}`],
169
- ['date-picker', () => '请选择日期'],
170
- ['time-picker', () => '请选择时间']
171
- ])
172
-
173
- /** 获取字典数据 */
174
- const loadDictData = async () => {
175
- const dictCodes = props.columns
176
- ?.filter((item) => item.dictCode)
177
- .map((item) => item.dictCode!)
178
- .filter((code, index, arr) => arr.indexOf(code) === index) // 去重
179
-
180
- if (!dictCodes?.length) return
181
- if (!globalConfig?.dictRequest) {
182
- ElMessage.error('请配置全局字典请求方法dictRequest')
183
- return
184
- }
185
- try {
186
- // 使用Promise.all并行处理所有字典请求
187
- const dictResponses = await Promise.all(
188
- dictCodes.map((code) =>
189
- globalConfig
190
- .dictRequest(code)
191
- .then((response: any) => ({ code, response }))
192
- .catch((error: any) => {
193
- console.error(`获取字典 ${code} 失败:`, error)
194
- return { code, response: [] }
195
- })
196
- )
197
- )
198
- // 处理所有响应结果
199
- dictResponses.forEach(({ code, response }) => {
200
- dictData.value[code] = response
201
- })
202
- } catch (error) {
203
- console.error('获取字典数据失败:', error)
204
- ElMessage.error('获取字典数据失败')
205
- }
206
- }
207
-
208
- // 组件挂载时获取字典数据
209
- onMounted(() => {
210
- loadDictData()
211
- })
212
-
213
- /** 获取占位文本 */
214
- const getPlaceholder = (item: FormColumnItem): string | undefined => {
215
- if (!item.type) return undefined
216
- const placeholderFn = PLACEHOLDER_MAP.get(item.type)
217
- return placeholderFn ? placeholderFn(item.label) : undefined
218
- }
219
-
220
- /** 组件的默认props配置 */
221
- function getComponentBindProps(item: FormColumnItem) {
222
- // 获取默认配置
223
- const defaultProps: Record<string, any> = { ...(STATIC_PROPS.get(item.type) || {}) }
224
- const placeholder = getPlaceholder(item)
225
- if (placeholder) {
226
- defaultProps.placeholder = placeholder
227
- }
228
- // 日期选择器格式化
229
- if (item.type === 'date-picker') {
230
- defaultProps.valueFormat = item?.props?.type === 'datetime' ? 'YYYY-MM-DD HH:mm:ss' : 'YYYY-MM-DD'
231
- }
232
- // 如果配置了dictCode且存在对应的字典数据,设置options
233
- if (item.dictCode && dictData.value[item.dictCode]) {
234
- defaultProps.options = dictData.value[item.dictCode]
235
- }
236
- // 合并默认配置和自定义配置
237
- return { ...defaultProps, ...(item?.props || {}) }
238
- }
239
-
240
- const formProps = computed(() => {
241
- const {
242
- columns,
243
- gridProps,
244
- gridItemProps,
245
- search,
246
- searchText,
247
- hideFoldBtn,
248
- defaultCollapsed,
249
- modelValue,
250
- fc,
251
- ...restProps
252
- } = props
253
- return { ...attrs, ...restProps }
254
- })
255
-
256
- const getClass = computed(() => {
257
- const arr: string[] = [b('form')]
258
- if (props.search) {
259
- arr.push(b('form--search'))
260
- }
261
- return arr.join(' ')
262
- })
263
-
264
- const CompMap: Record<Exclude<FormColumnType, 'slot'>, any> = {
265
- 'input': El.ElInput,
266
- 'textarea': El.ElInput,
267
- 'input-number': El.ElInputNumber,
268
- 'input-tag': El.ElInputTag,
269
- 'input-search': InputSearch,
270
- 'select': El.ElSelect,
271
- 'select-v2': El.ElSelectV2,
272
- 'tree-select': El.ElTreeSelect,
273
- 'cascader': El.ElCascader,
274
- 'slider': El.ElSlider,
275
- 'switch': El.ElSwitch,
276
- 'rate': El.ElRate,
277
- 'checkbox-group': El.ElCheckboxGroup,
278
- 'checkbox': El.ElCheckbox,
279
- 'radio-group': El.ElRadioGroup,
280
- 'radio': El.ElRadio,
281
- 'date-picker': El.ElDatePicker,
282
- 'time-picker': El.ElTimePicker,
283
- 'time-select': El.ElTimeSelect,
284
- 'color-picker': El.ElColorPicker,
285
- 'transfer': El.ElTransfer,
286
- 'autocomplete': El.ElAutocomplete,
287
- 'upload': El.ElUpload,
288
- 'title': El.ElAlert
289
- }
290
-
291
- const formRef = ref<FormInstance>()
292
-
293
- /** 表单项校验规则 */
294
- function getFormItemRules(item: FormColumnItem) {
295
- const rules = Array.isArray(item.rules) ? item.rules : []
296
- const requiredMessage = `${item.label}为必填项`
297
-
298
- if (item.required) {
299
- return [
300
- { required: true, message: requiredMessage },
301
- ...rules
302
- ]
303
- }
304
- if (props.fc?.[item.field]?.required) {
305
- return [
306
- {
307
- required: props.fc[item.field].required,
308
- message: requiredMessage
309
- },
310
- ...rules
311
- ]
312
- }
313
- return item.rules
314
- }
315
-
316
- /** 隐藏表单项 */
317
- function isHide(item: FormColumnItem): boolean {
318
- if (typeof item.hide === 'boolean') return item.hide
319
- if (typeof item.hide === 'function') {
320
- return item.hide(props.modelValue)
321
- }
322
- if (props.fc?.[item.field]?.hidden) return true
323
- return false
324
- }
325
-
326
- /** 禁用表单项 */
327
- function isDisabled(item: FormColumnItem) {
328
- if (item?.props?.disabled !== undefined) return item?.props?.disabled
329
- if (props.fc?.[item.field]?.disabled === true) return true
330
- return false
331
- }
332
-
333
- /** 表单数据更新 */
334
- function updateModelValue(value: any, item: FormColumnItem) {
335
- emit('update:modelValue', { ...props.modelValue, [item.field]: value })
336
- }
337
-
338
- if (import.meta.env.DEV) {
339
- watch(
340
- () => props.modelValue,
341
- () => {
342
- // eslint-disable-next-line no-console
343
- console.log('form', toRaw(props.modelValue))
344
- },
345
- { deep: true }
346
- )
347
- }
348
-
349
- defineExpose({ formRef })
350
- </script>
351
-
352
- <style lang="scss" scoped>
353
- @use '../../../styles/var.scss' as a;
354
-
355
- .el-form {
356
- width: 100%;
357
- }
358
-
359
- :deep(.el-form-item) {
360
- align-items: center;
361
-
362
- .el-form-item__label {
363
- height: inherit;
364
- line-height: inherit;
365
- }
366
- }
367
-
368
- :deep(.hide-label) {
369
-
370
- // 隐藏el-form-item__label才能完整占满插槽宽度
371
- .el-form-item__label {
372
- display: none;
373
- }
374
- }
375
-
376
- .#{a.$prefix}-form {
377
- &-item {
378
- &__content {
379
- width: 100%;
380
- display: flex;
381
- }
382
-
383
- &__component {
384
- flex: 1;
385
- }
386
-
387
- &__tip {
388
- line-height: 1.5;
389
- color: var(--el-color-info-light-3);
390
- }
391
-
392
- &__extra {
393
- margin-left: 6px;
394
- }
395
- }
396
-
397
- &__search-btns {
398
- margin-bottom: 8px;
399
- }
400
- }
401
-
402
- .#{a.$prefix}-form--search {
403
- :deep(.el-form-item) {
404
- margin-bottom: 8px;
405
- }
406
- }
407
-
408
- :deep(.w-full) {
409
- width: 100%;
410
-
411
- .el-date-editor {
412
- width: 100%;
413
- }
414
- }
415
-
416
- :deep(.#{a.$prefix}-form-item__title) {
417
- border-radius: 0;
418
-
419
- .el-alert__title {
420
- color: var(--el-text-color-primary);
421
- font-weight: 600;
422
- }
423
- }
424
- </style>
@@ -1,85 +0,0 @@
1
- import type * as El from 'element-plus'
2
- import type { FormProps as ElFormProps } from 'element-plus'
3
- import type { VNode } from 'vue'
4
- import type { MergeMultiple } from '../../../types/tool'
5
- import type { GridItemProps, GridProps } from '../../grid/src/interface'
6
- import type { InputSearchInstance } from '../../input-search'
7
-
8
- export type FormColumnType
9
- = | 'input'
10
- | 'textarea'
11
- | 'input-number'
12
- | 'input-tag'
13
- | 'input-search'
14
- | 'select'
15
- | 'select-v2'
16
- | 'tree-select'
17
- | 'cascader'
18
- | 'slider'
19
- | 'switch'
20
- | 'rate'
21
- | 'checkbox-group'
22
- | 'checkbox'
23
- | 'radio-group'
24
- | 'radio'
25
- | 'date-picker'
26
- | 'time-picker'
27
- | 'time-select'
28
- | 'color-picker'
29
- | 'transfer'
30
- | 'autocomplete'
31
- | 'upload'
32
- | 'title'
33
- | 'slot'
34
-
35
- /**
36
- * 表单列属性类型,根据组件类型使用对应的属性类型
37
- */
38
- export type FormColumnProps = MergeMultiple<[El.InputProps, El.InputNumberProps, El.InputTagProps, El.SelectProps, El.SelectV2Props, El.TreeInstance['$props'], El.CascaderProps, El.SliderProps, El.SwitchProps, El.RateProps, El.CheckboxGroupProps, El.CheckboxProps, El.RadioGroupProps, El.RadioProps, El.DatePickerProps, El.TimePickerDefaultProps, El.TimeSelectProps, El.ColorPickerProps, El.TransferProps, El.AutocompleteProps, El.UploadProps, InputSearchInstance['$props']]>
39
-
40
- export type FormColumnItemHide<F> = boolean | ((form: F) => boolean)
41
-
42
- /**
43
- * 表单列插槽类型,根据组件类型使用对应的插槽类型
44
- */
45
- export type FormColumnSlots = Partial<
46
- El.InputInstance['$slots']
47
- | El.InputNumberInstance['$slots']
48
- | El.InputTagInstance['$slots']
49
- | El.AutocompleteInstance['$slots']
50
- | El.CascaderInstance['$slots']
51
- | El.DatePickerInstance['$slots']
52
- >
53
-
54
- export interface FormColumnItem<F = any> {
55
- type: FormColumnType
56
- label?: string
57
- labelRender?: () => VNode
58
- field: string
59
- fieldName?: string
60
- span?: number | GridItemProps['span']
61
- props?: FormColumnProps
62
- formItemProps?: El.FormItemProps
63
- gridItemProps?: any
64
- required?: boolean
65
- rules?: El.FormItemRule[]
66
- hide?: FormColumnItemHide<F> // 是否隐藏
67
- tip?: string
68
- dictCode?: string // 字典编码
69
- slotName?: string
70
- slots?: FormColumnSlots
71
- extra?: string | (() => VNode) // 右侧额外内容
72
- }
73
-
74
- export interface FormProps extends Partial<ElFormProps> {
75
- modelValue: any
76
- columns?: FormColumnItem[]
77
- fc?: Record<string, { disabled?: boolean, hidden?: boolean, required?: boolean }> // 表单控制
78
- gridProps?: GridProps // grid默认配置
79
- gridItemProps?: GridItemProps // grid-item默认配置
80
- search?: boolean
81
- searchText?: string
82
- hideFoldBtn?: boolean
83
- defaultCollapsed?: boolean | undefined
84
- suffix?: boolean
85
- }
@@ -1,8 +0,0 @@
1
- import GridItem from './src/grid-item.vue'
2
- import Grid from './src/grid.vue'
3
-
4
- export type GridInstance = InstanceType<typeof Grid>
5
- export type GridItemInstance = InstanceType<typeof GridItem>
6
- export * from './src/interface'
7
-
8
- export { Grid, GridItem }