search-group-resources.tsx 8.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269
  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. onSearch();
  116. nextTick(() => {
  117. if (forms.type === 'MUSIC') {
  118. orginHeight.value = collapseWrapRef.value?.offsetHeight;
  119. // hiddenHeight.value =
  120. // collapseWrapRef.value.offsetHeight / line.value || 0;
  121. // 默认隐藏
  122. getLive();
  123. } else {
  124. divDomList.value = [];
  125. }
  126. });
  127. }}>
  128. {item.label}
  129. </NButton>
  130. ))}
  131. </NSpace>
  132. {/* <NButton
  133. type="primary"
  134. class={styles.addTrain}
  135. focusable={false}
  136. strong
  137. onClick={() => emit('add')}>
  138. <img src={iconAdd} />
  139. 添加自定义教材
  140. </NButton> */}
  141. </div>
  142. <NForm labelAlign="left" labelPlacement="left">
  143. {forms.type === 'MUSIC' && (
  144. <div class={[styles.collapsSection]}>
  145. <NFormItem label="教材:">
  146. <div
  147. class={[
  148. styles.collapseWrap,
  149. loadingCollapse.value ? '' : styles.hideButton,
  150. isCollapse.value ? '' : styles.isHidden
  151. ]}
  152. ref={collapseWrapRef}>
  153. <NSpace class={[styles.spaceSection2]}>
  154. {catchStore.getAllMusicCategories.map((music: any) => (
  155. <NButton
  156. ref={musicCateRef}
  157. secondary={forms.bookVersionId === music.id}
  158. quaternary={forms.bookVersionId !== music.id}
  159. strong
  160. focusable={false}
  161. type={
  162. forms.bookVersionId === music.id
  163. ? 'primary'
  164. : 'default'
  165. }
  166. onClick={() => {
  167. forms.bookVersionId = music.id;
  168. onSearch();
  169. }}>
  170. {music.name}
  171. </NButton>
  172. ))}
  173. {line.value > 1 && (
  174. <div
  175. style={{
  176. position: 'absolute',
  177. display: 'flex',
  178. alignItems: 'center'
  179. }}
  180. onClick={() => {
  181. setCollapse(!isCollapse.value);
  182. }}>
  183. <NImage
  184. previewDisabled
  185. src={isCollaose}
  186. class={[
  187. styles.collaoseBtn,
  188. isCollapse.value ? styles.isStart : ''
  189. ]}></NImage>
  190. </div>
  191. )}
  192. </NSpace>
  193. </div>
  194. </NFormItem>
  195. </div>
  196. )}
  197. <NFormItem label="声部:">
  198. <NSpace class={styles.spaceSection}>
  199. {catchStore.getSubjectInstruments.map((subject: any) =>
  200. subject.instruments &&
  201. subject.instruments.length > 1 &&
  202. forms.type === 'MUSIC' ? (
  203. <NPopselect
  204. options={subject.instruments}
  205. trigger="hover"
  206. v-model:value={state.tempSubjectId}
  207. onUpdate:value={() => {
  208. if (forms.type === 'MUSIC') {
  209. forms.subjectId = state.tempSubjectId;
  210. }
  211. onSearch();
  212. }}
  213. key={subject.value}
  214. class={[styles.popSelect]}>
  215. <span
  216. class={[
  217. styles.textBtn,
  218. selectChildObj(subject.instruments).selected &&
  219. styles.textBtnActive
  220. ]}>
  221. {selectChildObj(subject.instruments).name || subject.name}
  222. <i class={styles.iconArrow}></i>
  223. </span>
  224. </NPopselect>
  225. ) : (
  226. <span
  227. class={[
  228. styles.textBtn,
  229. (forms.type === 'MUSIC'
  230. ? forms.subjectId === subject.value
  231. : forms.subjectId === subject.id) &&
  232. styles.textBtnActive
  233. ]}
  234. onClick={() => {
  235. if (forms.type === 'MUSIC') {
  236. forms.subjectId = subject.value;
  237. } else {
  238. forms.subjectId = subject.id;
  239. }
  240. state.tempSubjectId = null;
  241. onSearch();
  242. }}>
  243. {subject.name}
  244. </span>
  245. )
  246. )}
  247. </NSpace>
  248. </NFormItem>
  249. <TheSearch
  250. class={styles.inputSearch}
  251. round
  252. onSearch={(val: string) => {
  253. forms.name = val;
  254. onSearch();
  255. }}
  256. />
  257. </NForm>
  258. </div>
  259. );
  260. }
  261. });