|
|
@@ -100,8 +100,8 @@
|
|
|
<aside v-if="!sidebarShow" class="sidebar-bar">
|
|
|
<aside class="toolbar">
|
|
|
<div class="toolbar-special">
|
|
|
- <!-- <img :src="require('@/assets/icon/sidebar-fullscreen.png')" alt="全屏" />
|
|
|
- <img :src="require('@/assets/icon/sidebar-toolkit.png')" alt="工具箱" /> -->
|
|
|
+ <img :src="require('@/assets/icon/sidebar-fullscreen.png')" alt="全屏" @click="fullScreen" />
|
|
|
+ <img :src="require('@/assets/icon/sidebar-toolkit.png')" alt="工具箱" />
|
|
|
<img :src="require(`@/assets/icon/arrow-down.png`)" alt="伸缩" @click="toggleSidebarShow" />
|
|
|
</div>
|
|
|
</aside>
|
|
|
@@ -120,17 +120,17 @@
|
|
|
</div>
|
|
|
<div v-if="sidebarShow" class="toolbar-list">
|
|
|
<div
|
|
|
- v-for="{ icon, title, handle, param } in sidebarIconList"
|
|
|
+ v-for="{ icon, title, handle, param, children } in sidebarIconList"
|
|
|
:key="icon"
|
|
|
:class="['sidebar-item', { active: curToolbarIcon === icon }]"
|
|
|
:title="title"
|
|
|
- @click="handleSidebarClick(handle, param, icon)"
|
|
|
+ @click="handleSidebarClick(handle, param, icon, children)"
|
|
|
>
|
|
|
<div
|
|
|
class="sidebar-icon icon-mask"
|
|
|
:style="{
|
|
|
backgroundColor: curToolbarIcon === icon ? '#fff' : '#1E2129',
|
|
|
- maskImage: `url(${require(`@/assets/icon/sidebar-${icon}.png`)})`,
|
|
|
+ maskImage: `url(${require(`@/assets/icon/sidebar-${icon}.svg`)})`,
|
|
|
}"
|
|
|
></div>
|
|
|
</div>
|
|
|
@@ -168,43 +168,115 @@
|
|
|
</el-table>
|
|
|
</div>
|
|
|
</div>
|
|
|
- <template v-if="curToolbarIcon === 'audit'">
|
|
|
- <AuditRemark :remark-list="remark_list" :is-audit="isShowAudit" @deleteRemarks="deleteRemarks" />
|
|
|
- </template>
|
|
|
- <div v-if="['image', 'audio', 'video'].includes(curToolbarIcon)" class="resource_box">
|
|
|
- <h5>{{ drawerTitle }}</h5>
|
|
|
+ <!-- <div v-if="curToolbarIcon === 'totalResources'" class="resource_box"></div> -->
|
|
|
+ <div v-if="['image', 'audio', 'video'].includes(twoCurToolbarIcon)" class="resource_box">
|
|
|
+ <div class="source-toolbar-list">
|
|
|
+ <div
|
|
|
+ v-for="{ icon, title, handle, param } in twoSidebarList"
|
|
|
+ :key="icon"
|
|
|
+ :class="['sidebar-item', { active: twoCurToolbarIcon === icon }]"
|
|
|
+ :title="title"
|
|
|
+ @click="handleSidebarClick(handle, param, icon, '', 2)"
|
|
|
+ >
|
|
|
+ <div
|
|
|
+ class="sidebar-icon icon-mask"
|
|
|
+ :style="{
|
|
|
+ backgroundColor: twoCurToolbarIcon === icon ? '#fff' : '#1E2129',
|
|
|
+ maskImage: `url(${require(`@/assets/icon/sidebar-${icon}.svg`)})`,
|
|
|
+ }"
|
|
|
+ ></div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
<div style="height: 40px"></div>
|
|
|
- <ul
|
|
|
- v-infinite-scroll="loadMore"
|
|
|
- class="scroll-container"
|
|
|
- infinite-scroll-disabled="disabled"
|
|
|
- :infinite-scroll-immediate="false"
|
|
|
- >
|
|
|
- <li
|
|
|
- v-for="(item, index) in file_list"
|
|
|
- :key="index"
|
|
|
- class="list-item"
|
|
|
- @click="handleFileClick(item?.courseware_id, item?.component_id)"
|
|
|
+
|
|
|
+ <el-collapse v-model="activeBookChapterId" accordion @change="multimediaHandleChange">
|
|
|
+ <el-collapse-item
|
|
|
+ v-for="chapter in bookChapterList"
|
|
|
+ :key="chapter.id"
|
|
|
+ :name="chapter.id"
|
|
|
+ :title="chapter.name"
|
|
|
>
|
|
|
- <template v-if="parseInt(drawerType) === 0">
|
|
|
- <el-image :src="item.file_url" fit="contain" />
|
|
|
- </template>
|
|
|
- <template v-else-if="parseInt(drawerType) === 1">
|
|
|
- <AudioPlay
|
|
|
- view-size="middle"
|
|
|
- :file-id="item.file_id"
|
|
|
- :file-name="item.file_name.slice(0, item.file_name.lastIndexOf('.'))"
|
|
|
- :show-slider="true"
|
|
|
- :audio-index="index"
|
|
|
- />
|
|
|
- </template>
|
|
|
- <template v-else-if="parseInt(drawerType) === 2">
|
|
|
- <VideoPlay view-size="small" :file-id="item.file_id" :video-index="index" />
|
|
|
- </template>
|
|
|
+ <!-- 加载状态 -->
|
|
|
+ <div v-if="multimediaLoadingStates" class="loading-text">加载中...</div>
|
|
|
+
|
|
|
+ <!-- 加载完成显示数据 -->
|
|
|
+ <div v-else-if="chapter.data">
|
|
|
+ <ul class="scroll-container" infinite-scroll-disabled="disabled" :infinite-scroll-immediate="false">
|
|
|
+ <li
|
|
|
+ v-for="(item, index) in chapter.data"
|
|
|
+ :key="`${chapter.id}-${index}`"
|
|
|
+ class="list-item"
|
|
|
+ @click="handleFileClick(item?.courseware_id, item?.component_id)"
|
|
|
+ >
|
|
|
+ <template v-if="parseInt(drawerType) === 0">
|
|
|
+ <el-image v-if="shouldShowItem(chapter, item)" :src="item.file_url" fit="contain" />
|
|
|
+ <div class="mark">
|
|
|
+ <span class="word">{{ item.file_name }}</span>
|
|
|
+ <el-link
|
|
|
+ type="primary"
|
|
|
+ class="el-icon-place linkLocation"
|
|
|
+ @click="handleLocation(item, 3)"
|
|
|
+ ></el-link>
|
|
|
+ </div>
|
|
|
+ </template>
|
|
|
+ <template v-else-if="parseInt(drawerType) === 1">
|
|
|
+ <AudioPlay
|
|
|
+ v-if="shouldShowItem(chapter, item)"
|
|
|
+ view-size="middle"
|
|
|
+ :file-id="item.file_id"
|
|
|
+ :file-name="item.file_name.slice(0, item.file_name.lastIndexOf('.'))"
|
|
|
+ :show-slider="true"
|
|
|
+ :audio-index="index"
|
|
|
+ />
|
|
|
+ <div class="mark">
|
|
|
+ <span class="word"></span>
|
|
|
+ <el-link
|
|
|
+ type="primary"
|
|
|
+ class="el-icon-place linkLocation"
|
|
|
+ @click="handleLocation(item, 3)"
|
|
|
+ ></el-link>
|
|
|
+ </div>
|
|
|
+ </template>
|
|
|
+ <template v-else-if="parseInt(drawerType) === 2">
|
|
|
+ <VideoPlay
|
|
|
+ v-if="shouldShowItem(chapter, item)"
|
|
|
+ view-size="small"
|
|
|
+ :file-id="item.file_id"
|
|
|
+ :video-index="index"
|
|
|
+ />
|
|
|
+ <div class="mark">
|
|
|
+ <span class="word">{{ item.file_name }}</span>
|
|
|
+ <el-link
|
|
|
+ type="primary"
|
|
|
+ class="el-icon-place linkLocation"
|
|
|
+ @click="handleLocation(item, 3)"
|
|
|
+ ></el-link>
|
|
|
+ </div>
|
|
|
+ </template>
|
|
|
+ </li>
|
|
|
+ </ul>
|
|
|
+ </div>
|
|
|
+
|
|
|
+ <!-- 加载失败或未加载 -->
|
|
|
+ <div v-else class="error-text">没有资源</div>
|
|
|
+ </el-collapse-item>
|
|
|
+ </el-collapse>
|
|
|
+ </div>
|
|
|
+
|
|
|
+ <div v-if="curToolbarIcon === 'collect'" class="resource_box">
|
|
|
+ <h5>{{ drawerTitle }}</h5>
|
|
|
+ <div style="height: 40px"></div>
|
|
|
+ <ul v-if="allCottectList.length > 0" class="card-box">
|
|
|
+ <li v-for="item in allCottectList" :key="item.id">
|
|
|
+ <span class="el-icon-notebook-2"> 原文</span>
|
|
|
+ <span>{{ item.text }}</span>
|
|
|
+ <div>
|
|
|
+ <el-button type="text" class="el-icon-delete" @click="handDelCollect(item.id)"> 删除</el-button>
|
|
|
+ <el-divider direction="vertical" />
|
|
|
+ <el-button type="text" class="el-icon-place" @click="handleLocation(item, 2)"> 定位</el-button>
|
|
|
+ </div>
|
|
|
</li>
|
|
|
</ul>
|
|
|
- <p v-if="loading">加载中...</p>
|
|
|
- <p v-if="noMore">没有更多了</p>
|
|
|
</div>
|
|
|
<div v-if="curToolbarIcon === 'note'" class="resource_box">
|
|
|
<h5>{{ drawerTitle }}</h5>
|
|
|
@@ -215,7 +287,7 @@
|
|
|
<span>{{ item.text }}</span>
|
|
|
<el-divider class="mt10" />
|
|
|
<span v-html="item.note"></span>
|
|
|
- <div class="remark-bottom">
|
|
|
+ <div>
|
|
|
<el-button type="text" class="el-icon-edit" @click="handEditNote(item)"> 编辑</el-button>
|
|
|
<el-divider direction="vertical" />
|
|
|
<el-button type="text" class="el-icon-delete" @click="handDelNote(item.id)"> 删除</el-button>
|
|
|
@@ -225,21 +297,9 @@
|
|
|
</li>
|
|
|
</ul>
|
|
|
</div>
|
|
|
- <div v-if="curToolbarIcon === 'collect'" class="resource_box">
|
|
|
- <h5>{{ drawerTitle }}</h5>
|
|
|
- <div style="height: 40px"></div>
|
|
|
- <ul v-if="allCottectList.length > 0" class="card-box">
|
|
|
- <li v-for="item in allCottectList" :key="item.id">
|
|
|
- <span class="el-icon-notebook-2"> 原文</span>
|
|
|
- <span>{{ item.text }}</span>
|
|
|
- <div class="remark-bottom">
|
|
|
- <el-button type="text" class="el-icon-delete" @click="handDelCollect(item.id)"> 删除</el-button>
|
|
|
- <el-divider direction="vertical" />
|
|
|
- <el-button type="text" class="el-icon-place" @click="handleLocation(item, 2)"> 定位</el-button>
|
|
|
- </div>
|
|
|
- </li>
|
|
|
- </ul>
|
|
|
- </div>
|
|
|
+ <template v-if="curToolbarIcon === 'audit'">
|
|
|
+ <AuditRemark :remark-list="remark_list" :is-audit="isShowAudit" @deleteRemarks="deleteRemarks" />
|
|
|
+ </template>
|
|
|
</div>
|
|
|
|
|
|
<div class="back-top" @click="backTop">
|
|
|
@@ -280,6 +340,7 @@
|
|
|
@child-click="handleNodeClick"
|
|
|
/>
|
|
|
</el-dialog>
|
|
|
+
|
|
|
<el-dialog
|
|
|
title=""
|
|
|
:visible="visibleVisNetwork"
|
|
|
@@ -327,6 +388,7 @@ import {
|
|
|
ChapterGetBookChapterStructExpandList,
|
|
|
GetBookBaseInfo,
|
|
|
MangerGetBookMindMap,
|
|
|
+ GetBookChapterStructExpandList,
|
|
|
PageQueryBookResourceList,
|
|
|
GetLanguageTypeList,
|
|
|
GetBookUnifiedAttrib,
|
|
|
@@ -339,6 +401,7 @@ import {
|
|
|
DeleteMyCollect,
|
|
|
SearchBookContentText,
|
|
|
} from '@/api/book';
|
|
|
+import { toggleFullScreen } from '@/utils/common';
|
|
|
|
|
|
export default {
|
|
|
name: 'CommonPreview',
|
|
|
@@ -385,15 +448,21 @@ export default {
|
|
|
},
|
|
|
data() {
|
|
|
const sidebarIconList = [
|
|
|
- // { icon: 'search', title: '搜索', handle: '', param: {} },
|
|
|
+ { icon: 'search', title: '搜索', handle: 'getSearch', param: { type: '5' } },
|
|
|
{ icon: 'mindmap', title: '思维导图', handle: 'openMindMap', param: {} },
|
|
|
{ icon: 'knowledge', title: '知识图谱', handle: 'openVisNetwork', param: {} },
|
|
|
- // { icon: 'totalResources', title: '总资源', handle: '', param: {} },
|
|
|
- { icon: 'search', title: '搜索', handle: 'getSearch', param: { type: '5' } },
|
|
|
+ {
|
|
|
+ icon: 'totalResources',
|
|
|
+ title: '总资源',
|
|
|
+ handle: '',
|
|
|
+ param: {},
|
|
|
+ children: [
|
|
|
+ { icon: 'audio', title: '音频', handle: 'openDrawer', param: { type: '1' } },
|
|
|
+ { icon: 'image', title: '图片', handle: 'openDrawer', param: { type: '0' } },
|
|
|
+ { icon: 'video', title: '视频', handle: 'openDrawer', param: { type: '2' } },
|
|
|
+ ],
|
|
|
+ },
|
|
|
{ icon: 'collect', title: '收藏', handle: 'getCollect', param: { type: '3' } },
|
|
|
- { icon: 'audio', title: '音频', handle: 'openDrawer', param: { type: '1' } },
|
|
|
- { icon: 'image', title: '图片', handle: 'openDrawer', param: { type: '0' } },
|
|
|
- { icon: 'video', title: '视频', handle: 'openDrawer', param: { type: '2' } },
|
|
|
{ icon: 'note', title: '笔记', handle: 'getNote', param: { type: '4' } },
|
|
|
// { icon: 'translate', title: '翻译', handle: '', param: {} },
|
|
|
// { icon: 'setting', title: '设置', handle: '', param: {} },
|
|
|
@@ -444,6 +513,8 @@ export default {
|
|
|
},
|
|
|
curToolbarIcon: this.isShowAudit ? 'audit' : '',
|
|
|
sidebarIconList,
|
|
|
+ twoSidebarList: [],
|
|
|
+ twoCurToolbarIcon: '',
|
|
|
visibleMindMap: false,
|
|
|
visibleVisNetwork: false,
|
|
|
isChildDataLoad: false,
|
|
|
@@ -478,7 +549,10 @@ export default {
|
|
|
oldRichData: {},
|
|
|
newSelectedInfo: null,
|
|
|
allCottectList: [],
|
|
|
+ bookChapterList: [],
|
|
|
book_id: '',
|
|
|
+ activeBookChapterId: '',
|
|
|
+ multimediaLoadingStates: true,
|
|
|
};
|
|
|
},
|
|
|
computed: {
|
|
|
@@ -501,6 +575,11 @@ export default {
|
|
|
};
|
|
|
return titleMap[this.drawerType] || '资源列表';
|
|
|
},
|
|
|
+ shouldShowItem() {
|
|
|
+ return (chapter, item) => {
|
|
|
+ return this.activeBookChapterId === chapter.id && item && item.file_id;
|
|
|
+ };
|
|
|
+ },
|
|
|
},
|
|
|
watch: {
|
|
|
isJudgeCorrect(newVal) {
|
|
|
@@ -739,11 +818,23 @@ export default {
|
|
|
* @param {any} param - 处理函数参数
|
|
|
* @param {string} icon - 图标名称
|
|
|
*/
|
|
|
- handleSidebarClick(handle, param, icon) {
|
|
|
+ handleSidebarClick(handle, param, icon, children, barLevel) {
|
|
|
if (typeof handle === 'string' && handle && typeof this[handle] === 'function') {
|
|
|
this[handle](param);
|
|
|
}
|
|
|
- this.curToolbarIcon = icon;
|
|
|
+
|
|
|
+ if (barLevel == 2) {
|
|
|
+ this.twoCurToolbarIcon = icon;
|
|
|
+ } else {
|
|
|
+ this.curToolbarIcon = icon;
|
|
|
+ this.twoCurToolbarIcon = '';
|
|
|
+ }
|
|
|
+
|
|
|
+ if (children && children.length > 0 && Array.isArray(children)) {
|
|
|
+ this.twoSidebarList = children;
|
|
|
+ this.twoCurToolbarIcon = children[0].icon;
|
|
|
+ this.openDrawer(children[0].param);
|
|
|
+ }
|
|
|
},
|
|
|
openMindMap() {
|
|
|
MangerGetBookMindMap({ book_id: this.projectId }).then(({ content }) => {
|
|
|
@@ -771,6 +862,9 @@ export default {
|
|
|
this.visibleMindMap = false;
|
|
|
this.visibleVisNetwork = false;
|
|
|
},
|
|
|
+ /**
|
|
|
+ * 打开知识图谱
|
|
|
+ */
|
|
|
async openVisNetwork() {
|
|
|
this.visibleVisNetwork = true;
|
|
|
},
|
|
|
@@ -785,12 +879,14 @@ export default {
|
|
|
this.drawerType = '';
|
|
|
return;
|
|
|
}
|
|
|
+ this.activeBookChapterId = '';
|
|
|
// 重置所有加载状态
|
|
|
this.resetLoadState();
|
|
|
this.drawerType = type;
|
|
|
this.$nextTick(() => {
|
|
|
// 确保DOM更新后触发加载
|
|
|
- this.loadMore();
|
|
|
+ // this.loadMore();
|
|
|
+ this.loadBookChapterStructExpandList();
|
|
|
});
|
|
|
},
|
|
|
openAudit() {
|
|
|
@@ -804,6 +900,59 @@ export default {
|
|
|
this.lastLoadTime = 0; // 重置时间戳,允许立即加载
|
|
|
this.loadCount = 0;
|
|
|
},
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 加载章节
|
|
|
+ */
|
|
|
+ async loadBookChapterStructExpandList() {
|
|
|
+ const params = {
|
|
|
+ book_id: this.projectId,
|
|
|
+ node_deep_mode: 3, // 节点深度模式 0【全部】,1【只查询章节】2【只查询非叶子章节】3【只查询第一层】
|
|
|
+ is_contain_root_node: 'false', // 是否包含根节点(把教材作为根节点)
|
|
|
+ is_contain_producer: 'false', // 是否包含制作人信息
|
|
|
+ is_contain_auditor: 'false', // 是否包含审核人信息
|
|
|
+ };
|
|
|
+ await GetBookChapterStructExpandList(params).then(({ node_list }) => {
|
|
|
+ this.bookChapterList = node_list || [];
|
|
|
+ });
|
|
|
+ },
|
|
|
+ /**
|
|
|
+ * 加载章节下的资源
|
|
|
+ */
|
|
|
+ async loadmultimediaList() {
|
|
|
+ const params = {
|
|
|
+ page_capacity: this.page_capacity,
|
|
|
+ cur_page: this.cur_page,
|
|
|
+ book_id: this.projectId,
|
|
|
+ book_chapter_node_id: this.activeBookChapterId,
|
|
|
+ type: parseInt(this.drawerType),
|
|
|
+ };
|
|
|
+ await PageQueryBookResourceList(params)
|
|
|
+ .then(({ total_count, resource_list }) => {
|
|
|
+ this.total_count = total_count;
|
|
|
+ this.file_list = resource_list || [];
|
|
|
+ })
|
|
|
+ .finally(() => {
|
|
|
+ this.loading = false;
|
|
|
+ });
|
|
|
+ },
|
|
|
+ /**
|
|
|
+ * 点击章节,切换数据
|
|
|
+ */
|
|
|
+ async multimediaHandleChange() {
|
|
|
+ const item = this.bookChapterList.find((item) => item.id === this.activeBookChapterId);
|
|
|
+ if (item) {
|
|
|
+ this.multimediaLoadingStates = true;
|
|
|
+ if (!item.data && !item.error) {
|
|
|
+ await this.loadmultimediaList();
|
|
|
+ let tmpList = this.file_list && this.file_list.length > 0 ? [...this.file_list] : null;
|
|
|
+ this.$set(item, 'data', tmpList);
|
|
|
+ this.multimediaLoadingStates = false;
|
|
|
+ } else {
|
|
|
+ this.multimediaLoadingStates = false;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ },
|
|
|
// 加载更多数据
|
|
|
async loadMore() {
|
|
|
const now = Date.now();
|
|
|
@@ -822,6 +971,7 @@ export default {
|
|
|
page_capacity: this.page_capacity,
|
|
|
cur_page: this.cur_page,
|
|
|
book_id: this.projectId,
|
|
|
+ book_chapter_node_id: this.activeBookChapterId,
|
|
|
type: parseInt(this.drawerType),
|
|
|
};
|
|
|
await PageQueryBookResourceList(params)
|
|
|
@@ -932,6 +1082,7 @@ export default {
|
|
|
this.handleNodeClick(did);
|
|
|
return;
|
|
|
}
|
|
|
+
|
|
|
if (this.$refs.courserware && this.$refs.courserware.handleLocation) {
|
|
|
item.type = type;
|
|
|
this.$refs.courserware.handleLocation(item);
|
|
|
@@ -1122,6 +1273,9 @@ export default {
|
|
|
}
|
|
|
});
|
|
|
},
|
|
|
+ fullScreen() {
|
|
|
+ toggleFullScreen(this.$refs.previewMain);
|
|
|
+ },
|
|
|
},
|
|
|
};
|
|
|
</script>
|
|
|
@@ -1496,6 +1650,31 @@ $total-width: $courseware-width + $courseware-left-margin + $courseware-right-ma
|
|
|
overflow-y: auto;
|
|
|
border: 1px solid #e5e5e5;
|
|
|
|
|
|
+ .source-toolbar-list {
|
|
|
+ position: fixed;
|
|
|
+ z-index: 999;
|
|
|
+ display: flex;
|
|
|
+ width: 240px;
|
|
|
+ background: #f2f3f5;
|
|
|
+
|
|
|
+ .sidebar-item {
|
|
|
+ width: 100%;
|
|
|
+ padding-top: 5px;
|
|
|
+ text-align: center;
|
|
|
+ border-right: 1px solid #ccc;
|
|
|
+
|
|
|
+ .sidebar-icon {
|
|
|
+ width: 26px;
|
|
|
+ height: 26px;
|
|
|
+ cursor: pointer;
|
|
|
+ }
|
|
|
+
|
|
|
+ &.active {
|
|
|
+ background-color: #4095e5;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
h5 {
|
|
|
position: fixed;
|
|
|
z-index: 999;
|
|
|
@@ -1514,7 +1693,7 @@ $total-width: $courseware-width + $courseware-left-margin + $courseware-right-ma
|
|
|
margin: 6px;
|
|
|
|
|
|
.list-item {
|
|
|
- display: flex;
|
|
|
+ // display: flex;
|
|
|
align-items: center;
|
|
|
cursor: pointer;
|
|
|
border: 1px solid #ccc;
|
|
|
@@ -1562,6 +1741,39 @@ $total-width: $courseware-width + $courseware-left-margin + $courseware-right-ma
|
|
|
color: grey;
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
+ .mark {
|
|
|
+ display: flex;
|
|
|
+ align-items: center;
|
|
|
+ justify-content: space-between;
|
|
|
+ padding: 3px;
|
|
|
+
|
|
|
+ .word {
|
|
|
+ flex: 1;
|
|
|
+ margin-right: 10px;
|
|
|
+ word-break: break-all;
|
|
|
+ }
|
|
|
+
|
|
|
+ .linkLocation {
|
|
|
+ cursor: pointer;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ ::v-deep .el-collapse-item__header {
|
|
|
+ margin-left: 5px;
|
|
|
+ }
|
|
|
+
|
|
|
+ .loading-text {
|
|
|
+ padding: 5px;
|
|
|
+ color: #999;
|
|
|
+ text-align: center;
|
|
|
+ }
|
|
|
+
|
|
|
+ .error-text {
|
|
|
+ padding: 5px;
|
|
|
+ color: #999;
|
|
|
+ text-align: center;
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
|
|
|
@@ -1586,6 +1798,7 @@ $total-width: $courseware-width + $courseware-left-margin + $courseware-right-ma
|
|
|
.audio-middle {
|
|
|
width: 100% !important;
|
|
|
padding: 6px 8px !important;
|
|
|
+ margin-left: 0;
|
|
|
border: none;
|
|
|
border-radius: 8px;
|
|
|
|