ff-ui-plus 2.0.7

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 (319) hide show
  1. package/.nvmrc +1 -0
  2. package/.prettierrc.cjs +41 -0
  3. package/.stylelintignore +5 -0
  4. package/LICENSE +21 -0
  5. package/README.md +265 -0
  6. package/commitlint.config.cjs +162 -0
  7. package/global.d.ts +27 -0
  8. package/index.html +16 -0
  9. package/lib.sh +9 -0
  10. package/lint-staged.config.cjs +8 -0
  11. package/package.json +149 -0
  12. package/packages/components/adaptive-page/index.ts +5 -0
  13. package/packages/components/adaptive-page/src/index.vue +85 -0
  14. package/packages/components/adaptive-page/src/type.ts +9 -0
  15. package/packages/components/adaptive-page/style/css.ts +1 -0
  16. package/packages/components/adaptive-page/style/index.ts +1 -0
  17. package/packages/components/button/index.ts +5 -0
  18. package/packages/components/button/src/index.vue +41 -0
  19. package/packages/components/button/src/type.ts +11 -0
  20. package/packages/components/button/style/css.ts +1 -0
  21. package/packages/components/button/style/index.ts +1 -0
  22. package/packages/components/chart/index.ts +5 -0
  23. package/packages/components/chart/src/index.vue +121 -0
  24. package/packages/components/chart/src/type.ts +7 -0
  25. package/packages/components/chart/style/css.ts +1 -0
  26. package/packages/components/chart/style/index.ts +1 -0
  27. package/packages/components/checkbox/index.ts +3 -0
  28. package/packages/components/checkbox/src/checkbox.d.ts +5 -0
  29. package/packages/components/checkbox/src/index.vue +67 -0
  30. package/packages/components/checkbox/style/css.ts +1 -0
  31. package/packages/components/checkbox/style/index.ts +1 -0
  32. package/packages/components/date-picker/index.ts +5 -0
  33. package/packages/components/date-picker/src/index.vue +228 -0
  34. package/packages/components/date-picker/src/type.ts +22 -0
  35. package/packages/components/date-picker/style/css.ts +1 -0
  36. package/packages/components/date-picker/style/index.ts +1 -0
  37. package/packages/components/detail/index.ts +5 -0
  38. package/packages/components/detail/src/index.vue +102 -0
  39. package/packages/components/detail/src/renderLabel.vue +15 -0
  40. package/packages/components/detail/src/renderTooltip.vue +15 -0
  41. package/packages/components/detail/src/type.ts +28 -0
  42. package/packages/components/detail/style/css.ts +1 -0
  43. package/packages/components/detail/style/index.ts +1 -0
  44. package/packages/components/form/index.ts +5 -0
  45. package/packages/components/form/src/index.vue +407 -0
  46. package/packages/components/form/src/renderBtn.vue +15 -0
  47. package/packages/components/form/src/renderComp.vue +15 -0
  48. package/packages/components/form/src/type.ts +26 -0
  49. package/packages/components/form/style/css.ts +1 -0
  50. package/packages/components/form/style/index.ts +1 -0
  51. package/packages/components/index.ts +20 -0
  52. package/packages/components/input/index.ts +5 -0
  53. package/packages/components/input/src/index.vue +225 -0
  54. package/packages/components/input/src/type.ts +14 -0
  55. package/packages/components/input/style/css.ts +1 -0
  56. package/packages/components/input/style/index.ts +1 -0
  57. package/packages/components/layout-page/index.ts +4 -0
  58. package/packages/components/layout-page/src/index.vue +74 -0
  59. package/packages/components/layout-page/style/css.ts +1 -0
  60. package/packages/components/layout-page/style/index.ts +1 -0
  61. package/packages/components/layout-page-item/index.ts +3 -0
  62. package/packages/components/layout-page-item/src/index.vue +16 -0
  63. package/packages/components/layout-page-item/style/css.ts +1 -0
  64. package/packages/components/layout-page-item/style/index.ts +1 -0
  65. package/packages/components/module-form/index.ts +4 -0
  66. package/packages/components/module-form/src/index.vue +243 -0
  67. package/packages/components/module-form/src/moduleDetail.vue +61 -0
  68. package/packages/components/module-form/src/moduleForm.vue +88 -0
  69. package/packages/components/module-form/src/type.ts +16 -0
  70. package/packages/components/module-form/style/css.ts +1 -0
  71. package/packages/components/module-form/style/index.ts +1 -0
  72. package/packages/components/package.json +9 -0
  73. package/packages/components/query-condition/index.ts +4 -0
  74. package/packages/components/query-condition/src/index.vue +478 -0
  75. package/packages/components/query-condition/src/moreChoose.vue +159 -0
  76. package/packages/components/query-condition/src/renderComp.vue +15 -0
  77. package/packages/components/query-condition/src/type.ts +22 -0
  78. package/packages/components/query-condition/src/useComputed.ts +94 -0
  79. package/packages/components/query-condition/style/css.ts +1 -0
  80. package/packages/components/query-condition/style/index.ts +1 -0
  81. package/packages/components/radio/index.ts +3 -0
  82. package/packages/components/radio/src/index.vue +73 -0
  83. package/packages/components/radio/src/radio.d.ts +12 -0
  84. package/packages/components/radio/style/css.ts +1 -0
  85. package/packages/components/radio/style/index.ts +1 -0
  86. package/packages/components/select/index.ts +4 -0
  87. package/packages/components/select/src/index.vue +240 -0
  88. package/packages/components/select/src/type.ts +43 -0
  89. package/packages/components/select/style/css.ts +1 -0
  90. package/packages/components/select/style/index.ts +1 -0
  91. package/packages/components/select-icon/index.ts +4 -0
  92. package/packages/components/select-icon/src/index.vue +128 -0
  93. package/packages/components/select-icon/style/css.ts +1 -0
  94. package/packages/components/select-icon/style/index.ts +1 -0
  95. package/packages/components/select-table/index.ts +4 -0
  96. package/packages/components/select-table/src/ClickOutside.ts +106 -0
  97. package/packages/components/select-table/src/index.vue +851 -0
  98. package/packages/components/select-table/src/renderCol.vue +20 -0
  99. package/packages/components/select-table/src/type.ts +56 -0
  100. package/packages/components/select-table/src/useVirtualized.ts +86 -0
  101. package/packages/components/select-table/style/css.ts +1 -0
  102. package/packages/components/select-table/style/index.ts +1 -0
  103. package/packages/components/step-wizard/index.ts +4 -0
  104. package/packages/components/step-wizard/src/index.vue +99 -0
  105. package/packages/components/step-wizard/src/type.ts +17 -0
  106. package/packages/components/step-wizard/style/css.ts +1 -0
  107. package/packages/components/step-wizard/style/index.ts +1 -0
  108. package/packages/components/table/index.ts +5 -0
  109. package/packages/components/table/src/ColumnSet.vue +176 -0
  110. package/packages/components/table/src/TTableColumn.vue +100 -0
  111. package/packages/components/table/src/densitySet.vue +91 -0
  112. package/packages/components/table/src/firstColumn.vue +132 -0
  113. package/packages/components/table/src/index.vue +926 -0
  114. package/packages/components/table/src/operator.vue +246 -0
  115. package/packages/components/table/src/renderCol.vue +20 -0
  116. package/packages/components/table/src/renderHeader.vue +18 -0
  117. package/packages/components/table/src/singleEdit.vue +354 -0
  118. package/packages/components/table/src/singleEditCell.vue +303 -0
  119. package/packages/components/table/src/tableProps.ts +162 -0
  120. package/packages/components/table/src/useExpose.ts +74 -0
  121. package/packages/components/table/src/useVirtualized.ts +70 -0
  122. package/packages/components/table/style/css.ts +1 -0
  123. package/packages/components/table/style/index.ts +1 -0
  124. package/packages/components/tabs/index.ts +4 -0
  125. package/packages/components/tabs/src/index.vue +50 -0
  126. package/packages/components/tabs/style/css.ts +1 -0
  127. package/packages/components/tabs/style/index.ts +1 -0
  128. package/packages/components/timer-btn/index.ts +4 -0
  129. package/packages/components/timer-btn/src/index.vue +57 -0
  130. package/packages/components/timer-btn/style/css.ts +1 -0
  131. package/packages/components/timer-btn/style/index.ts +1 -0
  132. package/packages/components/utils/index.ts +142 -0
  133. package/packages/components/utils/install.ts +16 -0
  134. package/packages/eslint-config/build.config.ts +16 -0
  135. package/packages/eslint-config/dist/index.cjs +122 -0
  136. package/packages/eslint-config/dist/index.d.cts +92 -0
  137. package/packages/eslint-config/dist/index.d.mts +92 -0
  138. package/packages/eslint-config/dist/index.d.ts +92 -0
  139. package/packages/eslint-config/dist/index.mjs +120 -0
  140. package/packages/eslint-config/package.json +34 -0
  141. package/packages/eslint-config/src/index.ts +121 -0
  142. package/packages/ff-ui-plus/component.ts +55 -0
  143. package/packages/ff-ui-plus/defaults.ts +4 -0
  144. package/packages/ff-ui-plus/index.ts +9 -0
  145. package/packages/ff-ui-plus/make-installer.ts +10 -0
  146. package/packages/ff-ui-plus/package.json +117 -0
  147. package/packages/ff-ui-plus/version.ts +1 -0
  148. package/packages/hooks/index.ts +1 -0
  149. package/packages/hooks/package.json +9 -0
  150. package/packages/hooks/useLocale.ts +53 -0
  151. package/packages/locale/index.ts +11 -0
  152. package/packages/locale/lang/en.ts +157 -0
  153. package/packages/locale/lang/zh-cn.ts +155 -0
  154. package/packages/locale/package.json +12 -0
  155. package/packages/resolver/package.json +23 -0
  156. package/packages/resolver/src/index.ts +99 -0
  157. package/packages/theme-chalk/build.ts +76 -0
  158. package/packages/theme-chalk/dist/index.css +1 -0
  159. package/packages/theme-chalk/dist/src/adaptive-page.scss +48 -0
  160. package/packages/theme-chalk/dist/src/button.scss +23 -0
  161. package/packages/theme-chalk/dist/src/chart.scss +10 -0
  162. package/packages/theme-chalk/dist/src/checkbox.scss +0 -0
  163. package/packages/theme-chalk/dist/src/date-picker.scss +3 -0
  164. package/packages/theme-chalk/dist/src/detail.scss +7 -0
  165. package/packages/theme-chalk/dist/src/form.scss +104 -0
  166. package/packages/theme-chalk/dist/src/index.scss +19 -0
  167. package/packages/theme-chalk/dist/src/input.scss +0 -0
  168. package/packages/theme-chalk/dist/src/layout-page-item.scss +10 -0
  169. package/packages/theme-chalk/dist/src/layout-page.scss +37 -0
  170. package/packages/theme-chalk/dist/src/module-form.scss +335 -0
  171. package/packages/theme-chalk/dist/src/query-condition.scss +132 -0
  172. package/packages/theme-chalk/dist/src/radio.scss +0 -0
  173. package/packages/theme-chalk/dist/src/select-icon.scss +61 -0
  174. package/packages/theme-chalk/dist/src/select-table.scss +71 -0
  175. package/packages/theme-chalk/dist/src/select.scss +7 -0
  176. package/packages/theme-chalk/dist/src/step-wizard.scss +51 -0
  177. package/packages/theme-chalk/dist/src/table.scss +381 -0
  178. package/packages/theme-chalk/dist/src/tabs.scss +20 -0
  179. package/packages/theme-chalk/dist/src/timer-btn.scss +21 -0
  180. package/packages/theme-chalk/dist/t-adaptive-page.css +1 -0
  181. package/packages/theme-chalk/dist/t-button.css +1 -0
  182. package/packages/theme-chalk/dist/t-chart.css +1 -0
  183. package/packages/theme-chalk/dist/t-checkbox.css +0 -0
  184. package/packages/theme-chalk/dist/t-date-picker.css +1 -0
  185. package/packages/theme-chalk/dist/t-detail.css +1 -0
  186. package/packages/theme-chalk/dist/t-form.css +1 -0
  187. package/packages/theme-chalk/dist/t-input.css +0 -0
  188. package/packages/theme-chalk/dist/t-layout-page-item.css +1 -0
  189. package/packages/theme-chalk/dist/t-layout-page.css +1 -0
  190. package/packages/theme-chalk/dist/t-module-form.css +1 -0
  191. package/packages/theme-chalk/dist/t-query-condition.css +1 -0
  192. package/packages/theme-chalk/dist/t-radio.css +0 -0
  193. package/packages/theme-chalk/dist/t-select-icon.css +1 -0
  194. package/packages/theme-chalk/dist/t-select-table.css +1 -0
  195. package/packages/theme-chalk/dist/t-select.css +1 -0
  196. package/packages/theme-chalk/dist/t-step-wizard.css +1 -0
  197. package/packages/theme-chalk/dist/t-table.css +1 -0
  198. package/packages/theme-chalk/dist/t-tabs.css +1 -0
  199. package/packages/theme-chalk/dist/t-timer-btn.css +1 -0
  200. package/packages/theme-chalk/mixins/config.scss +8 -0
  201. package/packages/theme-chalk/mixins/function.scss +71 -0
  202. package/packages/theme-chalk/mixins/mixins.scss +79 -0
  203. package/packages/theme-chalk/package.json +21 -0
  204. package/packages/theme-chalk/src/adaptive-page.scss +48 -0
  205. package/packages/theme-chalk/src/button.scss +23 -0
  206. package/packages/theme-chalk/src/chart.scss +10 -0
  207. package/packages/theme-chalk/src/checkbox.scss +0 -0
  208. package/packages/theme-chalk/src/date-picker.scss +3 -0
  209. package/packages/theme-chalk/src/detail.scss +7 -0
  210. package/packages/theme-chalk/src/form.scss +104 -0
  211. package/packages/theme-chalk/src/index.scss +19 -0
  212. package/packages/theme-chalk/src/input.scss +0 -0
  213. package/packages/theme-chalk/src/layout-page-item.scss +10 -0
  214. package/packages/theme-chalk/src/layout-page.scss +37 -0
  215. package/packages/theme-chalk/src/module-form.scss +335 -0
  216. package/packages/theme-chalk/src/query-condition.scss +132 -0
  217. package/packages/theme-chalk/src/radio.scss +0 -0
  218. package/packages/theme-chalk/src/select-icon.scss +61 -0
  219. package/packages/theme-chalk/src/select-table.scss +71 -0
  220. package/packages/theme-chalk/src/select.scss +7 -0
  221. package/packages/theme-chalk/src/step-wizard.scss +51 -0
  222. package/packages/theme-chalk/src/table.scss +381 -0
  223. package/packages/theme-chalk/src/tabs.scss +20 -0
  224. package/packages/theme-chalk/src/timer-btn.scss +21 -0
  225. package/packages/types/global.ts +34 -0
  226. package/packages/types/index.ts +1 -0
  227. package/packages/types/package.json +10 -0
  228. package/packages/utils/build.config.ts +23 -0
  229. package/packages/utils/dist/cookie.cjs +1 -0
  230. package/packages/utils/dist/cookie.d.cts +16 -0
  231. package/packages/utils/dist/cookie.d.mts +16 -0
  232. package/packages/utils/dist/cookie.d.ts +16 -0
  233. package/packages/utils/dist/cookie.mjs +1 -0
  234. package/packages/utils/dist/day.cjs +1 -0
  235. package/packages/utils/dist/day.d.cts +37 -0
  236. package/packages/utils/dist/day.d.mts +37 -0
  237. package/packages/utils/dist/day.d.ts +37 -0
  238. package/packages/utils/dist/day.mjs +1 -0
  239. package/packages/utils/dist/file.cjs +1 -0
  240. package/packages/utils/dist/file.d.cts +61 -0
  241. package/packages/utils/dist/file.d.mts +61 -0
  242. package/packages/utils/dist/file.d.ts +61 -0
  243. package/packages/utils/dist/file.mjs +1 -0
  244. package/packages/utils/dist/index.cjs +1 -0
  245. package/packages/utils/dist/index.d.cts +13 -0
  246. package/packages/utils/dist/index.d.mts +13 -0
  247. package/packages/utils/dist/index.d.ts +13 -0
  248. package/packages/utils/dist/index.mjs +1 -0
  249. package/packages/utils/dist/is.cjs +1 -0
  250. package/packages/utils/dist/is.d.cts +117 -0
  251. package/packages/utils/dist/is.d.mts +117 -0
  252. package/packages/utils/dist/is.d.ts +117 -0
  253. package/packages/utils/dist/is.mjs +1 -0
  254. package/packages/utils/dist/letter.cjs +1 -0
  255. package/packages/utils/dist/letter.d.cts +12 -0
  256. package/packages/utils/dist/letter.d.mts +12 -0
  257. package/packages/utils/dist/letter.d.ts +12 -0
  258. package/packages/utils/dist/letter.mjs +1 -0
  259. package/packages/utils/dist/number.cjs +1 -0
  260. package/packages/utils/dist/number.d.cts +23 -0
  261. package/packages/utils/dist/number.d.mts +23 -0
  262. package/packages/utils/dist/number.d.ts +23 -0
  263. package/packages/utils/dist/number.mjs +1 -0
  264. package/packages/utils/dist/openExe.cjs +1 -0
  265. package/packages/utils/dist/openExe.d.cts +9 -0
  266. package/packages/utils/dist/openExe.d.mts +9 -0
  267. package/packages/utils/dist/openExe.d.ts +9 -0
  268. package/packages/utils/dist/openExe.mjs +1 -0
  269. package/packages/utils/dist/storage.cjs +1 -0
  270. package/packages/utils/dist/storage.d.cts +46 -0
  271. package/packages/utils/dist/storage.d.mts +46 -0
  272. package/packages/utils/dist/storage.d.ts +46 -0
  273. package/packages/utils/dist/storage.mjs +1 -0
  274. package/packages/utils/dist/validate.cjs +1 -0
  275. package/packages/utils/dist/validate.d.cts +32 -0
  276. package/packages/utils/dist/validate.d.mts +32 -0
  277. package/packages/utils/dist/validate.d.ts +32 -0
  278. package/packages/utils/dist/validate.mjs +1 -0
  279. package/packages/utils/dist/ws.cjs +1 -0
  280. package/packages/utils/dist/ws.d.cts +86 -0
  281. package/packages/utils/dist/ws.d.mts +86 -0
  282. package/packages/utils/dist/ws.d.ts +86 -0
  283. package/packages/utils/dist/ws.mjs +1 -0
  284. package/packages/utils/package.json +42 -0
  285. package/packages/utils/src/cookie.ts +24 -0
  286. package/packages/utils/src/day.ts +66 -0
  287. package/packages/utils/src/file.ts +173 -0
  288. package/packages/utils/src/index.ts +10 -0
  289. package/packages/utils/src/is.ts +159 -0
  290. package/packages/utils/src/letter.ts +15 -0
  291. package/packages/utils/src/number.ts +37 -0
  292. package/packages/utils/src/openExe.ts +45 -0
  293. package/packages/utils/src/storage.ts +77 -0
  294. package/packages/utils/src/validate.ts +55 -0
  295. package/packages/utils/src/ws.ts +191 -0
  296. package/pnpm-workspace.yaml +3 -0
  297. package/publish.sh +37 -0
  298. package/resolver.sh +9 -0
  299. package/scripts/build/all.ts +152 -0
  300. package/scripts/build/build.config.ts +10 -0
  301. package/scripts/build/dist/index.cjs +7 -0
  302. package/scripts/build/dist/index.d.ts +2 -0
  303. package/scripts/build/dist/index.mjs +12 -0
  304. package/scripts/build/index.ts +63 -0
  305. package/scripts/build/modules.ts +141 -0
  306. package/scripts/build/package.json +14 -0
  307. package/scripts/release/gen-version.ts +12 -0
  308. package/scripts/release/index.ts +209 -0
  309. package/scripts/utils/excludeFiles.ts +14 -0
  310. package/scripts/utils/index.ts +88 -0
  311. package/scripts/utils/main.ts +14 -0
  312. package/scripts/utils/paths.ts +40 -0
  313. package/scripts/utils/plugin.ts +61 -0
  314. package/tsconfig.base.json +23 -0
  315. package/tsconfig.vitest.json +11 -0
  316. package/tsconfig.web.json +18 -0
  317. package/typings/env.d.ts +22 -0
  318. package/typings/index.d.ts +161 -0
  319. package/vitest.config.ts +22 -0
