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,88 @@
1
+ <template>
2
+ <div class="t_form">
3
+ <el-collapse v-model="defaultActiveKey">
4
+ <el-collapse-item
5
+ v-for="(formOpt, formIndex) in formOpts"
6
+ :class="[
7
+ formOpt.className,
8
+ {
9
+ noTitle: !formOpt.title,
10
+ disabledStyle: formOpt.disabled,
11
+ title_bold: titleBold
12
+ }
13
+ ]"
14
+ :key="formIndex"
15
+ :name="formOpt.name"
16
+ :disabled="formOpt.disabled"
17
+ >
18
+ <template #title>
19
+ <span class="collapse-item_title">{{ formOpt.title }}</span>
20
+ <div class="t_btn" v-if="formOpt.btn">
21
+ <slot :name="formOpt.btn"></slot>
22
+ </div>
23
+ </template>
24
+ <template v-if="formOpt.slotName">
25
+ <slot :name="formOpt.slotName"></slot>
26
+ </template>
27
+ <t-form
28
+ :ref="
29
+ (el:any) => {
30
+ dashboardRef[formIndex] = el
31
+ }
32
+ "
33
+ :formOpts="formOpt.opts"
34
+ :widthSize="formOpt.widthSize || 3"
35
+ v-bind="attrs"
36
+ @handleEvent="handleEvent"
37
+ >
38
+ <template v-for="(_index, name) in slots" v-slot:[name]="data">
39
+ <slot :name="name" v-bind="data"></slot>
40
+ </template>
41
+ </t-form>
42
+ </el-collapse-item>
43
+ </el-collapse>
44
+ </div>
45
+ </template>
46
+
47
+ <script setup lang="ts">
48
+ import { computed, ref, useAttrs, useSlots } from "vue"
49
+ defineOptions({
50
+ name: "ModuleForm"
51
+ })
52
+ const props: any = defineProps({
53
+ // 表单配置项
54
+ formOpts: {
55
+ type: Object,
56
+ default: () => ({})
57
+ },
58
+ // 是否Title文字加粗
59
+ titleBold: {
60
+ type: Boolean,
61
+ default: false
62
+ }
63
+ })
64
+ const dashboardRef = ref({}) as any
65
+ const slots = useSlots()
66
+ const attrs: any = useAttrs()
67
+ // 抛出ref
68
+ const getChildRef = (index: string | number) => {
69
+ const childRef = dashboardRef.value[index]
70
+ return childRef
71
+ }
72
+ // 暴露方法出去
73
+ defineExpose({ getChildRef })
74
+ const defaultActiveKey = computed({
75
+ get() {
76
+ // console.log(333, Object.keys(this.formOpts))
77
+ return Object.keys(props.formOpts)
78
+ },
79
+ set(val) {
80
+ return val
81
+ }
82
+ })
83
+ // 抛出事件
84
+ const emits = defineEmits(["handleEvent"])
85
+ const handleEvent = (val: any, type: any) => {
86
+ emits("handleEvent", val, type)
87
+ }
88
+ </script>
@@ -0,0 +1,16 @@
1
+ export interface TModuleFormProps {
2
+ handleType?: "edit" | "desc"
3
+ isShowHeader?: boolean
4
+ titleSlot?: boolean
5
+ isShowBack?: boolean
6
+ isGoBackEvent?: boolean
7
+ btnSaveBind?: Record<string, any>
8
+ btnCancelBind?: Record<string, any>
9
+ isTabMargin?: boolean
10
+ tabMarginNum?: number
11
+ footer?: any
12
+ title?: string
13
+ subTitle?: string
14
+ tabs?: Array<{ key: string; title: string }>
15
+ submit?: (form: Record<string, any>) => Promise<boolean>
16
+ }
@@ -0,0 +1 @@
1
+ import "@ff-ui-plus/theme-chalk/t-module-form.css"
@@ -0,0 +1 @@
1
+ import "@ff-ui-plus/theme-chalk/src/module-form.scss"
@@ -0,0 +1,9 @@
1
+ {
2
+ "name": "@ff-ui-plus/components",
3
+ "version": "0.0.1",
4
+ "private": false,
5
+ "description": "all components are settled here",
6
+ "main": "index.ts",
7
+ "type": "module",
8
+ "sideEffects": false
9
+ }
@@ -0,0 +1,4 @@
1
+ import QueryCondition from "./src/index.vue"
2
+ export * from "./src/type"
3
+
4
+ export const TQueryCondition = QueryCondition
@@ -0,0 +1,478 @@
1
+ <template>
2
+ <el-form
3
+ id="t_query_condition"
4
+ v-bind="$attrs"
5
+ :label-width="labelWidth"
6
+ :form="queryState.form"
7
+ :labelPosition="labelPosition"
8
+ size="default"
9
+ class="t-query-condition"
10
+ :style="{
11
+ 'grid-template-areas': gridAreas,
12
+ 'grid-template-columns': `repeat(${colLength}, minmax(0px, ${100 / colLength}%))`
13
+ }"
14
+ @submit.prevent
15
+ >
16
+ <el-form-item
17
+ v-for="(opt, i) in cOpts"
18
+ :key="i"
19
+ :label="opt.label"
20
+ :label-width="opt.labelWidth"
21
+ v-bind="$attrs"
22
+ :style="{ gridArea: i }"
23
+ :class="[
24
+ opt.className,
25
+ {
26
+ render_label: opt.labelRender,
27
+ render_label_position_top: labelPosition == 'top' && opt.labelRender,
28
+ render_label_position_left: labelPosition == 'left' && opt.labelRender
29
+ }
30
+ ]"
31
+ >
32
+ <!-- 自定义label -->
33
+ <template #label v-if="opt.labelRender">
34
+ <render-comp :form="queryState.form" :render="opt.labelRender" />
35
+ </template>
36
+ <!-- 自定义输入框插槽 -->
37
+ <template v-if="opt.slotName">
38
+ <slot :name="opt.slotName" :param="queryState.form" :scope="queryState.form"></slot>
39
+ </template>
40
+ <template v-if="opt.isSelfCom">
41
+ <component
42
+ :is="opt.comp"
43
+ :ref="opt.comp === 't-select-table' ? (el: any) => handleRef(el,opt, i) : (el: any) => getRefs(el, opt, i)"
44
+ v-model="queryState.form[opt.dataIndex]"
45
+ :placeholder="opt.placeholder || getPlaceholder(opt)"
46
+ v-bind="
47
+ typeof opt.bind == 'function'
48
+ ? opt.bind(queryState.form)
49
+ : { clearable: true, filterable: true, ...$attrs, ...opt.bind }
50
+ "
51
+ :style="{ width: opt.width || '100%' }"
52
+ @change="handleEvent({ type: opt.event, val: queryState.form[opt.dataIndex] })"
53
+ v-on="cEvent(opt)"
54
+ />
55
+ </template>
56
+ <component
57
+ v-if="!opt.isSelfCom && !opt.slotName"
58
+ :is="opt.comp"
59
+ v-bind="
60
+ typeof opt.bind == 'function'
61
+ ? opt.bind(queryState.form)
62
+ : { clearable: true, filterable: true, ...$attrs, ...opt.bind }
63
+ "
64
+ :placeholder="opt.placeholder || getPlaceholder(opt)"
65
+ @change="handleEvent({ type: opt.event, val: queryState.form[opt.dataIndex] })"
66
+ :ref="(el: any) => getRefs(el, opt, i)"
67
+ v-on="cEvent(opt)"
68
+ v-model="queryState.form[opt.dataIndex]"
69
+ >
70
+ <component
71
+ :is="compChildName(opt)"
72
+ v-for="(value, key) in selectListType(opt)"
73
+ :key="key"
74
+ :disabled="value.disabled"
75
+ :label="compChildLabel(opt, value)"
76
+ :value="compChildValue(opt, value, key)"
77
+ >{{ compChildShowLabel(opt, value) }}</component
78
+ >
79
+ </component>
80
+ </el-form-item>
81
+ <el-form-item
82
+ v-if="Object.keys(cOpts).length > 0"
83
+ label-width="0"
84
+ style="grid-area: submit_btn"
85
+ :class="[
86
+ 'btn',
87
+ { flex_end: cellLength % colLength === 0 },
88
+ { btn_flex_end: Object.keys(cOpts).length === 4 || cellLength > 3 },
89
+ { btn_label_position_top: labelPosition == 'top' }
90
+ ]"
91
+ >
92
+ <template v-if="isFooter">
93
+ <slot name="footerBtn" />
94
+ <template v-if="!slots.footerBtn">
95
+ <el-button
96
+ class="btn_check"
97
+ @click="checkHandle"
98
+ v-bind="{ type: 'primary', ...queryAttrs }"
99
+ :loading="loading"
100
+ >{{ queryAttrs.btnTxt }}</el-button
101
+ >
102
+ <el-button v-if="reset" class="btn_reset" v-bind="resetAttrs" @click="resetHandle">
103
+ {{ resetAttrs.btnTxt }}
104
+ </el-button>
105
+ <slot name="querybar"></slot>
106
+ <el-button
107
+ v-if="originCellLength > maxVisibleRows * colLength && showOpen"
108
+ @click="open = !open"
109
+ link
110
+ >
111
+ {{ open ? packUpTxtText : unfoldTxtText }}
112
+ <el-icon v-if="open">
113
+ <ArrowUp />
114
+ </el-icon>
115
+ <el-icon v-else>
116
+ <ArrowDown />
117
+ </el-icon>
118
+ </el-button>
119
+ <more-choose
120
+ :isDropDownSelectMore="isDropDownSelectMore"
121
+ :moreCheckList="moreCheckList"
122
+ :popoverAttrsBind="popoverAttrsBind"
123
+ @getCheckList="event => emits('getCheckList', event)"
124
+ />
125
+ </template>
126
+ </template>
127
+ </el-form-item>
128
+ </el-form>
129
+ </template>
130
+
131
+ <script setup lang="ts">
132
+ import RenderComp from "@ff-ui-plus/components/query-condition/src/renderComp.vue"
133
+ import MoreChoose from "@ff-ui-plus/components/query-condition/src/moreChoose.vue"
134
+ import { computed, ref, watch, useSlots, onMounted, reactive } from "vue"
135
+ import { ArrowUp, ArrowDown } from "@element-plus/icons-vue"
136
+ import type { TQueryConditionProps } from "./type"
137
+ import { useComputed } from "./useComputed"
138
+ import { useLocale } from "@ff-ui-plus/hooks"
139
+ const {
140
+ compChildName,
141
+ selectListType,
142
+ compChildLabel,
143
+ compChildValue,
144
+ compChildShowLabel,
145
+ getColLength
146
+ } = useComputed()
147
+ const { t } = useLocale()
148
+ const props = withDefaults(defineProps<TQueryConditionProps>(), {
149
+ opts: () => ({}),
150
+ labelWidth: "120px",
151
+ btnCheckBind: () => ({}),
152
+ btnResetBind: () => ({}),
153
+ loading: false,
154
+ reset: true,
155
+ boolEnter: true,
156
+ isShowOpen: true,
157
+ isExpansion: false,
158
+ maxVisibleRows: 1,
159
+ // 不在模块顶层调用 t(...),否则在构建/SSR 阶段会导致错误
160
+ packUpTxt: "",
161
+ unfoldTxt: "",
162
+ isFooter: true,
163
+ configChangedReset: false,
164
+ isShowWidthSize: false,
165
+ widthSize: 4,
166
+ isDropDownSelectMore: false,
167
+ moreCheckList: () => [],
168
+ popoverAttrs: () => ({}),
169
+ labelPosition: "right"
170
+ })
171
+ defineOptions({
172
+ name: "TQueryCondition"
173
+ })
174
+ const slots = useSlots()
175
+ // 判断是否使用了某个插槽
176
+ const isShow = (name: string) => {
177
+ return Object.keys(slots).includes(name)
178
+ }
179
+ const popoverAttrsBind = computed(() => {
180
+ return {
181
+ showTxt: t("plus.search.popoverAttrs.showTxt"),
182
+ title: t("plus.search.popoverAttrs.title"),
183
+ allTxt: t("plus.search.popoverAttrs.allTxt"),
184
+ reverseTxt: t("plus.search.popoverAttrs.reverseTxt"),
185
+ clearTxt: t("plus.search.popoverAttrs.clearTxt"),
186
+ ...props.popoverAttrs
187
+ }
188
+ })
189
+ // 初始化表单数据
190
+ let queryState = reactive({
191
+ form: Object.keys(props.opts).reduce((acc: any, field: any) => {
192
+ acc[field] = props.opts[field].defaultVal ?? null
193
+ return acc
194
+ }, {})
195
+ })
196
+ let colLength = ref(4)
197
+ let showOpen = ref(false)
198
+
199
+ let open = ref(false)
200
+ // placeholder的显示
201
+ const getPlaceholder = (row: any) => {
202
+ // console.log(77, row)
203
+ let placeholder
204
+ if (row.comp && typeof row.comp == "string") {
205
+ if (row.comp.includes("input")) {
206
+ placeholder = t("plus.search.pleaseEnter") + row.label
207
+ } else if (row.comp.includes("select") || row.comp.includes("date")) {
208
+ placeholder = t("plus.search.pleaseSelect") + row.label
209
+ } else {
210
+ placeholder = row.label
211
+ }
212
+ }
213
+ return placeholder
214
+ }
215
+ // 查询按钮配置
216
+ const queryAttrs = computed(() => {
217
+ return {
218
+ btnTxt: t("plus.search.searchText"),
219
+ ...props.btnCheckBind
220
+ }
221
+ })
222
+ // 重置按钮配置
223
+ const resetAttrs = computed(() => {
224
+ return { btnTxt: t("plus.search.resetText"), ...props.btnResetBind }
225
+ })
226
+ const originCellLength = computed(() => {
227
+ let length = 0
228
+ Object.keys(props.opts).forEach(key => {
229
+ let span = props.opts[key].span || 1
230
+ if ((length % colLength.value) + span > colLength.value) {
231
+ length += colLength.value - (length % colLength.value)
232
+ }
233
+ length += span
234
+ })
235
+ return length
236
+ })
237
+ const cOpts = computed(() => {
238
+ let renderSpan = 0
239
+ return Object.keys(props.opts).reduce((acc: any, field: any) => {
240
+ let opt = {
241
+ ...props.opts[field]
242
+ }
243
+ // 收起、展开操作
244
+ if (showOpen.value) {
245
+ renderSpan += opt.span ?? 1
246
+ if (!open.value && renderSpan - 1 >= props.maxVisibleRows * colLength.value) {
247
+ return acc
248
+ }
249
+ }
250
+ opt.dataIndex = field
251
+ acc[field] = opt
252
+ return acc
253
+ }, {})
254
+ })
255
+ const cellLength: any = computed(() => {
256
+ // 占用单元格长度
257
+ let length = 0
258
+ Object.keys(props.opts).forEach(key => {
259
+ let span = props.opts[key].span > 4 ? 4 : props.opts[key].span || 1
260
+ length += span
261
+ })
262
+ return length
263
+ })
264
+ const gridAreas = computed(() => {
265
+ // grid布局按钮位置
266
+ const fields = Object.keys(cOpts.value)
267
+ let rowIndex = 0
268
+ let rowSpan = 0
269
+ const areas: any = [[]]
270
+ for (let fieldIndex = 0; fieldIndex < fields.length; fieldIndex++) {
271
+ const field = fields[fieldIndex]
272
+ const opt = cOpts.value[field]
273
+ const span = Math.min(opt.span ?? 1, Math.min(colLength.value, 4)) // 最大4
274
+ if (rowSpan + span > colLength.value) {
275
+ while (rowSpan < colLength.value) {
276
+ areas[rowIndex].push(".")
277
+ rowSpan += 1
278
+ }
279
+ rowSpan = 0
280
+ areas[++rowIndex] = []
281
+ }
282
+ rowSpan += span
283
+ for (let index = 0; index < span; index++) {
284
+ areas[rowIndex].push(field)
285
+ }
286
+ }
287
+ if (areas[rowIndex].length === colLength.value) {
288
+ areas.push(Array(colLength.value).fill("submit_btn"))
289
+ } else {
290
+ while (areas[rowIndex].length < colLength.value) {
291
+ areas[rowIndex].push("submit_btn")
292
+ }
293
+ }
294
+ return areas.reduce((acc: string, cur: any[]) => {
295
+ acc += `'${cur.join(" ")}'\n`
296
+ return acc
297
+ }, "")
298
+ })
299
+
300
+ const packUpTxtText = computed(() => props.packUpTxt || t("plus.search.retract"))
301
+ const unfoldTxtText = computed(() => props.unfoldTxt || t("plus.search.expand"))
302
+ // 引用第三方事件
303
+ const cEvent = computed(() => {
304
+ return (opt: { eventHandle: any; comp: string | string[] }) => {
305
+ // console.log('opt--', opt)
306
+ let event = { ...opt.eventHandle }
307
+ let changeEvent = {} as any
308
+ Object.keys(event).forEach(v => {
309
+ changeEvent[v] = (e: any) => {
310
+ if (
311
+ opt.comp.includes("select") ||
312
+ opt.comp.includes("picker") ||
313
+ opt.comp.includes("date")
314
+ ) {
315
+ event[v] && event[v](e, queryState.form)
316
+ } else {
317
+ if (e) {
318
+ event[v] && event[v](e, queryState.form)
319
+ } else {
320
+ event[v] && event[v](queryState.form)
321
+ }
322
+ }
323
+ }
324
+ })
325
+ return { ...changeEvent }
326
+ }
327
+ })
328
+ // 初始化表单数据
329
+ const initForm = (opts: any, keepVal = false) => {
330
+ return Object.keys(opts).reduce((acc: any, field) => {
331
+ if (keepVal && queryState.form) {
332
+ acc[field] = queryState.form[field] ?? opts[field].defaultVal ?? null
333
+ } else {
334
+ acc[field] = opts[field].defaultVal ?? null
335
+ }
336
+ return acc
337
+ }, {})
338
+ }
339
+ const emits = defineEmits(["handleEvent", "submit", "reset", "getCheckList", "getRefs"])
340
+ // 下拉选择表格组件 ref
341
+ const tselecttableref: any = ref({})
342
+ // 下拉选择表格组件 动态ref
343
+ const handleRef = (el: any, opt: any, key: any) => {
344
+ emits("getRefs", el, opt, key)
345
+ if (el) {
346
+ tselecttableref.value[`tselecttableref-${key}`] = el
347
+ }
348
+ }
349
+ // 获取所有ref
350
+ const getRefs = (el: any, opt: any, index: any) => {
351
+ emits("getRefs", el, opt, index)
352
+ }
353
+ // 重置
354
+ const resetHandle = () => {
355
+ queryState.form = initForm(props.opts)
356
+ // 获取所有下拉选择表格组件
357
+ const refList = Object.keys(tselecttableref.value).filter(item =>
358
+ item.includes("tselecttableref")
359
+ )
360
+ if (refList.length > 0 && tselecttableref.value) {
361
+ refList.map(val => {
362
+ // console.log('9999', val)
363
+ tselecttableref.value[val].clear()
364
+ })
365
+ }
366
+ emits("reset", queryState.form)
367
+ checkHandle("reset")
368
+ }
369
+ // 重置数据
370
+ const resetData = () => {
371
+ queryState.form = initForm(props.opts)
372
+ // 获取所有下拉选择表格组件
373
+ const refList = Object.keys(tselecttableref.value).filter(item =>
374
+ item.includes("tselecttableref")
375
+ )
376
+ if (refList.length > 0 && tselecttableref.value) {
377
+ refList.map(val => {
378
+ // console.log('9999', val)
379
+ tselecttableref.value[val].clear()
380
+ })
381
+ }
382
+ }
383
+
384
+ // 查询条件change事件
385
+ const handleEvent = (
386
+ { isChange = false, type, val }: { isChange?: boolean; type: string; val: any },
387
+ dataIndex?: string
388
+ ) => {
389
+ if (!isChange) {
390
+ emits("handleEvent", type, val, queryState.form)
391
+ } else if (dataIndex) {
392
+ queryState.form[dataIndex] = val
393
+ }
394
+ }
395
+
396
+ // 查询
397
+ const checkHandle = (flagText: any = false) => {
398
+ emits("submit", queryState.form, flagText)
399
+ }
400
+
401
+ onMounted(() => {
402
+ // 是否显示展开按钮
403
+ if (props.isShowOpen) {
404
+ showOpen.value = true
405
+ } else {
406
+ showOpen.value = false
407
+ }
408
+ // 默认展开
409
+ if (props.isExpansion) {
410
+ open.value = true
411
+ } else {
412
+ open.value = false
413
+ }
414
+ if (props.isShowWidthSize) {
415
+ colLength.value = props.widthSize
416
+ } else {
417
+ colLength.value = getColLength()
418
+ }
419
+ if (props.boolEnter) {
420
+ document.onkeyup = e => {
421
+ // console.log(7777, e)
422
+ let key = e.keyCode
423
+ let pagination = document.querySelectorAll(".el-pagination")
424
+ let isPaginationInputFocus = false
425
+ if (pagination) {
426
+ pagination.forEach(ele => {
427
+ let paginationInputList = ele.getElementsByTagName("input")
428
+ let paginationInput = paginationInputList[paginationInputList.length - 1]
429
+ // 判断是否有分页器筛选输入框获取焦点
430
+ if (paginationInput === document.activeElement) {
431
+ isPaginationInputFocus = true
432
+ }
433
+ })
434
+ }
435
+ if (isPaginationInputFocus) {
436
+ return
437
+ }
438
+ if (key === 13) {
439
+ checkHandle()
440
+ }
441
+ }
442
+ }
443
+ // 使用自定义按钮插槽默认展开所有查询条件
444
+ if (isShow("footerBtn") || !props.isFooter) {
445
+ // console.log("使用自定义按钮插槽默认展开所有查询条件", props.isFooter)
446
+ open.value = true
447
+ }
448
+ // 以下拉方式展示更多条件禁用展开&收起功能
449
+ if (props.isDropDownSelectMore) {
450
+ open.value = true
451
+ showOpen.value = false
452
+ }
453
+ })
454
+ watch(
455
+ () => props.widthSize,
456
+ val => {
457
+ colLength.value = val
458
+ }
459
+ )
460
+ watch(
461
+ () => props.opts,
462
+ opts => {
463
+ queryState.form = initForm(opts, !props.configChangedReset)
464
+ },
465
+ { deep: true }
466
+ )
467
+
468
+ // 暴露方法出去
469
+ defineExpose({
470
+ queryState,
471
+ props,
472
+ colLength,
473
+ resetData,
474
+ resetHandle,
475
+ checkHandle,
476
+ handleEvent
477
+ })
478
+ </script>