123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269 |
- import { defineComponent, nextTick, onMounted, reactive, ref } from 'vue';
- import styles from './index.module.less';
- import {
- NButton,
- NForm,
- NFormItem,
- NImage,
- NPopselect,
- NSpace
- } from 'naive-ui';
- import iconAdd from '../../images/icon-add.png';
- import TheSearch from '/src/components/TheSearch';
- import { resourceTypeArray } from '/src/utils/searchArray';
- import { useCatchStore } from '/src/store/modules/catchData';
- import isCollaose from '../../images/isCollaose.png';
- export default defineComponent({
- name: 'search-group',
- emits: ['search', 'add'],
- expose: ['init'],
- setup(props, { emit }) {
- const catchStore = useCatchStore();
- const forms = reactive({
- type: 'MUSIC', //
- name: '',
- bookVersionId: null,
- subjectId: null
- });
- const state = reactive({
- tempSubjectId: null
- });
- const onSearch = () => {
- emit('search', forms);
- };
- const collapseWrapRef = ref();
- const divDomList = ref([] as any);
- const orginHeight = ref(0);
- const line = ref(0);
- const isCollapse = ref(false);
- const loadingCollapse = ref(false); // 是否加载完成
- const musicCateRef = (el: any) => {
- if (el?.selfElRef) {
- divDomList.value.push(el.selfElRef.parentNode);
- }
- };
- const setCollapse = (flag: boolean) => {
- isCollapse.value = flag;
- getLive();
- };
- const getLive = () => {
- try {
- divDomList.value = [...new Set(divDomList.value)];
- let offsetLeft = -1;
- divDomList.value.forEach((item: any, index: number) => {
- if (index === 0) {
- line.value = 1;
- offsetLeft = item.offsetLeft;
- } else if (item.offsetLeft === offsetLeft && index != 0) {
- // 如果某个标签的offsetLeft和第一个标签的offsetLeft相等 说明增加了一行
- line.value++;
- }
- if (!isCollapse.value) {
- if (line.value > 1) {
- //从第3行开始 隐藏标签
- item.style.display = 'none';
- // 显示展开按钮 class名chu是在前面动态添加的
- } else {
- item.style.display = 'block';
- }
- } else {
- item.style.display = 'block';
- }
- });
- loadingCollapse.value = true;
- } catch {
- //
- }
- };
- const selectChildObj = (item: any) => {
- const obj: any = {};
- item?.forEach((child: any) => {
- if (child.id === forms.subjectId) {
- obj.selected = true;
- obj.name = child.name;
- }
- });
- return obj;
- };
- onMounted(async () => {
- // console.log('加载');
- // 获取教材分类列表
- await catchStore.getMusicSheetCategory();
- // 获取声部列表
- await catchStore.getSubjects();
- if (forms.type === 'MUSIC') {
- orginHeight.value = collapseWrapRef.value?.offsetHeight;
- // hiddenHeight.value = collapseWrapRef.value.offsetHeight / line.value;
- // 默认隐藏
- getLive();
- }
- });
- return () => (
- <div class={styles.searchGroup}>
- <div class={[styles.searchCatatory]}>
- <NSpace size="small" class={styles.btnType}>
- {resourceTypeArray.map((item: any) => (
- <NButton
- type={forms.type === item.value ? 'primary' : 'default'}
- secondary={forms.type === item.value ? false : true}
- round
- size="small"
- focusable={false}
- onClick={() => {
- forms.type = item.value;
- forms.subjectId = null;
- onSearch();
- nextTick(() => {
- if (forms.type === 'MUSIC') {
- orginHeight.value = collapseWrapRef.value?.offsetHeight;
- // hiddenHeight.value =
- // collapseWrapRef.value.offsetHeight / line.value || 0;
- // 默认隐藏
- getLive();
- } else {
- divDomList.value = [];
- }
- });
- }}>
- {item.label}
- </NButton>
- ))}
- </NSpace>
- {/* <NButton
- type="primary"
- class={styles.addTrain}
- focusable={false}
- strong
- onClick={() => emit('add')}>
- <img src={iconAdd} />
- 添加自定义教材
- </NButton> */}
- </div>
- <NForm labelAlign="left" labelPlacement="left">
- {forms.type === 'MUSIC' && (
- <div class={[styles.collapsSection]}>
- <NFormItem label="教材:">
- <div
- class={[
- styles.collapseWrap,
- loadingCollapse.value ? '' : styles.hideButton,
- isCollapse.value ? '' : styles.isHidden
- ]}
- ref={collapseWrapRef}>
- <NSpace class={[styles.spaceSection2]}>
- {catchStore.getAllMusicCategories.map((music: any) => (
- <NButton
- ref={musicCateRef}
- secondary={forms.bookVersionId === music.id}
- quaternary={forms.bookVersionId !== music.id}
- strong
- focusable={false}
- type={
- forms.bookVersionId === music.id
- ? 'primary'
- : 'default'
- }
- onClick={() => {
- forms.bookVersionId = music.id;
- onSearch();
- }}>
- {music.name}
- </NButton>
- ))}
- {line.value > 1 && (
- <div
- style={{
- position: 'absolute',
- display: 'flex',
- alignItems: 'center'
- }}
- onClick={() => {
- setCollapse(!isCollapse.value);
- }}>
- <NImage
- previewDisabled
- src={isCollaose}
- class={[
- styles.collaoseBtn,
- isCollapse.value ? styles.isStart : ''
- ]}></NImage>
- </div>
- )}
- </NSpace>
- </div>
- </NFormItem>
- </div>
- )}
- <NFormItem label="声部:">
- <NSpace class={styles.spaceSection}>
- {catchStore.getSubjectInstruments.map((subject: any) =>
- subject.instruments &&
- subject.instruments.length > 1 &&
- forms.type === 'MUSIC' ? (
- <NPopselect
- options={subject.instruments}
- trigger="hover"
- v-model:value={state.tempSubjectId}
- onUpdate:value={() => {
- if (forms.type === 'MUSIC') {
- forms.subjectId = state.tempSubjectId;
- }
- onSearch();
- }}
- key={subject.value}
- class={[styles.popSelect]}>
- <span
- class={[
- styles.textBtn,
- selectChildObj(subject.instruments).selected &&
- styles.textBtnActive
- ]}>
- {selectChildObj(subject.instruments).name || subject.name}
- <i class={styles.iconArrow}></i>
- </span>
- </NPopselect>
- ) : (
- <span
- class={[
- styles.textBtn,
- (forms.type === 'MUSIC'
- ? forms.subjectId === subject.value
- : forms.subjectId === subject.id) &&
- styles.textBtnActive
- ]}
- onClick={() => {
- if (forms.type === 'MUSIC') {
- forms.subjectId = subject.value;
- } else {
- forms.subjectId = subject.id;
- }
- state.tempSubjectId = null;
- onSearch();
- }}>
- {subject.name}
- </span>
- )
- )}
- </NSpace>
- </NFormItem>
- <TheSearch
- class={styles.inputSearch}
- round
- onSearch={(val: string) => {
- forms.name = val;
- onSearch();
- }}
- />
- </NForm>
- </div>
- );
- }
- });
|