@@ -0,0 +1,20 @@
1
+ <template>
2
+ <component :is="renderComponent" />
3
+ </template>
4
+ <script lang="ts" setup>
5
+ defineOptions({
6
+ name: "RenderCol"
7
+ })
8
+ const props: any = defineProps({
9
+ row: Object,
10
+ render: Function,
11
+ index: Number,
12
+ column: {
13
+ type: Object,
14
+ default: null
15
+ }
16
+ })
17
+ const renderComponent = () => {
18
+ return props.render(props?.row[props?.column?.prop], props.row, props.index)
19
+ }
20
+ </script>
@@ -0,0 +1,56 @@
1
+ export interface TSelectTableProps {
2
+ modelValue?: any
3
+ inputValue?: any
4
+ defaultSelectVal?: any[]
5
+ radioSelectValLabel?: string
6
+ table: {
7
+ data: any[]
8
+ currentPage: number
9
+ pageSize: number
10
+ total: number
11
+ [key: string]: any
12
+ }
13
+ keywords?: {
14
+ value: any
15
+ label: string
16
+ }
17
+ value?: any
18
+ columns: any[]
19
+ multiple?: boolean
20
+ filterable?: boolean
21
+ remote?: boolean
22
+ remoteMethod?: Function
23
+ filterMethod?: Function
24
+ isShowInput?: boolean
25
+ inputAttr?: Record<string, any>
26
+ inputWidth?: number
27
+ selectWidth?: number
28
+ tableWidth?: number
29
+ isShowQuery?: boolean
30
+ isShowBlurBtn?: boolean
31
+ btnBind?: Record<string, any>
32
+ align?: "left" | "center" | "right"
33
+ reserveSelection?: boolean
34
+ selectable?: Function
35
+ multipleFixed?: string | boolean
36
+ radioTxt?: string
37
+ radioFixed?: string | boolean
38
+ tableSize?: "" | "large" | "default" | "small"
39
+ border?: boolean
40
+ isShowFirstColumn?: boolean
41
+ useVirtual?: boolean
42
+ virtualShowSize?: number
43
+ isShowPagination?: boolean
44
+ paginationSize?: "" | "large" | "default" | "small"
45
+ selfExpanded?: boolean
46
+ isClearQuery?: boolean
47
+ isRadioEchoLabel?: boolean
48
+ defaultValIsOpenRadioChange?: boolean
49
+ radioSameIsCancel?: boolean
50
+ rowClickRadio?: boolean
51
+ isKeyup?: boolean
52
+ isExpanded?: boolean
53
+ multipleDisableDelete?: boolean
54
+ tableLoading?: boolean
55
+ loadingTxt?: string
56
+ }
@@ -0,0 +1,86 @@
1
+ import { nextTick, ref } from "vue"
2
+ import type { Ref } from "vue"
3
+ export function useVirtualized() {
4
+ // 渲染实际高度的容器
5
+ const actualHeightContainerEl = ref<HTMLElement | any>(null)
6
+ // 用于偏移的元素选择器
7
+ const translateContainerEl = ref<HTMLElement | any>(null)
8
+ // 滚动容器的元素选择器
9
+ const scrollContainerEl = ref<HTMLElement | any>(null)
10
+ const isMultiple = ref<boolean>(false)
11
+ // 所有数据
12
+ const saveDATA: Ref<any[]> = ref([])
13
+ // 缓存已渲染元素的高度
14
+ const RenderedItemsCache: any = {}
15
+ // 获取dom元素
16
+ const getDom = (props: { multiple: boolean }) => {
17
+ const getElements = (className: string) => {
18
+ actualHeightContainerEl.value = document.querySelector(`${className} .el-scrollbar__view`)
19
+ translateContainerEl.value = document.querySelector(`${className} .el-table__body`)
20
+ scrollContainerEl.value = document.querySelector(`${className} .el-scrollbar__wrap`)
21
+ }
22
+ isMultiple.value = props.multiple
23
+ if (props.multiple) {
24
+ getElements(".t_select_table_multiple")
25
+ } else {
26
+ getElements(".t_select_table_radio")
27
+ }
28
+ // console.log('actualHeightContainerEl.value', actualHeightContainerEl.value)
29
+ // console.log('translateContainerEl.value', translateContainerEl.value)
30
+ // console.log('scrollContainerEl.value', scrollContainerEl.value)
31
+ }
32
+ // 获取缓存高度,无缓存,取配置项的 itemHeight
33
+ const getItemHeightFromCache = (index: number | string) => {
34
+ const val = RenderedItemsCache[index]
35
+ return val === void 0 ? 50 : val
36
+ }
37
+ // 更新实际高度
38
+ const updateActualHeight = () => {
39
+ let actualHeight = 0
40
+ saveDATA.value.forEach((_, i) => {
41
+ actualHeight += getItemHeightFromCache(i)
42
+ })
43
+ // if (actualHeightContainerEl.value && actualHeightContainerEl.value.style) {
44
+ actualHeightContainerEl.value!.style.height = actualHeight + "px"
45
+ // }
46
+ }
47
+ // 更新偏移值
48
+ const updateOffset = (offset: number) => {
49
+ if (translateContainerEl.value && translateContainerEl.value.style) {
50
+ translateContainerEl.value!.style.transform = `translateY(${offset}px)`
51
+ }
52
+ }
53
+ // 更新已渲染列表项的缓存高度
54
+ const updateRenderedItemCache = (index: number) => {
55
+ // 当所有元素的实际高度更新完毕,就不需要重新计算高度
56
+ const shouldUpdate = Object.keys(RenderedItemsCache).length < saveDATA.value.length
57
+ if (!shouldUpdate) return
58
+ nextTick(() => {
59
+ // 获取所有列表项元素
60
+ const Items: HTMLElement[] = Array.from(
61
+ document.querySelectorAll(
62
+ `${
63
+ isMultiple.value ? `.t_select_table_multiple` : `.t_select_table_radio`
64
+ } .el-table__row`
65
+ )
66
+ )
67
+ // 进行缓存
68
+ Items.forEach(el => {
69
+ if (!RenderedItemsCache[index]) {
70
+ RenderedItemsCache[index] = el.offsetHeight
71
+ }
72
+ index++
73
+ })
74
+ // 更新实际高度
75
+ updateActualHeight()
76
+ })
77
+ }
78
+ return {
79
+ scrollContainerEl,
80
+ updateRenderedItemCache,
81
+ updateOffset,
82
+ getDom,
83
+ getItemHeightFromCache,
84
+ saveDATA
85
+ }
86
+ }
@@ -0,0 +1 @@
1
+ import "@ff-ui-plus/theme-chalk/t-select-table.css"
@@ -0,0 +1 @@
1
+ import "@ff-ui-plus/theme-chalk/src/select-table.scss"
@@ -0,0 +1,4 @@
1
+ import StepWizard from "./src/index.vue"
2
+ export * from "./src/type"
3
+
4
+ export const TStepWizard = StepWizard
@@ -0,0 +1,99 @@
1
+ <template>
2
+ <div class="t_step-wizard">
3
+ <el-steps :active="active" finish-status="success" v-bind="$attrs">
4
+ <el-step
5
+ v-bind="$attrs"
6
+ v-for="(item, index) in stepData"
7
+ :key="index"
8
+ :title="`${index + 1} ${item.title}`"
9
+ :icon="item.icon ? item.icon : ''"
10
+ :description="item.description ? item.description : ''"
11
+ >
12
+ <template v-for="(_index, name) in slots" v-slot:[name]="data">
13
+ <slot :name="name" v-bind="data" />
14
+ </template>
15
+ </el-step>
16
+ </el-steps>
17
+ <div class="content-step-main step-content">
18
+ <div
19
+ class="step-first flex-box flex-col flex-ver-h"
20
+ v-for="(val, key) in stepContent()"
21
+ :key="key"
22
+ v-show="active === key"
23
+ >
24
+ <template v-if="val.slotName">
25
+ <slot :name="val.slotName"></slot>
26
+ </template>
27
+ <div class="step_btn">
28
+ <el-button
29
+ v-for="(val1, key1) in val.btnArr"
30
+ :key="key1"
31
+ :type="val1.type || 'danger'"
32
+ @click="val1.fn(val1)"
33
+ :disabled="val.disable || false"
34
+ >{{ val1.btnTitle }}</el-button
35
+ >
36
+ </div>
37
+ </div>
38
+ <div
39
+ class="step-last flex-box flex-col flex-ver"
40
+ v-if="active === stepData.length && isShowLastSuccess"
41
+ >
42
+ <div class="icon-success">
43
+ <el-icon>
44
+ <CircleCheck />
45
+ </el-icon>
46
+ </div>
47
+ <h2 class="success-margin" v-html="successTitle"></h2>
48
+ <div class="step_btn">
49
+ <el-button
50
+ v-if="!stepData[stepData.length - 1].lastBtnArr"
51
+ type="danger"
52
+ @click="complete"
53
+ >{{ lastBtnTitleText }}</el-button
54
+ >
55
+ <el-button
56
+ v-else
57
+ v-for="(item, key) in stepData[stepData.length - 1].lastBtnArr"
58
+ :key="key"
59
+ :type="item.type || 'danger'"
60
+ @click="item.fn(item)"
61
+ :disabled="item.disable || false"
62
+ >{{ item.btnTitle }}</el-button
63
+ >
64
+ </div>
65
+ </div>
66
+ </div>
67
+ </div>
68
+ </template>
69
+
70
+ <script setup lang="ts">
71
+ import { useSlots, computed } from "vue"
72
+ import { CircleCheck } from "@element-plus/icons-vue"
73
+ import type { TStepWizardProps } from "./type"
74
+ import { useLocale } from "@ff-ui-plus/hooks"
75
+ const { t } = useLocale()
76
+ defineOptions({
77
+ name: "TStepWizard"
78
+ })
79
+
80
+ const props = withDefaults(defineProps<TStepWizardProps>(), {
81
+ stepData: () => [],
82
+ successTitle: "",
83
+ lastBtnTitle: "",
84
+ active: 0,
85
+ isShowLastSuccess: true
86
+ })
87
+ const lastBtnTitleText = computed(() => props.lastBtnTitle || t("plus.stepWizard.lastBtnTitle"))
88
+ const slots = useSlots()
89
+ const stepContent = () => {
90
+ return props.isShowLastSuccess
91
+ ? props.stepData && props.stepData.slice(0, props.stepData.length - 1)
92
+ : props.stepData
93
+ }
94
+ const emits = defineEmits(["complete"])
95
+ // 第四步完成
96
+ const complete = () => {
97
+ emits("complete", props.active)
98
+ }
99
+ </script>
@@ -0,0 +1,17 @@
1
+ export interface StepItem {
2
+ title?: string
3
+ icon?: string
4
+ description?: string
5
+ slotName?: string
6
+ btnArr?: Array<{ type?: string; fn: Function; btnTitle: string }>
7
+ lastBtnArr?: Array<{ type?: string; fn: Function; btnTitle: string; disable?: boolean }>
8
+ disable?: boolean
9
+ }
10
+
11
+ export interface TStepWizardProps {
12
+ stepData?: StepItem[]
13
+ successTitle?: string
14
+ lastBtnTitle?: string
15
+ active?: number
16
+ isShowLastSuccess?: boolean
17
+ }
@@ -0,0 +1 @@
1
+ import "@ff-ui-plus/theme-chalk/t-step-wizard.css"
@@ -0,0 +1 @@
1
+ import "@ff-ui-plus/theme-chalk/src/step-wizard.scss"
@@ -0,0 +1,5 @@
1
+ import Table from "./src/index.vue"
2
+ export * from "./src/tableProps"
3
+ export * from "./src/useExpose"
4
+
5
+ export const TTable = Table
@@ -0,0 +1,176 @@
1
+ <template>
2
+ <el-dropdown trigger="click" popper-class="column_set">
3
+ <el-button v-bind="columnBind">{{ columnBind.btnTxt }}</el-button>
4
+ <template #dropdown>
5
+ <div class="title" v-if="columnBind.isShowTitle">{{ columnBind.title }}</div>
6
+ <el-dropdown-menu>
7
+ <el-dropdown-item :divided="columnBind.isShowTitle">
8
+ <el-tree
9
+ ref="treeRef"
10
+ class="t_table_column_setting_dropdown"
11
+ :data="state.columnSet"
12
+ node-key="prop"
13
+ :props="{ label: 'label', children: 'children', disabled: 'checkBoxDisabled' }"
14
+ show-checkbox
15
+ draggable
16
+ default-expand-all
17
+ check-strictly
18
+ :allow-drag="allowDrag"
19
+ :allow-drop="allowDrop"
20
+ :default-checked-keys="defaultCheckedKeys"
21
+ @check="onTreeCheck"
22
+ @node-drop="handleDrop"
23
+ >
24
+ </el-tree>
25
+ </el-dropdown-item>
26
+ </el-dropdown-menu>
27
+ </template>
28
+ </el-dropdown>
29
+ </template>
30
+
31
+ <script setup lang="ts">
32
+ import { watch, onMounted, reactive, computed, useAttrs, ref } from "vue"
33
+ import { useLocale } from "@ff-ui-plus/hooks"
34
+ const { t } = useLocale()
35
+ defineOptions({
36
+ name: "ColumnSet"
37
+ })
38
+ export interface Column {
39
+ label: string
40
+ prop: string
41
+ checkBoxDisabled?: boolean
42
+ hidden?: boolean
43
+ }
44
+
45
+ export interface ColumnSetProps {
46
+ columns: Column[]
47
+ title?: string
48
+ name?: string
49
+ columnSetBind?: Record<string, any>
50
+ }
51
+
52
+ const props = withDefaults(defineProps<ColumnSetProps>(), {
53
+ columns: () => [],
54
+ title: "",
55
+ name: "",
56
+ columnSetBind: () => ({})
57
+ })
58
+ const treeRef = ref()
59
+ const $attrs: any = useAttrs()
60
+ const columnBind = computed(() => {
61
+ const columnSetBind = {
62
+ btnTxt: t("plus.table.columnBind.btnTxt"),
63
+ title: t("plus.table.columnBind.title"),
64
+ ...props.columnSetBind
65
+ }
66
+ return { size: "default", icon: "Setting", isShowTitle: true, ...$attrs, ...columnSetBind }
67
+ })
68
+
69
+ const emits = defineEmits(["columnSetting"])
70
+ const state = reactive({
71
+ columnSet: [] as Column[]
72
+ })
73
+ const defaultCheckedKeys = ref<string[]>([])
74
+
75
+ const getColumnSetCache = () => {
76
+ let value =
77
+ localStorage.getItem(`t-ui-plus:TTable.columnSet-${props.name || props.title}`) || "[]"
78
+ let columnOption = initColumnSet()
79
+ let valueArr = (JSON.parse(value) as any[]) || []
80
+ columnOption.forEach(item => {
81
+ let findEle = valueArr.find(
82
+ (ele: { label: any; prop: any }) => ele.label === item.label && ele.prop === item.prop
83
+ )
84
+ item.hidden = findEle ? findEle.hidden : false
85
+ })
86
+ value = JSON.stringify(valueArr.length ? valueArr : columnOption)
87
+ return value ? JSON.parse(value) : initColumnSet()
88
+ }
89
+ const initColumnSet = () => {
90
+ return props.columns.map((col: any) => ({
91
+ label: col.label,
92
+ prop: col.prop,
93
+ checkBoxDisabled: false,
94
+ hidden: false
95
+ }))
96
+ }
97
+
98
+ onMounted(() => {
99
+ state.columnSet = getColumnSetCache()
100
+ defaultCheckedKeys.value = state.columnSet.filter(c => !c.hidden).map(c => c.prop)
101
+ emits("columnSetting", state.columnSet)
102
+ })
103
+
104
+ watch(
105
+ () => state.columnSet,
106
+ val => {
107
+ emits("columnSetting", val)
108
+ localStorage.setItem(
109
+ `t-ui-plus:TTable.columnSet-${props.name || props.title}`,
110
+ JSON.stringify(val)
111
+ )
112
+ defaultCheckedKeys.value = state.columnSet.filter(c => !c.hidden).map(c => c.prop)
113
+ },
114
+ { deep: true }
115
+ )
116
+
117
+ const reSetColumnSet = () => {
118
+ let value: any = localStorage.getItem(`t-ui-plus:TTable.columnSet-${props.name || props.title}`)
119
+ state.columnSet = JSON.parse(value)
120
+ defaultCheckedKeys.value = state.columnSet.filter(c => !c.hidden).map(c => c.prop)
121
+ emits("columnSetting", state.columnSet)
122
+ }
123
+
124
+ const onTreeCheck = () => {
125
+ // 获取最新勾选的key
126
+ const checkedKeys = treeRef.value?.getCheckedKeys() || []
127
+ state.columnSet.forEach(col => {
128
+ col.hidden = !checkedKeys.includes(col.prop)
129
+ })
130
+ // 至少保留一个可见列
131
+ const visibleCols = state.columnSet.filter(col => !col.hidden)
132
+ if (visibleCols.length < 2) {
133
+ visibleCols.forEach(col => (col.checkBoxDisabled = true))
134
+ } else {
135
+ state.columnSet.forEach(col => (col.checkBoxDisabled = false))
136
+ }
137
+ }
138
+ // 限制拖拽结点
139
+ const allowDrag = () => {
140
+ return true
141
+ }
142
+ const allowDrop = (draggingNode: any, dropNode: any, type: any) => {
143
+ // 只允许同级节点之间的拖拽
144
+ if (draggingNode.level !== dropNode.level) {
145
+ return false
146
+ }
147
+ // 如果是同级节点,还需要判断是否是前后节点的拖拽
148
+ if (type !== "prev" && type !== "next") {
149
+ return false
150
+ }
151
+ return true
152
+ }
153
+ // 拖拽排序
154
+ const handleDrop = (draggingNode: any, dropNode: any, dropType: string, ev: Event) => {
155
+ // 只允许拖拽到同级(禁止拖为子级)
156
+ if (dropType === "inner") {
157
+ ev.preventDefault()
158
+ return
159
+ }
160
+ const draggingIndex = state.columnSet.findIndex(col => col.prop === draggingNode.data.prop)
161
+ const dropIndex = state.columnSet.findIndex(col => col.prop === dropNode.data.prop)
162
+ if (draggingIndex === -1 || dropIndex === -1) return
163
+ const item = state.columnSet.splice(draggingIndex, 1)[0]
164
+ if (dropType === "before") {
165
+ // 如果拖拽项在目标项后面,直接插入;如果在前面,dropIndex要减1
166
+ const insertIndex = draggingIndex < dropIndex ? dropIndex - 1 : dropIndex
167
+ state.columnSet.splice(insertIndex, 0, item)
168
+ } else if (dropType === "after") {
169
+ state.columnSet.splice(dropIndex + 1, 0, item)
170
+ }
171
+ }
172
+
173
+ defineExpose({
174
+ reSetColumnSet
175
+ })
176
+ </script>
@@ -0,0 +1,100 @@
1
+ <template>
2
+ <el-table-column
3
+ v-if="typeof item.isShowCol == 'function' ? item.isShowCol(item) : !item.isShowCol"
4
+ :prop="item.prop"
5
+ :label="item.label"
6
+ :type="item.type"
7
+ :align="item.align || align"
8
+ :min-width="item['min-width'] || item.minWidth"
9
+ :width="item.width"
10
+ :fixed="item.fixed"
11
+ >
12
+ <template #header v-if="item.renderHeader">
13
+ <render-header :column="item" :render="item.renderHeader" />
14
+ </template>
15
+ <template v-for="(val, index) of item.children">
16
+ <t-table-column v-if="val.children" :key="index" :item="val" v-bind="$attrs">
17
+ <template v-for="(_index, name) in slots" v-slot:[name]="data">
18
+ <slot :name="name" v-bind="data"></slot>
19
+ </template>
20
+ </t-table-column>
21
+ <el-table-column
22
+ v-else
23
+ :key="val.prop"
24
+ :prop="val.prop"
25
+ :label="val.label"
26
+ :min-width="val['min-width'] || val.minWidth"
27
+ :width="val.width"
28
+ :sortable="val.sortable || val.sort || sortable"
29
+ :align="val.align || align"
30
+ :fixed="val.fixed"
31
+ :formatter="val.formatter"
32
+ v-if="typeof val.isShowCol == 'function' ? val.isShowCol(val) : !val.isShowCol"
33
+ v-bind="{ 'show-overflow-tooltip': true, ...val.bind, ...$attrs }"
34
+ >
35
+ <template #header v-if="val.renderHeader">
36
+ <render-header :column="val" :render="val.renderHeader" />
37
+ </template>
38
+ <template #default="scope">
39
+ <!-- render渲染 -->
40
+ <template v-if="val.render">
41
+ <render-col :column="val" :row="scope.row" :render="val.render" :index="scope.$index" />
42
+ </template>
43
+ <!-- 自定义插槽 -->
44
+ <template v-if="val.slotNameMerge">
45
+ <slot :name="val.slotNameMerge" :scope="scope"></slot>
46
+ </template>
47
+ <!-- 单个单元格编辑 -->
48
+ <template v-if="val.canEdit">
49
+ <single-edit-cell
50
+ :isShowRules="false"
51
+ :configEdit="val.configEdit"
52
+ v-model="scope.row[val.prop]"
53
+ :prop="val.prop"
54
+ :scope="scope"
55
+ @handleEvent="({ type, val }:any) => emits('handleEvent', type, val, scope.$index)"
56
+ v-bind="$attrs"
57
+ >
58
+ <template v-for="(_index, name) in slots" v-slot:[name]="data">
59
+ <slot :name="name" v-bind="data"></slot>
60
+ </template>
61
+ </single-edit-cell>
62
+ </template>
63
+ <div v-if="!val.render && !val.slotNameMerge && !val.canEdit && !val.formatter">
64
+ {{ scope.row[val.prop] }}
65
+ </div>
66
+ </template>
67
+ </el-table-column>
68
+ </template>
69
+ </el-table-column>
70
+ </template>
71
+
72
+ <script setup lang="tsx">
73
+ import SingleEditCell from "@ff-ui-plus/components/table/src/singleEditCell.vue"
74
+ import RenderCol from "@ff-ui-plus/components/table/src/renderCol.vue"
75
+ import RenderHeader from "@ff-ui-plus/components/table/src/renderHeader.vue"
76
+ import { useSlots } from "vue"
77
+ defineOptions({
78
+ name: "TTableColumn"
79
+ })
80
+ defineProps({
81
+ item: {
82
+ type: Object,
83
+ default: () => {
84
+ return {}
85
+ },
86
+ required: true
87
+ },
88
+ align: {
89
+ type: String,
90
+ default: "center"
91
+ },
92
+ sortable: {
93
+ type: [Boolean, String]
94
+ }
95
+ })
96
+ // 抛出事件
97
+ const emits = defineEmits(["handleEvent"])
98
+ // 获取所有插槽
99
+ const slots = useSlots()
100
+ </script>
@@ -0,0 +1,91 @@
1
+ <template>
2
+ <el-dropdown trigger="click" popper-class="density_set">
3
+ <el-button v-bind="densityBind">
4
+ <template #icon>
5
+ <el-icon
6
+ :size="densityBind.iconSize"
7
+ :color="densityBind.iconColor"
8
+ class="density_set__toolbar__icon"
9
+ >
10
+ <svg
11
+ viewBox="0 0 1024 1024"
12
+ focusable="false"
13
+ data-icon="column-height"
14
+ fill="currentColor"
15
+ aria-hidden="true"
16
+ >
17
+ <path
18
+ d="M840 836H184c-4.4 0-8 3.6-8 8v60c0 4.4 3.6 8 8 8h656c4.4 0 8-3.6 8-8v-60c0-4.4-3.6-8-8-8zm0-724H184c-4.4 0-8 3.6-8 8v60c0 4.4 3.6 8 8 8h656c4.4 0 8-3.6 8-8v-60c0-4.4-3.6-8-8-8zM610.8 378c6 0 9.4-7 5.7-11.7L515.7 238.7a7.14 7.14 0 00-11.3 0L403.6 366.3a7.23 7.23 0 005.7 11.7H476v268h-62.8c-6 0-9.4 7-5.7 11.7l100.8 127.5c2.9 3.7 8.5 3.7 11.3 0l100.8-127.5c3.7-4.7.4-11.7-5.7-11.7H548V378h62.8z"
19
+ />
20
+ </svg>
21
+ </el-icon>
22
+ </template>
23
+ {{ densityBind.btnTxt }}
24
+ </el-button>
25
+ <template #dropdown>
26
+ <div class="density_set_list">
27
+ <el-button
28
+ v-for="item in buttonNameDensity"
29
+ :key="item.size"
30
+ :plain="defaultSize !== item.size"
31
+ type="primary"
32
+ size="small"
33
+ @click="handleClickDensity(item.size)"
34
+ >
35
+ {{ unref(item.text) }}
36
+ </el-button>
37
+ </div>
38
+ </template>
39
+ </el-dropdown>
40
+ </template>
41
+ <script lang="ts" setup>
42
+ import { computed, unref, useAttrs } from "vue"
43
+ import type { ComputedRef } from "vue"
44
+ import type { ComponentSize } from "element-plus/es/constants"
45
+ import { useLocale } from "@ff-ui-plus/hooks"
46
+ const { t } = useLocale()
47
+ defineOptions({
48
+ name: "DensitySet"
49
+ })
50
+
51
+ export interface ButtonNameDensity {
52
+ size: ComponentSize
53
+ text: string | ComputedRef<string>
54
+ }
55
+ export interface DensitySetProps {
56
+ defaultSize?: ComponentSize
57
+ densitySetBind?: Record<string, any>
58
+ }
59
+ const emit = defineEmits<{
60
+ (e: "clickDensity", size: ComponentSize): void
61
+ }>()
62
+ const props = withDefaults(defineProps<DensitySetProps>(), {
63
+ defaultSize: "default",
64
+ densitySetBind: () => ({})
65
+ })
66
+ const attrs = useAttrs()
67
+ const densityBind = computed(() => {
68
+ const densitySetBind = {
69
+ btnTxt: t("plus.table.density"),
70
+ ...props.densitySetBind
71
+ }
72
+ return { size: "default", iconSize: 18, iconColor: "", ...attrs, ...densitySetBind }
73
+ })
74
+ const buttonNameDensity: ButtonNameDensity[] = [
75
+ {
76
+ size: "default",
77
+ text: computed(() => t("plus.table.default"))
78
+ },
79
+ {
80
+ size: "large",
81
+ text: computed(() => t("plus.table.loose"))
82
+ },
83
+ {
84
+ size: "small",
85
+ text: computed(() => t("plus.table.compact"))
86
+ }
87
+ ]
88
+ const handleClickDensity = (size: ComponentSize) => {
89
+ emit("clickDensity", size)
90
+ }
91
+ </script>