index.tsx 28 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813
  1. import {
  2. computed,
  3. defineComponent,
  4. onMounted,
  5. reactive,
  6. ref,
  7. watch
  8. } from 'vue';
  9. import styles from './index.module.less';
  10. import {
  11. NButton,
  12. NTooltip,
  13. NIcon,
  14. NImage,
  15. NModal,
  16. NScrollbar,
  17. NSpin,
  18. NTabPane,
  19. NTabs,
  20. useMessage,
  21. NPopselect
  22. } from 'naive-ui';
  23. import { usePrepareStore } from '/src/store/modules/prepareLessons';
  24. import add from '@/views/studentList/images/add.png';
  25. // import iconSlideRight from '../../../images/icon-slide-right.png';
  26. import CoursewareType from '../../../model/courseware-type';
  27. import TheEmpty from '/src/components/TheEmpty';
  28. import RelatedClass from '../../../model/related-class';
  29. import { modalClickMask, state } from '/src/state';
  30. import { useResizeObserver } from '@vueuse/core';
  31. import AttendClass from '/src/views/prepare-lessons/model/attend-class';
  32. import {
  33. api_addByOpenCourseware,
  34. api_teacherChapterLessonCoursewareRemove,
  35. teacherChapterLessonCoursewareList,
  36. courseScheduleStart
  37. } from '../../../api';
  38. import { useRoute, useRouter } from 'vue-router';
  39. import TheMessageDialog from '/src/components/TheMessageDialog';
  40. import { eventGlobal, fscreen } from '/src/utils';
  41. import PreviewWindow from '/src/views/preview-window';
  42. import Related from './related';
  43. import Train from '../train';
  44. import ResourceMain from '../../resource-main';
  45. export default defineComponent({
  46. name: 'courseware-presets',
  47. props: {
  48. addParam: {
  49. type: Object,
  50. default: () => ({})
  51. }
  52. },
  53. emits: ['change'],
  54. setup(props, { emit }) {
  55. const prepareStore = usePrepareStore();
  56. const message = useMessage();
  57. const route = useRoute();
  58. const router = useRouter();
  59. const localStorageSubjectId = localStorage.getItem(
  60. 'prepareLessonSubjectId'
  61. );
  62. const forms = reactive({
  63. // 选取参数带的,后取缓存
  64. leftWidth: '100%',
  65. rightWidth: '0',
  66. messageLoading: false,
  67. instrumentId: route.query.instrumentId
  68. ? Number(route.query.instrumentId)
  69. : localStorageSubjectId
  70. ? Number(localStorageSubjectId)
  71. : '',
  72. courseScheduleSubjectId: route.query.courseScheduleSubjectId,
  73. classGroupId: route.query.classGroupId,
  74. preStudentNum: route.query.preStudentNum,
  75. bodyWidth: '100%',
  76. loading: false,
  77. openLoading: false,
  78. showRelatedClass: false,
  79. tableList: [] as any,
  80. openTableShow: true, // 是否显示
  81. openTableList: [] as any,
  82. selectItem: {} as any,
  83. editTitleVisiable: false,
  84. editTitle: null,
  85. editBtnLoading: false,
  86. preRemoveVisiable: false,
  87. addVisiable: false, // 是否有添加的课件
  88. carouselIndex: 0,
  89. showAttendClass: false,
  90. attendClassType: 'change', //
  91. attendClassItem: {} as any,
  92. previewModal: false,
  93. previewParams: {
  94. type: '',
  95. courseId: '',
  96. instrumentId: '',
  97. detailId: ''
  98. } as any,
  99. workVisiable: false,
  100. wikiCategoryIdChild: null
  101. });
  102. const getCoursewareList = async () => {
  103. forms.loading = true;
  104. try {
  105. // 判断是否有选择对应的课件 或声部
  106. if (!prepareStore.getSelectKey) return (forms.loading = false);
  107. const { data } = await teacherChapterLessonCoursewareList({
  108. instrumentId: prepareStore.getInstrumentId,
  109. coursewareDetailKnowledgeId: prepareStore.getSelectKey
  110. });
  111. if (!Array.isArray(data)) {
  112. return;
  113. }
  114. const tempList: any = [];
  115. data.forEach((item: any) => {
  116. // const firstItem: any =
  117. // item.chapterKnowledgeList[0]?.chapterKnowledgeMaterialList[0];
  118. const firstItem: any =
  119. item.chapterKnowledgeList[0]?.chapterKnowledgeMaterialList;
  120. tempList.push({
  121. id: item.id,
  122. lessonPreTrainingId: item.lessonPreTrainingId,
  123. openFlag: item.openFlag,
  124. openFlagEnable: item.openFlagEnable,
  125. instrumentNames: item.instrumentNames,
  126. fromChapterLessonCoursewareId: item.fromChapterLessonCoursewareId,
  127. name: item.name,
  128. coverImg: firstItem && firstItem[0]?.bizInfo.coverImg,
  129. type: firstItem && firstItem[0]?.bizInfo.type,
  130. isNotWork: item.lessonPreTrainingNum <= 0 ? true : false // 是否布置作业
  131. });
  132. });
  133. forms.tableList = tempList;
  134. } catch {
  135. //
  136. }
  137. forms.loading = false;
  138. };
  139. // 监听选择的key 左侧选择了其它的课
  140. let timer: any = null;
  141. watch(
  142. () => [prepareStore.getSelectKey, prepareStore.getInstrumentId],
  143. async () => {
  144. clearTimeout(timer);
  145. timer = setTimeout(async () => {
  146. if (!prepareStore.getInstrumentId) {
  147. // 获取教材分类列表
  148. checkInstrumentIds();
  149. } else {
  150. getInitInstrumentId();
  151. }
  152. eventGlobal.emit('openCoursewareChanged');
  153. await getCoursewareList();
  154. subjectRef.value?.syncBarPosition();
  155. }, 100);
  156. }
  157. );
  158. watch(
  159. () => prepareStore.getInstrumentList,
  160. () => {
  161. checkInstrumentIds();
  162. }
  163. );
  164. const checkInstrumentIds = () => {
  165. const instrumentsList = prepareStore.getSingleInstrumentList;
  166. // 并且没有声部时才会更新
  167. if (instrumentsList.length > 0) {
  168. const prepareLessonCourseWareSubjectIsNull = sessionStorage.getItem(
  169. 'prepareLessonCourseWareSubjectIsNull'
  170. );
  171. if (prepareLessonCourseWareSubjectIsNull === 'true') {
  172. prepareStore.setInstrumentId('');
  173. return;
  174. }
  175. // 并且声部在列表中
  176. const localStorageSubjectId = localStorage.getItem(
  177. 'prepareLessonSubjectId'
  178. );
  179. // // 先取 上次上课声部,在取班级声部 最后取缓存
  180. let instrumentId = null;
  181. let index = -1;
  182. if (forms.courseScheduleSubjectId) {
  183. // 判断浏览器上面是否有
  184. index = instrumentsList.findIndex(
  185. (subject: any) => subject.id == forms.courseScheduleSubjectId
  186. );
  187. if (index >= 0) {
  188. instrumentId = Number(forms.courseScheduleSubjectId);
  189. }
  190. }
  191. // 判断班级上面声部 & 还没有声部
  192. if (forms.instrumentId && !instrumentId) {
  193. // 判断浏览器上面是否有
  194. index = instrumentsList.findIndex(
  195. (subject: any) => subject.id == forms.instrumentId
  196. );
  197. if (index >= 0) {
  198. instrumentId = Number(forms.instrumentId);
  199. }
  200. }
  201. // 缓存声部 & 还没有声部
  202. if (localStorageSubjectId && !instrumentId) {
  203. // 判断浏览器上面是否有
  204. index = instrumentsList.findIndex(
  205. (subject: any) => subject.id == localStorageSubjectId
  206. );
  207. if (index >= 0) {
  208. instrumentId = Number(localStorageSubjectId);
  209. }
  210. }
  211. // 判断是否选择为空
  212. if (instrumentId && index >= 0) {
  213. prepareStore.setSubjectId(instrumentId);
  214. // forms.instrumentId = instrumentId;
  215. } else {
  216. // 判断是否有缓存
  217. // prepareStore.setSubjectId(instrumentsList[0].id);
  218. // forms.instrumentId = instrumentsList[0].id;
  219. }
  220. // 保存
  221. localStorage.setItem(
  222. 'prepareLessonSubjectId',
  223. prepareStore.getInstrumentId as any
  224. );
  225. subjectRef.value?.syncBarPosition();
  226. }
  227. };
  228. const getInitInstrumentId = () => {
  229. let instrumentId: any = '';
  230. prepareStore.getInstrumentList.forEach((item: any) => {
  231. if (Array.isArray(item.instruments)) {
  232. item.instruments.forEach((child: any) => {
  233. if (child.id === prepareStore.getInstrumentId) {
  234. instrumentId = child.id;
  235. }
  236. });
  237. }
  238. });
  239. if (instrumentId) {
  240. forms.wikiCategoryIdChild = instrumentId;
  241. }
  242. };
  243. const subjectRef = ref();
  244. onMounted(async () => {
  245. useResizeObserver(
  246. document.querySelector('#presetsLeftRef') as HTMLElement,
  247. (entries: any) => {
  248. const entry = entries[0];
  249. const { width } = entry.contentRect;
  250. forms.leftWidth = width + 'px';
  251. }
  252. );
  253. useResizeObserver(
  254. document.querySelector('#presetsRightRef') as HTMLElement,
  255. (entries: any) => {
  256. const entry = entries[0];
  257. const { width } = entry.contentRect;
  258. forms.rightWidth = width + 'px';
  259. }
  260. );
  261. prepareStore.setClassGroupId(route.query.classGroupId as any);
  262. if (!prepareStore.getInstrumentId) {
  263. // 获取教材分类列表
  264. checkInstrumentIds();
  265. } else {
  266. getInitInstrumentId();
  267. }
  268. await getCoursewareList();
  269. if (props.addParam.isAdd) {
  270. forms.addVisiable = true;
  271. }
  272. });
  273. // 删除
  274. const onRemove = async () => {
  275. forms.messageLoading = true;
  276. try {
  277. await api_teacherChapterLessonCoursewareRemove({
  278. id: forms.selectItem.id
  279. });
  280. message.success('删除成功');
  281. getCoursewareList();
  282. // getOpenCoursewareList();
  283. eventGlobal.emit('openCoursewareChanged');
  284. forms.preRemoveVisiable = false;
  285. } catch {
  286. //
  287. }
  288. setTimeout(() => {
  289. forms.messageLoading = false;
  290. }, 100);
  291. };
  292. // 添加课件
  293. const onAddCourseware = async (item: any) => {
  294. if (forms.messageLoading) return;
  295. forms.messageLoading = true;
  296. try {
  297. await api_addByOpenCourseware({ id: item.id });
  298. message.success('添加成功');
  299. getCoursewareList();
  300. // getOpenCoursewareList();
  301. eventGlobal.emit('openCoursewareChanged');
  302. } catch {
  303. //
  304. }
  305. setTimeout(() => {
  306. forms.messageLoading = false;
  307. }, 100);
  308. };
  309. // 预览上课
  310. const onPreviewAttend = (id: string) => {
  311. // 判断是否在应用里面
  312. if (window.matchMedia('(display-mode: standalone)').matches) {
  313. state.application = window.matchMedia(
  314. '(display-mode: standalone)'
  315. ).matches;
  316. forms.previewModal = true;
  317. fscreen();
  318. forms.previewParams = {
  319. type: 'preview',
  320. courseId: id,
  321. instrumentId: prepareStore.getInstrumentId,
  322. detailId: prepareStore.getSelectKey,
  323. lessonCourseId: prepareStore.getBaseCourseware.id
  324. };
  325. } else {
  326. const { href } = router.resolve({
  327. path: '/attend-class',
  328. query: {
  329. type: 'preview',
  330. courseId: id,
  331. instrumentId: prepareStore.getInstrumentId,
  332. detailId: prepareStore.getSelectKey,
  333. lessonCourseId: prepareStore.getBaseCourseware.id
  334. }
  335. });
  336. window.open(href, +new Date() + '');
  337. }
  338. };
  339. const onStartClass = async (
  340. item: any,
  341. classGroupId: any,
  342. instrumentId?: any
  343. ) => {
  344. if (classGroupId) {
  345. // 开始上课
  346. const res = await courseScheduleStart({
  347. lessonCoursewareKnowledgeDetailId: prepareStore.selectKey,
  348. classGroupId: classGroupId,
  349. useChapterLessonCoursewareId: item.id
  350. // instrumentId: prepareStore.getInstrumentId
  351. });
  352. if (window.matchMedia('(display-mode: standalone)').matches) {
  353. state.application = window.matchMedia(
  354. '(display-mode: standalone)'
  355. ).matches;
  356. forms.previewModal = true;
  357. fscreen();
  358. forms.previewParams = {
  359. type: 'class',
  360. classGroupId: classGroupId,
  361. courseId: item.id,
  362. instrumentId: instrumentId || route.query.instrumentId,
  363. detailId: prepareStore.getSelectKey,
  364. classId: res.data,
  365. lessonCourseId: prepareStore.getBaseCourseware.id,
  366. preStudentNum: forms.preStudentNum
  367. };
  368. } else {
  369. const { href } = router.resolve({
  370. path: '/attend-class',
  371. query: {
  372. type: 'class',
  373. classGroupId: classGroupId,
  374. courseId: item.id,
  375. // instrumentId: prepareStore.getInstrumentId,
  376. instrumentId: instrumentId || route.query.instrumentId,
  377. detailId: prepareStore.getSelectKey,
  378. classId: res.data,
  379. lessonCourseId: prepareStore.getBaseCourseware.id,
  380. preStudentNum: forms.preStudentNum
  381. }
  382. });
  383. window.open(href, +new Date() + '');
  384. }
  385. } else {
  386. forms.showAttendClass = true;
  387. forms.attendClassType = 'change';
  388. forms.attendClassItem = item;
  389. }
  390. };
  391. const selectChildObj = (item: any) => {
  392. const obj: any = {};
  393. item?.forEach((child: any) => {
  394. if (child.id === forms.wikiCategoryIdChild) {
  395. obj.selected = true;
  396. obj.name = child.name;
  397. obj.label = child.name;
  398. }
  399. });
  400. return obj;
  401. };
  402. const tabInstrumentValue = computed(() => {
  403. let instrumentId: any = prepareStore.getInstrumentId
  404. ? prepareStore.getInstrumentId
  405. : '';
  406. prepareStore.getFormatInstrumentList.forEach((item: any) => {
  407. if (Array.isArray(item.instruments)) {
  408. item.instruments.forEach((child: any) => {
  409. if (child.id === prepareStore.getInstrumentId) {
  410. instrumentId = item.id + '';
  411. }
  412. });
  413. }
  414. });
  415. return instrumentId;
  416. });
  417. return () => (
  418. <div
  419. class={[
  420. styles.coursewarePresetsContainer,
  421. forms.openTableShow && styles.rightLineShow
  422. ]}>
  423. <div
  424. class={styles.presetsLeft}
  425. id="presetsLeftRef"
  426. style={{ width: `calc(${forms.leftWidth} - ${forms.rightWidth})` }}>
  427. <NTabs
  428. ref={subjectRef}
  429. defaultValue=""
  430. paneClass={styles.paneTitle}
  431. justifyContent="start"
  432. paneWrapperClass={styles.paneWrapperContainer}
  433. value={tabInstrumentValue.value}
  434. onUpdate:value={(val: any) => {
  435. prepareStore.getFormatInstrumentList.forEach((item: any) => {
  436. if (item.value.toString() === val.toString()) {
  437. prepareStore.setInstrumentId(val);
  438. // 保存
  439. forms.instrumentId = val;
  440. forms.wikiCategoryIdChild = null;
  441. }
  442. });
  443. if (!val) {
  444. prepareStore.setInstrumentId(val);
  445. // 保存
  446. forms.instrumentId = val;
  447. forms.wikiCategoryIdChild = null;
  448. sessionStorage.setItem(
  449. 'prepareLessonCourseWareSubjectIsNull',
  450. val ? 'false' : 'true'
  451. );
  452. }
  453. }}
  454. v-slots={{
  455. suffix: () => (
  456. <NButton
  457. class={styles.addBtn}
  458. type="primary"
  459. bordered={false}
  460. onClick={() => {
  461. eventGlobal.emit('teacher-slideshow', true);
  462. emit('change', {
  463. status: true,
  464. type: 'create'
  465. });
  466. }}>
  467. <NImage
  468. class={styles.addBtnIcon}
  469. previewDisabled
  470. src={add}></NImage>
  471. 创建课件
  472. </NButton>
  473. )
  474. }}>
  475. {[
  476. { name: '全部乐器', id: '', label: '全部乐器', value: '' },
  477. ...prepareStore.getFormatInstrumentList
  478. ].map((item: any, index: number) => (
  479. <NTabPane
  480. name={`${item.value}`}
  481. tab={item.label}
  482. disabled={item.instruments?.length > 0}
  483. displayDirective="if">
  484. {{
  485. tab: () =>
  486. item.instruments?.length > 0 ? (
  487. <NPopselect
  488. options={item.instruments}
  489. trigger="hover"
  490. v-model:value={forms.wikiCategoryIdChild}
  491. onUpdate:value={(val: any) => {
  492. // onSearch();
  493. prepareStore.setInstrumentId(val);
  494. // 保存
  495. forms.instrumentId = val;
  496. if (!val) {
  497. sessionStorage.setItem(
  498. 'prepareLessonCourseWareSubjectIsNull',
  499. val ? 'false' : 'true'
  500. );
  501. }
  502. }}
  503. key={item.id}
  504. class={styles.popSelect}>
  505. <span
  506. class={[
  507. styles.textBtn,
  508. selectChildObj(item.instruments).selected &&
  509. styles.textBtnActive
  510. ]}>
  511. {selectChildObj(item.instruments).label || item.label}
  512. <i class={styles.iconArrow}></i>
  513. </span>
  514. </NPopselect>
  515. ) : (
  516. item.label
  517. )
  518. }}
  519. </NTabPane>
  520. ))}
  521. </NTabs>
  522. <NSpin show={forms.loading}>
  523. <NScrollbar class={styles.coursewarePresets}>
  524. <div style={{ overflow: 'hidden' }}>
  525. <div
  526. class={[
  527. styles.list,
  528. !forms.loading &&
  529. forms.tableList.length <= 0 &&
  530. styles.listEmpty
  531. ]}>
  532. {forms.tableList.map((item: any) => (
  533. <div class={[styles.itemWrap, styles.itemBlock, 'row-nav']}>
  534. <div class={styles.itemWrapBox}>
  535. <CoursewareType
  536. operate
  537. isEditName
  538. item={item}
  539. onClick={() => onPreviewAttend(item.id)}
  540. // onEditName={() => {
  541. // forms.selectItem = item;
  542. // forms.editTitle = item.name;
  543. // forms.editTitleVisiable = true;
  544. // }}
  545. onEdit={() => {
  546. //
  547. eventGlobal.emit('teacher-slideshow', true);
  548. emit('change', {
  549. status: true,
  550. type: 'update',
  551. groupItem: { id: item.id }
  552. });
  553. }}
  554. onStartClass={() =>
  555. onStartClass(item, forms.classGroupId)
  556. }
  557. onDelete={() => {
  558. forms.selectItem = item;
  559. forms.preRemoveVisiable = true;
  560. }}
  561. // 布置作业
  562. onWork={() => {
  563. forms.workVisiable = true;
  564. forms.selectItem = item;
  565. }}
  566. />
  567. </div>
  568. </div>
  569. ))}
  570. {!forms.loading && forms.tableList.length <= 0 && (
  571. <TheEmpty
  572. class={styles.empty1}
  573. description="当前章节暂无课件,快点击右上角创建课件吧"
  574. />
  575. )}
  576. </div>
  577. </div>
  578. </NScrollbar>
  579. </NSpin>
  580. </div>
  581. <div class={styles.presetsRight} id="presetsRightRef">
  582. <NTooltip showArrow={false} animated={false} duration={0} delay={0}>
  583. {{
  584. trigger: () => (
  585. <div
  586. class={[
  587. styles.presetsArrar,
  588. !forms.openTableShow && styles.presetsArrarActive
  589. ]}
  590. onClick={() => (forms.openTableShow = !forms.openTableShow)}>
  591. <NIcon>
  592. <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
  593. <path
  594. d="M16.62 2.99a1.25 1.25 0 0 0-1.77 0L6.54 11.3a.996.996 0 0 0 0 1.41l8.31 8.31c.49.49 1.28.49 1.77 0s.49-1.28 0-1.77L9.38 12l7.25-7.25c.48-.48.48-1.28-.01-1.76z"
  595. fill="currentColor"></path>
  596. </svg>
  597. </NIcon>
  598. </div>
  599. ),
  600. default: () => <div>{forms.openTableShow ? '收起' : '展开'}</div>
  601. }}
  602. </NTooltip>
  603. <Related
  604. onMore={() => (forms.showRelatedClass = true)}
  605. onAdd={(item: any) => {
  606. onAddCourseware(item);
  607. }}
  608. onLook={(item: any) => {
  609. onPreviewAttend(item.id);
  610. }}
  611. />
  612. </div>
  613. {/* )} */}
  614. <NModal
  615. maskClosable={modalClickMask}
  616. v-model:show={forms.showRelatedClass}
  617. preset="card"
  618. showIcon={false}
  619. class={['modalTitle background', styles.attendClassModal1]}
  620. title={'相关课件'}
  621. blockScroll={false}>
  622. <RelatedClass
  623. tableList={forms.tableList}
  624. instrumentList={prepareStore.getInstrumentList}
  625. instrumentId={prepareStore.getInstrumentId as any}
  626. coursewareDetailKnowledgeId={prepareStore.getSelectKey}
  627. onClose={() => (forms.showRelatedClass = false)}
  628. onAdd={(item: any) => onAddCourseware(item)}
  629. onClick={(item: any) => {
  630. onPreviewAttend(item.id);
  631. forms.showRelatedClass = false;
  632. }}
  633. />
  634. </NModal>
  635. {/* <NModal
  636. v-model:show={forms.editTitleVisiable}
  637. preset="card"
  638. class={['modalTitle', styles.removeVisiable1]}
  639. title={'课件重命名'}>
  640. <div class={styles.studentRemove}>
  641. <NInput
  642. placeholder="请输入课件名称"
  643. v-model:value={forms.editTitle}
  644. maxlength={15}
  645. onKeyup={(e: any) => {
  646. if (e.code === 'ArrowLeft' || e.code === 'ArrowRight') {
  647. e.stopPropagation();
  648. }
  649. }}
  650. />
  651. <NSpace class={styles.btnGroupModal} justify="center">
  652. <NButton round onClick={() => (forms.editTitleVisiable = false)}>
  653. 取消
  654. </NButton>
  655. <NButton
  656. round
  657. type="primary"
  658. onClick={onEditTitleSubmit}
  659. loading={forms.editBtnLoading}>
  660. 确定
  661. </NButton>
  662. </NSpace>
  663. </div>
  664. </NModal> */}
  665. <NModal
  666. maskClosable={modalClickMask}
  667. v-model:show={forms.preRemoveVisiable}
  668. preset="card"
  669. class={['modalTitle', styles.removeVisiable1]}
  670. title={'删除课件'}>
  671. <TheMessageDialog
  672. content={`<p style="text-align: left;">请确认是否删除【${forms.selectItem.name}】,删除后不可恢复</p>`}
  673. cancelButtonText="取消"
  674. confirmButtonText="确认"
  675. loading={forms.messageLoading}
  676. onClose={() => (forms.preRemoveVisiable = false)}
  677. onConfirm={() => onRemove()}
  678. />
  679. </NModal>
  680. <NModal
  681. maskClosable={modalClickMask}
  682. v-model:show={forms.addVisiable}
  683. preset="card"
  684. class={['modalTitle', styles.removeVisiable1]}
  685. title={'保存成功'}>
  686. <TheMessageDialog
  687. content={`<p style="text-align: left;">【${props.addParam.name}】暂未设置课件作业,是否现在去设置课件作业</p>`}
  688. cancelButtonText="稍后设置"
  689. confirmButtonText="立即设置"
  690. // loading={forms.messageLoading}
  691. onClose={() => (forms.addVisiable = false)}
  692. onConfirm={() => {
  693. forms.addVisiable = false;
  694. forms.workVisiable = true;
  695. forms.selectItem = {
  696. id: props.addParam.id,
  697. name: props.addParam.name
  698. };
  699. }}
  700. />
  701. </NModal>
  702. {/* 应用内预览或上课 */}
  703. <PreviewWindow
  704. v-model:show={forms.previewModal}
  705. type="attend"
  706. params={forms.previewParams}
  707. />
  708. <NModal
  709. maskClosable={modalClickMask}
  710. v-model:show={forms.showAttendClass}
  711. preset="card"
  712. showIcon={false}
  713. class={['modalTitle background', styles.attendClassModal]}
  714. title={'选择班级'}
  715. blockScroll={false}>
  716. <AttendClass
  717. onClose={() => (forms.showAttendClass = false)}
  718. type={forms.attendClassType}
  719. onPreview={(item: any) => {
  720. if (window.matchMedia('(display-mode: standalone)').matches) {
  721. state.application = window.matchMedia(
  722. '(display-mode: standalone)'
  723. ).matches;
  724. forms.previewModal = true;
  725. forms.previewParams = {
  726. ...item
  727. };
  728. } else {
  729. const { href } = router.resolve({
  730. path: '/attend-class',
  731. query: {
  732. ...item
  733. }
  734. });
  735. window.open(href, +new Date() + '');
  736. }
  737. }}
  738. onConfirm={async (item: any) => {
  739. onStartClass(
  740. forms.attendClassItem,
  741. item.classGroupId,
  742. item.instrumentId
  743. );
  744. }}
  745. />
  746. </NModal>
  747. <NModal
  748. maskClosable={modalClickMask}
  749. v-model:show={forms.workVisiable}
  750. preset="card"
  751. class={['modalTitle background', styles.workVisiable]}
  752. title={
  753. forms.selectItem.lessonPreTrainingId ? '编辑作业' : '创建作业'
  754. }>
  755. <div id="model-homework-height" class={styles.workContainer}>
  756. <div class={styles.workTrain}>
  757. <Train
  758. cardType="prepare"
  759. lessonPreTraining={{
  760. title: forms.selectItem.name + '-课后作业',
  761. chapterId: forms.selectItem.id, // 课件编号
  762. id: forms.selectItem.lessonPreTrainingId // 作业编号
  763. }}
  764. onChange={(val: any) => {
  765. forms.workVisiable = val.status;
  766. getCoursewareList();
  767. }}
  768. />
  769. </div>
  770. <div class={styles.resourceMain}>
  771. <ResourceMain cardType="prepare" />
  772. </div>
  773. </div>
  774. </NModal>
  775. </div>
  776. );
  777. }
  778. });