index.tsx 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213
  1. import { defineComponent, onMounted, onUnmounted, reactive, watch } from 'vue';
  2. import styles from './index.module.less';
  3. import { NCascader, NInput, NScrollbar, NSelect, NSpin } from 'naive-ui';
  4. import { useThrottleFn } from '@vueuse/core';
  5. import CoursewareType from '../courseware-type';
  6. import TheEmpty from '/src/components/TheEmpty';
  7. import { api_queryOpenCoursewareByPage } from '../../api';
  8. import { eventGlobal } from '/src/utils';
  9. export default defineComponent({
  10. name: 'related-class',
  11. props: {
  12. tableList: {
  13. type: Array,
  14. default: () => []
  15. },
  16. instrumentList: {
  17. type: Array,
  18. default: () => []
  19. },
  20. instrumentId: {
  21. type: [String, Number],
  22. default: ''
  23. },
  24. coursewareDetailKnowledgeId: {
  25. type: [String, Number],
  26. default: ''
  27. }
  28. },
  29. emits: ['close', 'add', 'click'],
  30. setup(props, { emit }) {
  31. const forms = reactive({
  32. loading: false,
  33. finshed: false, // 是否加载完
  34. pagination: {
  35. page: 1,
  36. rows: 20
  37. },
  38. tableList: [] as any,
  39. searchGroup: {
  40. instrumentId: props.instrumentId ? Number(props.instrumentId) : '',
  41. keyword: null
  42. }
  43. });
  44. const getList = async () => {
  45. try {
  46. if (forms.pagination.page === 1) {
  47. forms.loading = true;
  48. }
  49. // 查询公开课件列表
  50. const { data } = await api_queryOpenCoursewareByPage({
  51. coursewareDetailKnowledgeId: props.coursewareDetailKnowledgeId,
  52. ...forms.searchGroup,
  53. ...forms.pagination
  54. });
  55. const result = data.rows || [];
  56. const tempList: any = [];
  57. result.forEach((item: any) => {
  58. // const index = forms.tableList.findIndex(
  59. // (i: any) => i.fromChapterLessonCoursewareId === item.id
  60. // );
  61. const firstItem: any =
  62. item.chapterKnowledgeList[0]?.chapterKnowledgeMaterialList[0];
  63. tempList.push({
  64. id: item.id,
  65. openFlag: item.openFlag,
  66. openFlagEnable: item.openFlagEnable,
  67. subjectNames: item.subjectNames,
  68. fromChapterLessonCoursewareId: item.fromChapterLessonCoursewareId,
  69. name: item.name,
  70. coverImg: firstItem?.bizInfo.coverImg,
  71. type: firstItem?.bizInfo.type,
  72. isAdd: item.addFlag,
  73. isNotWork: item.lessonPreTrainingNum <= 0 ? true : false // 是否布置作业
  74. });
  75. });
  76. forms.loading = false;
  77. forms.tableList.push(...tempList);
  78. forms.finshed = data.pages <= data.current ? true : false;
  79. } catch {
  80. forms.loading = false;
  81. }
  82. };
  83. // 检测数据是否存在
  84. // watch(
  85. // () => props.tableList,
  86. // () => {
  87. // // fromChapterLessonCoursewareId;
  88. // forms.tableList.forEach((item: any) => {
  89. // const index = props.tableList.findIndex(
  90. // (i: any) => i.fromChapterLessonCoursewareId === item.id
  91. // );
  92. // item.isAdd = index !== -1 ? true : false;
  93. // });
  94. // }
  95. // );
  96. const throttleFn = useThrottleFn(() => {
  97. forms.pagination.page = 1;
  98. forms.tableList = [];
  99. getList();
  100. }, 500);
  101. onMounted(() => {
  102. getList();
  103. eventGlobal.on('openCoursewareChanged', throttleFn);
  104. });
  105. onUnmounted(() => {
  106. eventGlobal.off('openCoursewareChanged', throttleFn);
  107. });
  108. return () => (
  109. <div class={styles.relatedClass}>
  110. <div class={styles.attendClassSearch}>
  111. <NCascader
  112. placeholder="全部声部"
  113. clearable
  114. options={[
  115. { name: '全部声部', id: '' },
  116. ...(props.instrumentList as any)
  117. ]}
  118. v-model:value={forms.searchGroup.instrumentId}
  119. onUpdate:value={() => throttleFn()}
  120. checkStrategy="child"
  121. showPath
  122. childrenField="instruments"
  123. expandTrigger="hover"
  124. labelField="name"
  125. valueField="id"
  126. filterable
  127. style={{ width: '200px' }}
  128. />
  129. <NInput
  130. placeholder="请输入课件标题关键词"
  131. clearable
  132. v-model:value={forms.searchGroup.keyword}
  133. onKeyup={(e: KeyboardEvent) => {
  134. if (e.code === 'Enter') {
  135. throttleFn();
  136. }
  137. }}
  138. onClear={() => throttleFn()}>
  139. {{
  140. prefix: () => (
  141. <span
  142. class="icon-search-input"
  143. style={{ cursor: 'pointer' }}
  144. onClick={() => throttleFn()}></span>
  145. )
  146. }}
  147. </NInput>
  148. </div>
  149. <NSpin show={forms.loading} size={'small'}>
  150. <NScrollbar
  151. class={styles.classList}
  152. style={{
  153. 'max-height': `60vh`
  154. }}
  155. onScroll={(e: any) => {
  156. const clientHeight = e.target?.clientHeight;
  157. const scrollTop = e.target?.scrollTop;
  158. const scrollHeight = e.target?.scrollHeight;
  159. // 是否到底,是否加载完
  160. if (
  161. clientHeight + scrollTop + 20 >= scrollHeight &&
  162. !forms.finshed &&
  163. !forms.loading
  164. ) {
  165. throttleFn();
  166. }
  167. }}>
  168. <div
  169. style={{
  170. 'min-height': `60vh)`
  171. }}
  172. class={[
  173. styles.listSection,
  174. !forms.loading && forms.tableList.length <= 0
  175. ? styles.emptySection
  176. : ''
  177. ]}>
  178. {forms.tableList.length > 0 && (
  179. <div class={[styles.list]}>
  180. {forms.tableList.map((item: any) => (
  181. <div class={[styles.itemWrap, styles.itemBlock, 'row-nav']}>
  182. <div class={styles.itemWrapBox}>
  183. <CoursewareType
  184. isHoverShowAdd={false}
  185. isShowOpenFlag={false}
  186. isShowAdd
  187. item={item}
  188. onAdd={() => {
  189. emit('add', item);
  190. }}
  191. onLook={() => emit('click', item)}
  192. />
  193. </div>
  194. </div>
  195. ))}
  196. </div>
  197. )}
  198. {!forms.loading && forms.tableList.length <= 0 && <TheEmpty />}
  199. </div>
  200. </NScrollbar>
  201. </NSpin>
  202. </div>
  203. );
  204. }
  205. });