index.vue 2.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. <template>
  2. <div class="card table-search" v-if="columns.length">
  3. <el-form ref="formRef" :model="searchParam">
  4. <Grid ref="gridRef" :collapsed="collapsed" :gap="[20, 0]" :cols="searchCol">
  5. <GridItem v-for="(item, index) in columns" :key="item.prop" v-bind="getResponsive(item)" :index="index">
  6. <el-form-item :label="`${item.label} :`">
  7. <SearchFormItem :column="item" :search-param="searchParam" />
  8. </el-form-item>
  9. </GridItem>
  10. <GridItem suffix>
  11. <div class="operation">
  12. <el-button type="primary" :icon="Search" @click="search">搜索</el-button>
  13. <el-button :icon="Delete" @click="reset">重置</el-button>
  14. <el-button v-if="showCollapse" type="primary" link class="search-isOpen" @click="collapsed = !collapsed">
  15. {{ collapsed ? "展开" : "合并" }}
  16. <el-icon class="el-icon--right">
  17. <component :is="collapsed ? ArrowDown : ArrowUp"></component>
  18. </el-icon>
  19. </el-button>
  20. </div>
  21. </GridItem>
  22. </Grid>
  23. </el-form>
  24. </div>
  25. </template>
  26. <script setup lang="ts" name="SearchForm">
  27. import { computed, ref } from "vue";
  28. import { ColumnProps } from "@/components/ProTable/interface";
  29. import { BreakPoint } from "@/components/Grid/interface";
  30. import { Delete, Search, ArrowDown, ArrowUp } from "@element-plus/icons-vue";
  31. import SearchFormItem from "./components/SearchFormItem.vue";
  32. import Grid from "@/components/Grid/index.vue";
  33. import GridItem from "@/components/Grid/components/GridItem.vue";
  34. interface ProTableProps {
  35. columns?: ColumnProps[]; // 搜索配置列
  36. searchParam?: { [key: string]: any }; // 搜索参数
  37. searchCol: number | Record<BreakPoint, number>;
  38. search: (params: any) => void; // 搜索方法
  39. reset: (params: any) => void; // 重置方法
  40. }
  41. // 默认值
  42. const props = withDefaults(defineProps<ProTableProps>(), {
  43. columns: () => [],
  44. searchParam: () => ({})
  45. });
  46. // 获取响应式设置
  47. const getResponsive = (item: ColumnProps) => {
  48. return {
  49. span: item.search?.span,
  50. offset: item.search?.offset ?? 0,
  51. xs: item.search?.xs,
  52. sm: item.search?.sm,
  53. md: item.search?.md,
  54. lg: item.search?.lg,
  55. xl: item.search?.xl
  56. };
  57. };
  58. // 是否默认折叠搜索项
  59. const collapsed = ref(true);
  60. // 获取响应式断点
  61. const gridRef = ref();
  62. const breakPoint = computed<BreakPoint>(() => gridRef.value?.breakPoint);
  63. // 判断是否显示 展开/合并 按钮
  64. const showCollapse = computed(() => {
  65. let show = false;
  66. props.columns.reduce((prev, current) => {
  67. prev +=
  68. (current.search![breakPoint.value]?.span ?? current.search?.span ?? 1) +
  69. (current.search![breakPoint.value]?.offset ?? current.search?.offset ?? 0);
  70. if (typeof props.searchCol !== "number") {
  71. if (prev >= props.searchCol[breakPoint.value]) show = true;
  72. } else {
  73. if (prev >= props.searchCol) show = true;
  74. }
  75. return prev;
  76. }, 0);
  77. return show;
  78. });
  79. </script>