college-conditions-picker.vue 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  1. <template>
  2. <view>
  3. <ie-dropdown :configs="configs" v-model="form" :absolute="absolute" @change="handleChange"/>
  4. </view>
  5. </template>
  6. <script setup lang="ts">
  7. import type {Dropdown} from "@/types";
  8. import {UNIVERSITY_FILTER} from "@/types/injectionSymbols";
  9. import type {UniversityQueryDto, UniversityFilter} from "@/types/university";
  10. import {useUserStore} from "@/store/userStore";
  11. const props = defineProps<{
  12. options: UniversityFilter;
  13. absolute?: boolean;
  14. }>()
  15. const filter = inject(UNIVERSITY_FILTER) || ref({} as UniversityQueryDto)
  16. const userStore = useUserStore()
  17. const emit = defineEmits<{
  18. (e: 'change', value: UniversityQueryDto): void;
  19. }>();
  20. const options = computed(() => {
  21. return userStore.isHN ? [
  22. {
  23. label: '院校层次',
  24. prop: 'features',
  25. optionKey: 'features',
  26. keyName: 'label',
  27. keyValue: 'value',
  28. },
  29. {
  30. label: '院校类型',
  31. prop: 'type',
  32. optionKey: 'types',
  33. keyName: 'label',
  34. keyValue: 'value',
  35. },
  36. {
  37. label: '办学类型',
  38. prop: 'natureTypeCN',
  39. optionKey: 'natureTypes',
  40. keyName: 'label',
  41. keyValue: 'value',
  42. },
  43. {
  44. label: '院校梯队',
  45. prop: 'tier',
  46. optionKey: 'tiers',
  47. keyName: 'label',
  48. keyValue: 'value',
  49. },
  50. ] : [
  51. {
  52. label: '院校层次',
  53. prop: 'features',
  54. optionKey: 'features',
  55. keyName: 'label',
  56. keyValue: 'value',
  57. },
  58. {
  59. label: '院校类型',
  60. prop: 'type',
  61. optionKey: 'types',
  62. keyName: 'label',
  63. keyValue: 'value',
  64. },
  65. {
  66. label: '办学类型',
  67. prop: 'natureTypeCN',
  68. optionKey: 'natureTypes',
  69. keyName: 'label',
  70. keyValue: 'value',
  71. },
  72. {
  73. label: '院校省份',
  74. prop: 'location',
  75. optionKey: 'locations',
  76. keyName: 'label',
  77. keyValue: 'value',
  78. }
  79. ]
  80. })
  81. const form = ref<Record<string, any>>({});
  82. const configs = computed<Dropdown.DropdownItem[]>(() => {
  83. return options.value.map(item => {
  84. const list = props.options[item.optionKey as keyof UniversityFilter] || [];
  85. if (Array.isArray(list)) {
  86. return {
  87. label: item.label,
  88. prop: item.prop,
  89. keyName: item.keyName,
  90. keyValue: item.keyValue,
  91. options: list.map(item => {
  92. return {
  93. label: item,
  94. value: item,
  95. }
  96. }),
  97. value: []
  98. }
  99. } else {
  100. return {
  101. label: item.label,
  102. prop: item.prop,
  103. keyName: item.keyName,
  104. keyValue: item.keyValue,
  105. options: Object.entries(list).map(([key, value]) => {
  106. return {
  107. label: value,
  108. value: key,
  109. }
  110. }),
  111. value: []
  112. }
  113. }
  114. });
  115. });
  116. const handleChange = (value: any) => {
  117. filter.value = {
  118. ...filter.value,
  119. ...value,
  120. }
  121. emit('change', filter.value);
  122. }
  123. </script>
  124. <style scoped></style>