search-group-resources.tsx 8.7 KB

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