index.tsx 9.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304
  1. import {
  2. PropType,
  3. defineComponent,
  4. nextTick,
  5. onMounted,
  6. reactive,
  7. ref,
  8. toRef
  9. } from 'vue';
  10. import styles from './index.module.less';
  11. import {
  12. NButton,
  13. NForm,
  14. NFormItem,
  15. NImage,
  16. NPopselect,
  17. NSpace
  18. } from 'naive-ui';
  19. import { resourceTypeArray } from '/src/utils/searchArray';
  20. import { useCatchStore } from '/src/store/modules/catchData';
  21. import { useThrottleFn } from '@vueuse/core';
  22. import TheSearch from '/src/components/TheSearch';
  23. import isCollaose from '/src/views/natural-resources/images/isCollaose.png';
  24. export default defineComponent({
  25. name: 'resource-search-group',
  26. props: {
  27. type: {
  28. type: String as PropType<
  29. 'relateResources' | 'shareResources' | 'myResources' | 'myCollect'
  30. >,
  31. default: 'shareResources'
  32. },
  33. subjectId: {
  34. type: String,
  35. default: ''
  36. }
  37. },
  38. emits: ['search'],
  39. setup(props, { emit }) {
  40. const subjectId = toRef(props.subjectId);
  41. const catchStore = useCatchStore();
  42. const forms = reactive({
  43. type: 'MUSIC', //
  44. name: '',
  45. subjectId: subjectId.value as any,
  46. bookVersionId: null
  47. });
  48. const resourceType = ref([] as any);
  49. const onSearch = () => {
  50. emit('search', forms);
  51. };
  52. const throttleFn = useThrottleFn(() => onSearch(), 500);
  53. // const collapseWrapRef = ref();
  54. // const divDomList = ref([] as any);
  55. // const orginHeight = ref(0);
  56. // const hiddenHeight = ref(0);
  57. // const line = ref(0);
  58. // const isCollapse = ref(false);
  59. // const loadingCollapse = ref(false); // 是否加载完成
  60. // const musicCateRef = (el: any) => {
  61. // if (el?.selfElRef) {
  62. // divDomList.value.push(el.selfElRef.parentNode);
  63. // }
  64. // };
  65. // const setCollapse = (flag: boolean) => {
  66. // isCollapse.value = flag;
  67. // getLive();
  68. // };
  69. // const getLive = () => {
  70. // try {
  71. // divDomList.value = [...new Set(divDomList.value)];
  72. // let offsetLeft = -1;
  73. // divDomList.value.forEach((item: any, index: number) => {
  74. // if (index === 0) {
  75. // line.value = 1;
  76. // offsetLeft = item.offsetLeft;
  77. // } else if (item.offsetLeft === offsetLeft && index != 0) {
  78. // // 如果某个标签的offsetLeft和第一个标签的offsetLeft相等 说明增加了一行
  79. // line.value++;
  80. // }
  81. // if (!isCollapse.value) {
  82. // if (line.value > 1) {
  83. // //从第3行开始 隐藏标签
  84. // item.style.display = 'none';
  85. // // 显示展开按钮 class名chu是在前面动态添加的
  86. // } else {
  87. // item.style.display = 'block';
  88. // }
  89. // } else {
  90. // item.style.display = 'block';
  91. // }
  92. // });
  93. // loadingCollapse.value = true;
  94. // } catch {
  95. // //
  96. // }
  97. // };
  98. const selectChildObj = (item: any) => {
  99. const obj: any = {};
  100. item?.forEach((child: any) => {
  101. if (child.id === forms.subjectId) {
  102. obj.selected = true;
  103. obj.name = child.name;
  104. }
  105. });
  106. return obj;
  107. };
  108. onMounted(async () => {
  109. // if (props.type === 'myCollect') {
  110. // resourceType.value.push({
  111. // label: '全部',
  112. // value: ''
  113. // });
  114. // forms.type = ''; // 默认全部
  115. // }
  116. resourceTypeArray.forEach((item: any) => {
  117. // if (props.type === 'myResources') {
  118. // item.value !== 'MUSIC' && resourceType.value.push(item);
  119. // } else {
  120. resourceType.value.push(item);
  121. // }
  122. });
  123. // 获取教材分类列表
  124. await catchStore.getMusicSheetCategory();
  125. // 获取声部
  126. await catchStore.getSubjects();
  127. catchStore.getSubjectInstruments.forEach((item: any) => {
  128. if (item.id == props.subjectId) {
  129. if (item.instruments.length > 0) {
  130. forms.subjectId = item.instruments[0].value;
  131. } else {
  132. forms.subjectId = item.value;
  133. }
  134. }
  135. });
  136. // 这里开始
  137. // musicCateRef
  138. // if (forms.type === 'MUSIC') {
  139. // orginHeight.value = collapseWrapRef.value?.offsetHeight;
  140. // hiddenHeight.value = collapseWrapRef.value?.offsetHeight / line.value;
  141. // // 默认隐藏
  142. // getLive();
  143. // }
  144. });
  145. return () => (
  146. <div class={styles.searchGroup}>
  147. {/* <div class={styles.searchCatatory}> */}
  148. {/* <NSpace size="small" class={styles.btnType}>
  149. {resourceType.value.map((item: any) => (
  150. <NButton
  151. type={forms.type === item.value ? 'primary' : 'default'}
  152. secondary={forms.type === item.value ? false : true}
  153. round
  154. size="small"
  155. focusable={false}
  156. onClick={() => {
  157. forms.type = item.value;
  158. onSearch();
  159. try {
  160. nextTick(() => {
  161. if (forms.type === 'MUSIC') {
  162. orginHeight.value = collapseWrapRef.value?.offsetHeight;
  163. hiddenHeight.value =
  164. collapseWrapRef.value?.offsetHeight / line.value;
  165. // 默认隐藏
  166. getLive();
  167. } else {
  168. divDomList.value = [];
  169. }
  170. });
  171. } catch {
  172. //
  173. }
  174. }}>
  175. {item.label}
  176. </NButton>
  177. ))}
  178. </NSpace> */}
  179. {/* </div> */}
  180. <NForm labelAlign="left" labelPlacement="left">
  181. {/* {forms.type === 'MUSIC' && props.type === 'shareResources' && (
  182. <div class={styles.collapsSection}>
  183. <NFormItem label="教材:">
  184. <div
  185. class={[
  186. styles.collapseWrap,
  187. loadingCollapse.value ? '' : styles.hideButton,
  188. isCollapse.value ? '' : styles.isHidden
  189. ]}
  190. ref={collapseWrapRef}>
  191. <NSpace class={[styles.spaceSection]}>
  192. {catchStore.getAllMusicCategories.map((music: any) => (
  193. <NButton
  194. ref={musicCateRef}
  195. secondary={forms.bookVersionId === music.id}
  196. quaternary={forms.bookVersionId !== music.id}
  197. strong
  198. focusable={false}
  199. type={
  200. forms.bookVersionId === music.id
  201. ? 'primary'
  202. : 'default'
  203. }
  204. onClick={() => {
  205. forms.bookVersionId = music.id;
  206. onSearch();
  207. }}>
  208. {music.name}
  209. </NButton>
  210. ))}
  211. {line.value > 1 && (
  212. <div
  213. style={{
  214. height: 'var(--n-blank-height)',
  215. position: 'absolute',
  216. display: 'flex',
  217. alignItems: 'center'
  218. }}
  219. onClick={() => {
  220. setCollapse(!isCollapse.value);
  221. }}>
  222. <NImage
  223. previewDisabled
  224. src={isCollaose}
  225. class={[
  226. styles.collaoseBtn,
  227. isCollapse.value ? styles.isStart : ''
  228. ]}></NImage>
  229. </div>
  230. )}
  231. </NSpace>
  232. </div>
  233. </NFormItem>
  234. </div>
  235. )} */}
  236. <NFormItem label="乐器:">
  237. <NSpace
  238. class={[
  239. styles.spaceSection,
  240. styles.spaceSection2,
  241. 'spaceSectionBox'
  242. ]}>
  243. {catchStore.getSubjectInstruments.map((subject: any) =>
  244. subject.instruments && subject.instruments.length > 1 ? (
  245. <NPopselect
  246. options={subject.instruments}
  247. trigger="hover"
  248. scrollable
  249. v-model:value={forms.subjectId}
  250. onUpdate:value={() => {
  251. onSearch();
  252. }}
  253. key={subject.value}
  254. class={[styles.popSelect]}>
  255. <span
  256. class={[
  257. styles.textBtn,
  258. selectChildObj(subject.instruments).selected &&
  259. styles.textBtnActive
  260. ]}>
  261. {selectChildObj(subject.instruments).name || subject.name}
  262. <i class={styles.iconArrow}></i>
  263. </span>
  264. </NPopselect>
  265. ) : (
  266. <span
  267. class={[
  268. styles.textBtn,
  269. forms.subjectId === subject.value && styles.textBtnActive
  270. ]}
  271. onClick={() => {
  272. forms.subjectId = subject.value;
  273. onSearch();
  274. }}>
  275. {subject.name}
  276. </span>
  277. )
  278. )}
  279. </NSpace>
  280. </NFormItem>
  281. <TheSearch
  282. class={styles.inputSearch}
  283. round
  284. onSearch={(val: string) => {
  285. forms.name = val;
  286. throttleFn();
  287. }}
  288. />
  289. </NForm>
  290. </div>
  291. );
  292. }
  293. });