ProductionResourceManage.vue 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772
  1. <template>
  2. <div class="production-resource">
  3. <MenuPage cur-key="project" />
  4. <div class="production-resource-main">
  5. <div class="textbook-container">
  6. <MenuTree :id="select_node" :node-list="node_list" @selectNode="selectNode" />
  7. </div>
  8. <div class="textbook-chapter">
  9. <div class="textbook-chapter__header">
  10. <div class="courseware">
  11. <div class="operator flex">
  12. <span class="link" @click="handleAdd">上传</span>
  13. <span class="link" @click="handleDelete">删除</span>
  14. <span class="link" @click="handleSetInfo">设置信息</span>
  15. <span class="link" @click="handleChangeFile">更换文件</span>
  16. <span class="link" @click="handleMoveFile">移动文件</span>
  17. <span class="link" @click="handlePersonal">设置项目成员资源使用权限</span>
  18. <span class="link" @click="$router.push({ path: `/personal_workbench/project` })">返回项目列表</span>
  19. </div>
  20. </div>
  21. </div>
  22. <div class="search-box">
  23. <div class="search-left">
  24. <label
  25. v-for="(item, index) in type_list"
  26. :key="index"
  27. class="label-btn"
  28. :class="[type_index === index ? 'active' : '']"
  29. @click="changeType(index)"
  30. >
  31. {{ item.label }}
  32. </label>
  33. <el-input v-model="search_content" />
  34. <el-button type="primary" @click="queryList('')">查询</el-button>
  35. </div>
  36. <div class="search-right">
  37. <label>排序:</label>
  38. <el-select v-model="sort_value" placeholder="请选择">
  39. <el-option v-for="item in sort_list" :key="item.value" :label="item.label" :value="item.value" />
  40. </el-select>
  41. <SvgIcon
  42. :icon-class="isDesc ? 'sort-down' : 'sort-up'"
  43. size="16"
  44. style="cursor: pointer"
  45. @click="changeSort"
  46. />
  47. </div>
  48. </div>
  49. <div v-if="height > 0" v-loading="boxLoading" class="sources-box" :style="{ height: height + 'px' }">
  50. <div
  51. v-for="(item, index) in list"
  52. :key="index"
  53. class="sources-item"
  54. :class="[select_sources_id === item.id ? 'active' : '', type_index === 5 ? 'sources-item-txt' : '']"
  55. @click="selectSourceNode(item)"
  56. >
  57. <template v-if="type_index === 0"> <el-image :src="item.file_url" fit="contain" /></template>
  58. <template v-else-if="type_index === 1">
  59. <AudioLine
  60. ref="audioLine"
  61. :audio-id="'resource-audio-' + index"
  62. :mp3="item.file_url"
  63. :get-cur-time="getCurTime"
  64. :width="200"
  65. />
  66. </template>
  67. <template v-else-if="type_index === 2">
  68. <video
  69. controls
  70. :src="item.file_url"
  71. width="100%"
  72. height="140px"
  73. :poster="item.video_preview_image_file_url"
  74. ></video>
  75. </template>
  76. <template v-else-if="type_index === 3">
  77. <!-- <iframe
  78. class="sources-item-border"
  79. :src="item.new_path"
  80. width="100%"
  81. height="300px"
  82. frameborder="0"
  83. ></iframe> -->
  84. </template>
  85. <template v-else-if="type_index === 4"> </template>
  86. <template v-else-if="type_index === 5">
  87. <iframe
  88. class="sources-item-border"
  89. :src="item.new_path"
  90. width="100%"
  91. height="300px"
  92. frameborder="0"
  93. ></iframe>
  94. </template>
  95. <el-popover placement="bottom" width="300" trigger="hover">
  96. <div class="sources-info">
  97. <p class="name">名称:{{ item.name }}</p>
  98. <p class="label">标签:{{ item.label }}</p>
  99. <p class="name">简介:{{ item.intro }}</p>
  100. <p class="label">修改时间:{{ item.last_modify_time }}</p>
  101. <p class="label">文件大小:{{ item.file_size_desc }}</p>
  102. </div>
  103. <template #reference>
  104. <div class="sources-info">
  105. <p class="name">
  106. {{ item.name }}
  107. <SvgIcon
  108. v-show="item.file_id && type_index === 3"
  109. icon-class="uploadPreview"
  110. size="16"
  111. @click="viewDialog(item)"
  112. />
  113. </p>
  114. <b class="label">{{ item.label }}</b>
  115. </div>
  116. </template>
  117. </el-popover>
  118. </div>
  119. </div>
  120. <PaginationPage ref="pagination" :pageSize="20" :total="total" @getList="queryList" />
  121. </div>
  122. </div>
  123. <!-- 上传 -->
  124. <el-dialog
  125. :visible.sync="sourceAddFlag"
  126. width="500px"
  127. append-to-body
  128. :show-close="true"
  129. title="上传资源"
  130. :close-on-click-modal="false"
  131. class="module-content"
  132. >
  133. <UploadFile
  134. v-if="sourceAddFlag"
  135. key="upload_resources"
  136. :type="'upload_resources_manager'"
  137. :total-size="20000"
  138. :file-list="file_list"
  139. :file-id-list="file_id_list"
  140. :label-text="labelText"
  141. :accept-file-type="acceptFileType"
  142. :icon-class="iconClass"
  143. :limit="limit"
  144. :single-size="200"
  145. :upload-tip="uploadTip"
  146. @updateFileList="updateFileList"
  147. />
  148. <footer style="text-align: right">
  149. <el-button @click="handleCancle">取 消</el-button>
  150. <el-button :loading="loading" type="primary" @click="submitAdd">确 定</el-button>
  151. </footer>
  152. </el-dialog>
  153. <!-- 更新信息 -->
  154. <el-dialog
  155. :visible.sync="sourceInfoFlag"
  156. width="500px"
  157. append-to-body
  158. :show-close="true"
  159. title="设置资源"
  160. :close-on-click-modal="false"
  161. >
  162. <el-form ref="form" label-width="80px" :model="sourceInfo">
  163. <el-form-item prop="name" label="名称">
  164. <el-input v-model="sourceInfo.name" />
  165. </el-form-item>
  166. <el-form-item prop="label" label="标签">
  167. <el-input v-model="sourceInfo.label" />
  168. </el-form-item>
  169. <el-form-item prop="intro" label="简介">
  170. <el-input v-model="sourceInfo.intro" type="textarea" />
  171. </el-form-item>
  172. <el-form-item style="text-align: right">
  173. <el-button @click="sourceInfoFlag = false">取 消</el-button>
  174. <el-button :loading="loading" type="primary" @click="submitSourceInfo">确 定</el-button>
  175. </el-form-item>
  176. </el-form>
  177. </el-dialog>
  178. <!-- 移动 -->
  179. <el-dialog
  180. :visible.sync="sourceMoveFlag"
  181. width="500px"
  182. append-to-body
  183. :show-close="true"
  184. title="移动文件"
  185. :close-on-click-modal="false"
  186. >
  187. <el-form ref="form" label-width="80px">
  188. <el-form-item prop="name" label="移动到">
  189. <el-cascader v-model="sourceMoveId" :props="{ checkStrictly: true }" :options="node_list" />
  190. </el-form-item>
  191. <el-form-item style="text-align: right">
  192. <el-button @click="sourceMoveFlag = false">取 消</el-button>
  193. <el-button :loading="loading" type="primary" @click="submitMoveSource">确 定</el-button></el-form-item
  194. >
  195. </el-form>
  196. </el-dialog>
  197. <el-dialog
  198. v-if="visible"
  199. :visible.sync="visible"
  200. :show-close="true"
  201. :close-on-click-modal="true"
  202. :modal-append-to-body="true"
  203. :append-to-body="true"
  204. :lock-scroll="true"
  205. width="80%"
  206. top="0"
  207. >
  208. <iframe v-if="visible" :src="newpath" width="100%" :height="iframeHeight" frameborder="0"></iframe>
  209. </el-dialog>
  210. </div>
  211. </template>
  212. <script>
  213. import MenuPage from '../common/menu.vue';
  214. import MenuTree from './components/MenuTree.vue';
  215. import {
  216. ChapterGetBookChapterStruct,
  217. MangerAddResource,
  218. MangerDeleteResource,
  219. MangerUpdateResourceFile,
  220. MangerUpdateResourceInfo,
  221. MangerMoveResource,
  222. } from '@/api/book';
  223. import { GetProjectBaseInfo } from '@/api/project';
  224. import PaginationPage from '@/components/PaginationPage.vue';
  225. import { PageQueryProjectResourceList } from '@/api/list';
  226. import UploadFile from './components/UploadFile.vue';
  227. import AudioLine from './components/AudioLine.vue';
  228. const Base64 = require('js-base64').Base64;
  229. import { getConfig } from '@/utils/auth';
  230. import { H5StartupFile } from '@/api/app';
  231. export default {
  232. name: 'ProjectResourceManager',
  233. components: { MenuPage, MenuTree, PaginationPage, UploadFile, AudioLine },
  234. data() {
  235. return {
  236. book_id: this.$route.params.id,
  237. node_list: [],
  238. select_node: '',
  239. project_info: {}, // 项目基本信息
  240. type_list: [
  241. {
  242. value: 0,
  243. label: '图片',
  244. },
  245. {
  246. value: 1,
  247. label: '音频',
  248. },
  249. {
  250. value: 2,
  251. label: '视频',
  252. },
  253. {
  254. value: 3,
  255. label: 'H5 游戏',
  256. },
  257. {
  258. value: 4,
  259. label: '3D 模型',
  260. },
  261. {
  262. value: 5,
  263. label: '文本',
  264. },
  265. ], // 类型分类
  266. type_index: 0, // 类型索引
  267. sort_list: [
  268. {
  269. value: 'name',
  270. label: '名称',
  271. },
  272. {
  273. value: 'label',
  274. label: '标签',
  275. },
  276. {
  277. value: 'last_modify_time',
  278. label: '修改时间',
  279. },
  280. {
  281. value: 'file_size',
  282. label: '文件大小',
  283. },
  284. ], // 排序分类
  285. sort_value: '', // 排序值
  286. isDesc: false, // 排序是否为倒序
  287. select_sources_id: '', // 选中的资源id
  288. list: [],
  289. total: 0,
  290. search_content: '', // 查询内容
  291. height: 0,
  292. page_capacity: 20,
  293. cur_page: 1,
  294. sourceAddFlag: false, // 新增flag
  295. labelText: '资源',
  296. acceptFileType: '.jpg,.png,.jpeg',
  297. iconClass: '',
  298. file_id_list: [],
  299. file_list: [],
  300. loading: false,
  301. acceptFileTypeList: ['.jpg,.png,.jpeg', '.mp3', '.mp4', '.zip', '*', '.txt'],
  302. limit: 10,
  303. uploadTip: '',
  304. boxLoading: false,
  305. sourceInfoFlag: false, // 设置信息
  306. sourceInfo: {
  307. name: '',
  308. label: '',
  309. intro: '',
  310. },
  311. sourceMoveFlag: false,
  312. sourceMoveId: '',
  313. file_preview_url: getConfig() ? getConfig().doc_preview_service_address : '',
  314. visible: false,
  315. newpath: '',
  316. iframeHeight: `${window.innerHeight - 100}px`,
  317. };
  318. },
  319. created() {
  320. this.getProjectBaseInfo();
  321. },
  322. mounted() {
  323. this.height =
  324. document.getElementsByClassName('app-container')[0].clientHeight -
  325. document.getElementsByClassName('menu')[0].clientHeight -
  326. document.getElementsByClassName('textbook-chapter__header')[0].clientHeight -
  327. document.getElementsByClassName('search-box')[0].clientHeight -
  328. document.getElementsByClassName('el-pagination')[0].clientHeight -
  329. 30;
  330. },
  331. methods: {
  332. selectNode(nodeId) {
  333. this.select_node = nodeId;
  334. this.queryList('');
  335. },
  336. /**
  337. * 获取项目基本信息
  338. * @param {string} id - 项目ID
  339. */
  340. getProjectBaseInfo() {
  341. GetProjectBaseInfo({ id: this.book_id }).then(({ project_info }) => {
  342. this.project_info = project_info;
  343. this.getBookChapterStructExpandList(project_info.name);
  344. });
  345. },
  346. /**
  347. * 得到教材章节结构展开列表
  348. */
  349. getBookChapterStructExpandList(name) {
  350. ChapterGetBookChapterStruct({
  351. book_id: this.book_id,
  352. node_deep_mode: 0,
  353. is_contain_producer: 'false',
  354. is_contain_auditor: 'false',
  355. }).then(({ nodes }) => {
  356. this.node_list = [
  357. {
  358. auditor_desc: '',
  359. deep: 1,
  360. id: '',
  361. is_courseware: 'false',
  362. is_leaf: 'false',
  363. is_leaf_chapter: 'false',
  364. level_index: '0',
  365. label: name,
  366. nodes,
  367. children: nodes,
  368. value: '',
  369. },
  370. ];
  371. this.handleData(this.node_list[0], 1);
  372. });
  373. },
  374. // 递归
  375. handleData(data, nodeIndex) {
  376. if (data.nodes) {
  377. data.nodes.forEach((item) => {
  378. item.label = item.name;
  379. item.pid = data.id;
  380. item.nodexIndex = nodeIndex;
  381. item.isLeaf = item.is_leaf === 'true';
  382. item.value = item.id;
  383. if (item.nodes) {
  384. item.children = item.nodes;
  385. item.lists = item.nodes;
  386. this.handleData(item, nodeIndex + 1);
  387. }
  388. });
  389. }
  390. },
  391. // 上传
  392. handleAdd() {
  393. this.limit = 10;
  394. this.uploadTip = '最多上传 10 个文件,多文件分批上传';
  395. this.sourceAddFlag = true;
  396. },
  397. // 删除
  398. handleDelete() {
  399. if (this.select_sources_id) {
  400. this.$confirm('确定要删除此条资源吗?', '提示', {
  401. confirmButtonText: '确定',
  402. cancelButtonText: '取消',
  403. type: 'warning',
  404. })
  405. .then(() => {
  406. MangerDeleteResource({ id: this.select_sources_id }).then(() => {
  407. this.$message.success('删除成功!');
  408. this.select_sources_id = '';
  409. this.queryList('');
  410. });
  411. })
  412. .catch(() => {});
  413. } else {
  414. this.$message.warning('请先选择文件');
  415. }
  416. },
  417. // 设置信息
  418. handleSetInfo() {
  419. if (this.select_sources_id) {
  420. this.sourceInfoFlag = true;
  421. } else {
  422. this.$message.warning('请先选择文件');
  423. }
  424. },
  425. // 更换文件
  426. handleChangeFile() {
  427. if (this.select_sources_id) {
  428. this.limit = 1;
  429. this.uploadTip = '只能上传 1 个文件';
  430. this.sourceAddFlag = true;
  431. } else {
  432. this.$message.warning('请先选择文件');
  433. }
  434. },
  435. // 设置项目成员资源使用权限
  436. handlePersonal() {},
  437. // 移动文件
  438. handleMoveFile() {
  439. if (this.select_sources_id) {
  440. this.sourceMoveFlag = true;
  441. } else {
  442. this.$message.warning('请先选择文件');
  443. }
  444. },
  445. // 切换类型
  446. changeType(index) {
  447. this.type_index = index;
  448. this.select_sources_id = '';
  449. this.file_list = [];
  450. this.file_id_list = [];
  451. this.acceptFileType = this.acceptFileTypeList[index];
  452. this.queryList('');
  453. },
  454. // 查询列表
  455. queryList(data) {
  456. this.boxLoading = true;
  457. this.list = [];
  458. if (data) {
  459. this.page_capacity = data.page_capacity;
  460. this.cur_page = data.cur_page;
  461. } else {
  462. this.page_capacity = 20;
  463. this.cur_page = 1;
  464. }
  465. let order_column_list = [];
  466. if (this.sort_value) {
  467. order_column_list = [this.isDesc ? `${this.sort_value}:desc` : this.sort_value];
  468. }
  469. let datas = {
  470. page_capacity: this.page_capacity,
  471. cur_page: this.cur_page,
  472. project_id: this.book_id,
  473. book_chapter_node_id: this.select_node,
  474. type: this.type_list[this.type_index].value,
  475. name_or_label: this.search_content,
  476. order_column_list,
  477. };
  478. PageQueryProjectResourceList(datas)
  479. .then(({ total_count, resource_list }) => {
  480. this.total = total_count;
  481. if (this.type_index === 5) {
  482. resource_list.forEach((item) => {
  483. item.new_path = `${this.file_preview_url}onlinePreview?url=${Base64.encode(item.file_url)}`;
  484. });
  485. this.boxLoading = false;
  486. }
  487. // else if (this.type_index === 3) {
  488. // resource_list.forEach((item) => {
  489. // H5StartupFile({ file_id: item.file_id, index_file_name: 'index.html' }).then((res) => {
  490. // item.new_path = res.file_url;
  491. // this.boxLoading = false;
  492. // });
  493. // });
  494. // }
  495. else {
  496. this.boxLoading = false;
  497. }
  498. this.list = resource_list;
  499. })
  500. .catch(() => {
  501. this.boxLoading = false;
  502. });
  503. },
  504. // 切换排序升序降序
  505. changeSort() {
  506. this.isDesc = !this.isDesc;
  507. },
  508. updateFileList({ file_list, file_id_list }) {
  509. this.file_list = file_list;
  510. this.file_id_list = file_id_list;
  511. },
  512. handleCancle() {
  513. this.sourceAddFlag = false;
  514. this.file_list = [];
  515. this.file_id_list = [];
  516. },
  517. // 确定新增资源
  518. submitAdd() {
  519. this.loading = true;
  520. if (this.limit === 1) {
  521. // 更换文件
  522. let data = {
  523. id: this.select_sources_id,
  524. file_id: this.file_id_list[0],
  525. };
  526. MangerUpdateResourceFile(data)
  527. .then((res) => {
  528. this.loading = false;
  529. this.sourceAddFlag = false;
  530. if (res.status === 1) {
  531. this.$message.success('更换成功');
  532. this.queryList('');
  533. }
  534. })
  535. .catch(() => {
  536. this.loading = false;
  537. });
  538. } else {
  539. // 上传文件
  540. let data = {
  541. project_id: this.book_id,
  542. book_chapter_node_id: this.select_node,
  543. type: this.type_list[this.type_index].value,
  544. file_id_list: this.file_id_list,
  545. };
  546. MangerAddResource(data)
  547. .then((res) => {
  548. this.loading = false;
  549. this.sourceAddFlag = false;
  550. if (res.status === 1) {
  551. this.file_list = [];
  552. this.file_id_list = [];
  553. this.queryList('');
  554. }
  555. })
  556. .catch(() => {
  557. this.loading = false;
  558. });
  559. }
  560. },
  561. // 点击资源
  562. selectSourceNode(item) {
  563. this.select_sources_id = item.id;
  564. this.sourceInfo = {
  565. name: item.name,
  566. label: item.label,
  567. intro: item.intro,
  568. };
  569. },
  570. getCurTime() {},
  571. // 更新信息确定按钮
  572. submitSourceInfo() {
  573. this.loading = true;
  574. MangerUpdateResourceInfo({
  575. id: this.select_sources_id,
  576. resource_info: this.sourceInfo,
  577. })
  578. .then((res) => {
  579. this.loading = false;
  580. this.sourceInfoFlag = false;
  581. if (res.status === 1) {
  582. this.$message.success('设置成功');
  583. this.queryList('');
  584. }
  585. })
  586. .catch(() => {
  587. this.loading = false;
  588. });
  589. },
  590. // 确定移动
  591. submitMoveSource() {
  592. this.loading = true;
  593. MangerMoveResource({
  594. id: this.select_sources_id,
  595. project_id: this.book_id,
  596. book_chapter_node_id: this.sourceMoveId[this.sourceMoveId.length - 1],
  597. })
  598. .then((res) => {
  599. this.loading = false;
  600. this.sourceMoveFlag = false;
  601. if (res.status === 1) {
  602. this.$message.success('移动成功');
  603. this.queryList('');
  604. }
  605. })
  606. .catch(() => {
  607. this.loading = false;
  608. });
  609. },
  610. // 预览
  611. viewDialog(file) {
  612. this.newpath = '';
  613. H5StartupFile({ file_id: file.file_id, index_file_name: 'index.html' }).then((res) => {
  614. this.newpath = res.file_url;
  615. this.visible = true;
  616. });
  617. },
  618. },
  619. };
  620. </script>
  621. <style lang="scss" scoped>
  622. @use '@/styles/mixin.scss' as *;
  623. .production-resource {
  624. @include page-content(true);
  625. .production-resource-main {
  626. display: flex;
  627. flex: 1;
  628. width: 100%;
  629. height: 100%;
  630. background: #fff;
  631. border-top: $border;
  632. .textbook-container {
  633. display: flex;
  634. flex-direction: column;
  635. width: 320px;
  636. height: calc(100vh - 120px);
  637. overflow: auto;
  638. border-right: $border;
  639. }
  640. .textbook-chapter {
  641. display: flex;
  642. flex: 1;
  643. flex-direction: column;
  644. &__header {
  645. display: flex;
  646. align-items: center;
  647. justify-content: flex-end;
  648. height: 40px;
  649. padding: 6px 4px;
  650. margin-bottom: 5px;
  651. background-color: #fff;
  652. border-bottom: 1px solid #e5e6eb;
  653. .operator {
  654. display: flex;
  655. flex: 1;
  656. justify-content: flex-end;
  657. .link {
  658. + .link {
  659. &::before {
  660. margin-right: 8px;
  661. color: #999;
  662. content: '|';
  663. }
  664. }
  665. }
  666. }
  667. }
  668. .search-box {
  669. display: flex;
  670. justify-content: space-between;
  671. padding: 5px;
  672. .search-left {
  673. display: flex;
  674. flex-flow: wrap;
  675. gap: 5px;
  676. align-items: center;
  677. }
  678. .label-btn {
  679. padding: 5px 10px;
  680. cursor: pointer;
  681. background: #ebebeb;
  682. border-radius: 4px;
  683. &.active {
  684. color: #f90;
  685. background: #ffefd6;
  686. }
  687. }
  688. .el-input,
  689. .el-select {
  690. width: 120px;
  691. }
  692. }
  693. }
  694. .sources-box {
  695. display: flex;
  696. flex-flow: wrap;
  697. gap: 10px;
  698. place-content: start start;
  699. padding: 5px;
  700. overflow: auto;
  701. .sources-item {
  702. width: 200px;
  703. cursor: pointer;
  704. &-txt {
  705. width: 400px;
  706. }
  707. &-zip {
  708. width: 500px;
  709. }
  710. &-border {
  711. border: 1px solid #ccc;
  712. }
  713. .el-image {
  714. width: 100%;
  715. height: 140px;
  716. border: 1px solid #ccc;
  717. }
  718. .name,
  719. .label {
  720. margin: 5px 0;
  721. font-size: 14px;
  722. font-weight: normal;
  723. line-height: 1.3;
  724. }
  725. :deep .audioLine {
  726. background: #f2f3f5;
  727. }
  728. &.active {
  729. .el-image {
  730. border-color: #f90;
  731. }
  732. .name,
  733. .label {
  734. color: #f90;
  735. }
  736. }
  737. }
  738. }
  739. }
  740. }
  741. </style>