SelectCourse.vue 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209
  1. <template>
  2. <el-dialog class="select-course" :visible="dialogVisible" width="1100px" :title="$t('Key373')" @close="dialogClose">
  3. <div>
  4. <el-dropdown trigger="click" placement="top" @command="selectBook">
  5. <span class="el-dropdown-link">{{ curBook.book_name }} <i class="el-icon-arrow-down"></i></span>
  6. <el-dropdown-menu slot="dropdown">
  7. <el-dropdown-item v-for="item in book_list" :key="item.book_id" :command="item">
  8. {{ item.book_name }}
  9. </el-dropdown-item>
  10. </el-dropdown-menu>
  11. </el-dropdown>
  12. </div>
  13. <!--课件内容及章节结构-->
  14. <div class="content-structure">
  15. <div class="content-structure-tree">
  16. <TreeMenus ref="tree" :current-course="currentCourse" :list="nodes" @curCourse="curCourse" />
  17. </div>
  18. <div
  19. class="content-structure-container"
  20. :style="{ 'min-width': `${category === 'NPC' || category === 'NNPE' ? '885px' : ''}` }"
  21. >
  22. <template v-if="category === 'NPC'">
  23. <booknpc
  24. v-if="context"
  25. ref="book"
  26. :context="context"
  27. task-model=""
  28. :is-show-save="false"
  29. :is-show-title="false"
  30. :theme-color="themeColor"
  31. :preview-type="previewType"
  32. :preview-group-id="previewGroupId"
  33. :current-tree-i-d="courseID"
  34. />
  35. </template>
  36. <template v-if="category === 'NNPE'">
  37. <booknnpe
  38. v-if="context"
  39. ref="book"
  40. :context="context"
  41. :theme-color="themeColor"
  42. task-model=""
  43. :is-show-save="false"
  44. :is-show-title="false"
  45. :preview-type="previewType"
  46. :preview-group-id="previewGroupId"
  47. :current-tree-i-d="courseID"
  48. />
  49. </template>
  50. <template v-if="category === 'RLC'">
  51. <bookrlc
  52. v-if="context"
  53. :context="context"
  54. :theme-color="themeColor"
  55. :book-font-size="bookFontSize"
  56. :current-tree-i-d="courseID"
  57. :preview-type="previewType"
  58. :preview-group-id="previewGroupId"
  59. />
  60. </template>
  61. </div>
  62. </div>
  63. <div slot="footer">
  64. <el-button size="mini" @click="dialogClose">
  65. {{ $t('Key83') }}
  66. </el-button>
  67. <el-button type="primary" size="mini" @click="confirm">
  68. {{ $t('Key94') }}
  69. </el-button>
  70. </div>
  71. </el-dialog>
  72. </template>
  73. <script>
  74. export default {
  75. name: 'SelectCourse'
  76. };
  77. </script>
  78. <script setup>
  79. import { inject, ref, unref, watch, watchEffect, computed } from 'vue';
  80. import { GetCourseBookListByCSItemID } from '@/api/select';
  81. import { GetBookChapterStruct } from '@/api/course';
  82. import { useShowCourseware } from '@/components/course/courseware';
  83. import { Message } from 'element-ui';
  84. import TreeMenus from './treeMenus.vue';
  85. let cs_item_id = inject('cs_item_id');
  86. let $t = inject('$t');
  87. const props = defineProps({
  88. dialogVisible: {
  89. type: Boolean,
  90. required: true
  91. }
  92. });
  93. const emits = defineEmits(['dialogClose', 'selectCourse']);
  94. let curBook = ref({});
  95. let currentCourse = ref('');
  96. let courseID = computed(() => currentCourse.value);
  97. let book_list = ref([]);
  98. let nodes = ref([]);
  99. watch(
  100. () => curBook.value,
  101. () => {
  102. getBookChapterStruct();
  103. }
  104. );
  105. watch(
  106. () => props.dialogVisible,
  107. (newVal) => {
  108. if (newVal && book_list.value.length === 0) {
  109. Message.warning($t('Key383'));
  110. dialogClose();
  111. }
  112. }
  113. );
  114. let { context, category, themeColor, bookFontSize, previewType, previewGroupId, getCoursewareContent_View } =
  115. useShowCourseware(courseID);
  116. function dialogClose() {
  117. emits('dialogClose');
  118. }
  119. let book = ref();
  120. function confirm() {
  121. if (category.value === 'NPC' || category.value === 'NNPE') {
  122. emits('selectCourse', currentCourse.value, book.value.submitPreviewGroupId());
  123. } else {
  124. emits('selectCourse', currentCourse.value);
  125. }
  126. currentCourse.value = '';
  127. }
  128. watchEffect(() => {
  129. if (unref(cs_item_id)) {
  130. GetCourseBookListByCSItemID({ cs_item_id: unref(cs_item_id) }).then(({ book_list: list }) => {
  131. book_list.value = list;
  132. if (book_list.value.length > 0) {
  133. curBook.value = book_list.value[0];
  134. }
  135. });
  136. }
  137. });
  138. function curCourse(val, is_courseware) {
  139. currentCourse.value = val;
  140. if (is_courseware) getCoursewareContent_View();
  141. }
  142. function getBookChapterStruct() {
  143. GetBookChapterStruct({ book_id: curBook.value.book_id }).then(({ nodes: data }) => {
  144. nodes.value = data;
  145. });
  146. }
  147. function selectBook(book) {
  148. curBook.value = book;
  149. }
  150. </script>
  151. <style lang="scss">
  152. .select-course {
  153. .el-dialog__body {
  154. height: 55vh;
  155. padding: 15px 20px 0;
  156. color: $color;
  157. }
  158. .el-dialog__title {
  159. font-weight: 700;
  160. }
  161. .el-dropdown-link {
  162. font-size: 24px;
  163. font-weight: 600;
  164. color: $color;
  165. cursor: pointer;
  166. }
  167. .content-structure {
  168. display: flex;
  169. height: calc(100% - 36px);
  170. margin-top: 8px;
  171. &-tree {
  172. flex: 2.8;
  173. height: 100%;
  174. padding: 0 4px 0 8px;
  175. overflow: auto;
  176. }
  177. &-container {
  178. flex: 7;
  179. padding: 0 8px;
  180. overflow: auto;
  181. }
  182. }
  183. }
  184. </style>