folderDetail.vue 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920
  1. <template>
  2. <div class="f_box">
  3. <div class="f_box_top2" :style="{maxWidth:fold ? 'calc(100% - 10px)' : 'calc(100% - 320px)'}">
  4. <folderFileBoxVue
  5. :pid="pid"
  6. :userid="userid"
  7. :typeArray="typeArray"
  8. :folderid="folderid"
  9. :moFolderid="moFolderid"
  10. :data="data"
  11. @goCheckType="goCheckType"
  12. ></folderFileBoxVue>
  13. </div>
  14. <div class="f_box_top" v-loading="isLoading" v-show="!fold">
  15. <div class="f_b_foldBtn">
  16. <div @click="fold = true">
  17. <img src="../../../assets/icon/fold.svg">
  18. </div>
  19. </div>
  20. <div class="t_title">
  21. <div class="t_title">
  22. <img style="width: 20px;margin-right: 5px;" src="../../../assets/listfolder2.svg" alt="">
  23. <el-tooltip class="item" effect="dark" :content="data.name" placement="top">
  24. <div class="perName">{{ data.name }}</div>
  25. </el-tooltip>
  26. </div>
  27. <div style="margin-left: 6px;cursor: pointer;" @click="openCanEdit" v-if="userid == data.userid && data.isMo == '2'">
  28. <img style="width: 11px;" src="../../../assets/xiugai.svg" alt="">
  29. </div>
  30. </div>
  31. <div class="t_btn" v-if="userid == data.userid && data.isMo == '2'">
  32. <div v-if="userid == data.userid && data.isMo == '2'" @click="copyFolder">
  33. <img style="height: 14px; margin-right: 8px;" src="../../../assets/copyFlieG2.svg" alt="">
  34. {{lang.copy}}
  35. </div>
  36. <div v-if="userid == data.userid && data.isMo == '2'" @click="deleteFile(pid.split('/')[1])">
  37. <img style="width: 16px;margin-right: 8px;transform: scale(.9);" src="../../../assets/delFlieG.svg" alt="">
  38. {{lang.delete}}
  39. </div>
  40. </div>
  41. <div class="detail">
  42. <div class="detail_box">
  43. {{ !data.detail ? lang.noDesc : data.detail }}
  44. </div>
  45. </div>
  46. <div
  47. style="height: 1px;border-bottom: 1px #E8EBF0 solid; margin: 16px 0;"
  48. v-if="check1.length || check2.length || check3.length"
  49. ></div>
  50. <div
  51. style="font-size: 12px;font-family: PingFang;color: #111824;margin-bottom: 12px;font-weight: 600;"
  52. v-if="check1.length || check2.length || check3.length"
  53. >{{ lang.tag }}</div>
  54. <!-- data.userid == userid && -->
  55. <div class="tag_box" v-if="data.isMo == '2'">
  56. <div class="tag" v-loading="tagLoading1">
  57. <div class="tags" v-if="check1.length || check2.length || check3.length">
  58. <div v-for="(item,index) in tagData1" :key="index+'a'">
  59. <span style="background: #F0F4FF;color: #3370FF;" v-if="check1.includes(item.id)">{{ TagList(item) }}</span>
  60. </div>
  61. <div v-for="(item,index) in tagData2" :key="index+'b'">
  62. <span style="background: #EDFBF3;color: #039855;" v-if="check2.includes(item.id)">{{ TagList2(item) }}</span>
  63. </div>
  64. <div v-for="(item,index) in tagData3" :key="index+'c'">
  65. <span style="background: #FFFAEB;color: #DC6803;" v-if="check3.includes(item.name)">{{ TagList3(item) }}</span>
  66. </div>
  67. </div>
  68. <!-- <div class="tags" v-if="check2.length">
  69. </div>
  70. <div class="tags" v-if="check3.length">
  71. </div> -->
  72. </div>
  73. <div style="height: 1;border-bottom: 1px #E8EBF0 solid;margin: 16px 0;"></div>
  74. <div style="font-size: 12px;font-family: PingFang;color: #111824;margin-bottom: 12px;font-weight: 600;">
  75. {{lang.permissions}}
  76. </div>
  77. <div class="flieTag">
  78. <div v-if="data.juri == 1">
  79. <img src="../../../assets/siyou1.svg" alt="">
  80. <span>{{lang.private}}</span>
  81. </div>
  82. <div v-if="data.juri == 2">
  83. <img src="../../../assets/siyou3.svg" alt="">
  84. <span>{{lang.organization}}</span>
  85. </div>
  86. <div v-if="data.juri == 3">
  87. <img src="../../../assets/siyou2.svg" alt="">
  88. <span>{{lang.public}}</span>
  89. </div>
  90. </div>
  91. </div>
  92. <!-- data.isMo == '2' -->
  93. <div class="tag_box" v-else-if="false">
  94. <div class="tag_check">
  95. <div class="tag_check_box" v-if="this.check1.length">
  96. <span>{{lang.subject}}:</span>
  97. <span>{{ getTagName(1) }}</span>
  98. </div>
  99. <div class="tag_check_box" v-if="this.check2.length">
  100. <span>{{lang.grade}}:</span>
  101. <span>{{ getTagName(2) }}</span>
  102. </div>
  103. <div class="tag_check_box" v-if="this.check3.length">
  104. <span>{{lang.customize}}:</span>
  105. <span>{{ getTagName(3) }}</span>
  106. </div>
  107. </div>
  108. </div>
  109. </div>
  110. <div class="f_b_foldArea" v-show="fold">
  111. <div @click="fold = false">
  112. <img src="../../../assets/icon/fold.svg">
  113. </div>
  114. </div>
  115. <el-dialog
  116. :visible.sync="canEdit"
  117. width="30%"
  118. title=""
  119. class="canEditCss"
  120. :before-close="handleClose">
  121. <div class="canEditTit" slot="title">
  122. <img src="../../../assets/listfolder2.svg" alt="">
  123. <span>{{ lang.edit }}</span>
  124. </div>
  125. <div class="canEditFileName">{{lang.fileName}}</div>
  126. <el-input v-model="fileDetail.name" :placeholder=lang.inputName></el-input>
  127. <div class="canEditFileName">{{lang.description}}</div>
  128. <el-input
  129. type="textarea"
  130. :autosize="{ minRows: 2, maxRows: 4}"
  131. :placeholder=lang.inputDesc
  132. v-model="fileDetail.detail">
  133. </el-input>
  134. <div class="canEditFileName">{{lang.subjectTag}}</div>
  135. <selectTag
  136. v-loading="tagLoading1"
  137. v-model="fileDetailCheck1"
  138. :options="tagData1"
  139. :placeholder=lang.seTagType
  140. style="width: 65%"
  141. />
  142. <!-- @change="updateFolder()" -->
  143. <div class="canEditFileName">{{lang.gradeTag}}</div>
  144. <selectTag
  145. v-loading="tagLoading2"
  146. v-model="fileDetailCheck2"
  147. :options="tagData2"
  148. :placeholder=lang.seGradeTag
  149. style="width: 65%; "
  150. clearable
  151. />
  152. <!-- @change="updateFolder()" -->
  153. <div class="canEditFileName">{{lang.customTag}}:</div>
  154. <selectTag2
  155. v-loading="tagLoading3"
  156. v-model="fileDetailCheck3"
  157. :options="tagData3"
  158. :placeholder=lang.customTag
  159. style="width: 65%;"
  160. allow-create
  161. filterable
  162. clearable
  163. @change="handleTagChange"
  164. @deleteTag="deleteTag"
  165. />
  166. <!-- @change="handleTagChange" -->
  167. <div class="canEditFileName" style="margin-bottom: 9px;">{{ lang.permissions }}</div>
  168. <div class="tag" >
  169. <div class="tag_check">
  170. <el-radio-group v-model="fileDetail.juri" >
  171. <el-radio label="1">{{lang.private}}</el-radio>
  172. <el-radio label="2">{{lang.organization}}</el-radio>
  173. <el-radio label="3">{{lang.public}}</el-radio>
  174. </el-radio-group>
  175. </div>
  176. </div>
  177. <!-- disabled @change="updateFolder()" -->
  178. <span slot="footer" class="dialog-footer">
  179. <el-button @click="canEdit = false">{{lang.cancel}}</el-button>
  180. <el-button type="primary" @click="modifyDetail">{{lang.confirm}}</el-button>
  181. </span>
  182. </el-dialog>
  183. </div>
  184. </template>
  185. <script>
  186. import selectTag from "./components/selectTag.vue";
  187. import selectTag2 from "./components/selectTag2.vue";
  188. import folderFileBoxVue from "./folderFileBox.vue";
  189. export default {
  190. props: {
  191. pid: {
  192. type: String
  193. },
  194. userid: {
  195. type: String
  196. },
  197. typeArray: {
  198. type: Array
  199. },
  200. folderid: {
  201. String: String
  202. },
  203. moFolderid: {
  204. String: String
  205. }
  206. },
  207. components: {
  208. folderFileBoxVue,
  209. selectTag,
  210. selectTag2
  211. },
  212. data() {
  213. return {
  214. data: {},
  215. fileDetail:{},
  216. fileDetailCheck1:[],
  217. fileDetailCheck2:[],
  218. fileDetailCheck3:[],
  219. isLoading: false,
  220. canEdit: false,
  221. tagLoading1: false,
  222. tagLoading2: false,
  223. tagLoading3: false,
  224. tagData1: [],
  225. tagData2: [],
  226. tagData3: [],
  227. check1: [],
  228. check2: [],
  229. check3: [],
  230. fold:false,
  231. };
  232. },
  233. watch: {
  234. pid(newValue, oldValue) {
  235. this.data = {};
  236. this.getData();
  237. this.getTag(1); // 获取标签
  238. this.getTag(2); // 获取标签
  239. this.getTag(3); // 获取标签
  240. }
  241. },
  242. computed: {
  243. TagList(){
  244. return function(val) {
  245. if (this.check1.includes(val.id)) {
  246. for (let index = 0; index < this.check1.length; index++) {
  247. if (this.check1[index] == val.id) {
  248. return val.name
  249. }
  250. }
  251. }
  252. };
  253. },
  254. TagList2(){
  255. return function(val) {
  256. if (this.check2.includes(val.id)) {
  257. for (let index = 0; index < this.check2.length; index++) {
  258. if (this.check2[index] == val.id) {
  259. return val.name
  260. }
  261. }
  262. }
  263. };
  264. },
  265. TagList3(){
  266. return function(val) {
  267. if (this.check3.includes(val.name)) {
  268. for (let index = 0; index < this.check3.length; index++) {
  269. if (this.check3[index] == val.name) {
  270. return val.name
  271. }
  272. }
  273. }
  274. };
  275. },
  276. getTagName() {
  277. return function(type) {
  278. const tagDataMap = {
  279. 1: { data: this.tagData1, check: this.check1, key: "id" },
  280. 2: { data: this.tagData2, check: this.check2, key: "id" },
  281. 3: { data: this.tagData3, check: this.check3, key: "name" }
  282. };
  283. const { data, check, key } = tagDataMap[type] || {};
  284. return data
  285. ? data
  286. .filter(item => check.includes(item[key]))
  287. .map(item => item.name)
  288. .join(",")
  289. : "";
  290. };
  291. }
  292. },
  293. directives: {
  294. autoHeight: {
  295. update(el, binding) {
  296. const { value } = binding;
  297. if (value && typeof value === "number") {
  298. el.style.height = `${value}px`;
  299. } else {
  300. el.style.height = "auto";
  301. }
  302. },
  303. componentUpdated(el) {
  304. el.style.height = `${el.scrollHeight + 10}px`;
  305. }
  306. }
  307. },
  308. mounted() {
  309. this.getTag(1); // 获取标签
  310. this.getTag(2); // 获取标签
  311. this.getTag(3); // 获取标签
  312. this.getData();
  313. },
  314. methods: {
  315. openCanEdit(){
  316. this.canEdit = true;
  317. this.fileDetail = JSON.parse(JSON.stringify(this.data))
  318. this.fileDetailCheck1 = JSON.parse(JSON.stringify(this.check1))
  319. this.fileDetailCheck2 = JSON.parse(JSON.stringify(this.check2))
  320. this.fileDetailCheck3 = JSON.parse(JSON.stringify(this.check3))
  321. },
  322. modifyDetail(){
  323. if (!this.fileDetail.name.trim()) {
  324. this.$message.error(this.lang.folderNameMust);
  325. return;
  326. }
  327. let type = this.pid.split("/");
  328. let params = {
  329. id: type[1],
  330. n: this.fileDetail.name,
  331. d: this.fileDetail.detail,
  332. st: this.fileDetailCheck1.join(","),
  333. ct: this.fileDetailCheck2.join(","),
  334. t: this.fileDetailCheck3.join(","),
  335. j: this.fileDetail.juri,
  336. folderid: this.folderid
  337. };
  338. // t: this.fileDetailCheck3.join(","),
  339. // return console.log('params2',params);
  340. this.ajax
  341. .post(this.$store.state.fileApi + "updateFolder", [params])
  342. .then(res => {
  343. this.$message.success(this.lang.updateSuccess);
  344. this.canEdit=false
  345. this.getData();
  346. })
  347. .catch(err => {
  348. console.error(err);
  349. });
  350. // this.updateFolder()
  351. // this.handleTagChange()
  352. },
  353. handleClose(done) {
  354. done();
  355. },
  356. getData() {
  357. this.isLoading = true;
  358. let type = this.pid.split("/");
  359. let params = {
  360. id: type[1]
  361. };
  362. this.ajax
  363. .post(this.$store.state.api + "getKnowledgeDetail", [params])
  364. .then(res => {
  365. this.isLoading = false;
  366. this.data = res.data[0][0];
  367. this.fileDetail = JSON.parse(JSON.stringify(res.data[0][0]));
  368. this.fileDetailCheck1 = res.data[0][0].sub_tag
  369. ? res.data[0][0].sub_tag.split(",")
  370. : [];
  371. this.fileDetailCheck2 = res.data[0][0].class_tag
  372. ? res.data[0][0].class_tag.split(",")
  373. : [];
  374. this.fileDetailCheck3 = res.data[0][0].tag ? res.data[0][0].tag.split(",") : [];
  375. this.check1 = res.data[0][0].sub_tag
  376. ? res.data[0][0].sub_tag.split(",")
  377. : [];
  378. this.check2 = res.data[0][0].class_tag
  379. ? res.data[0][0].class_tag.split(",")
  380. : [];
  381. this.check3 = res.data[0][0].tag ? res.data[0][0].tag.split(",") : [];
  382. })
  383. .catch(err => {
  384. this.isLoading = false;
  385. console.error(err);
  386. });
  387. },
  388. getTag(type) {
  389. const tagLoadings = [
  390. this.tagLoading1,
  391. this.tagLoading2,
  392. this.tagLoading3
  393. ];
  394. tagLoadings[type - 1] = true;
  395. let params = {
  396. type: type,
  397. uid: this.userid
  398. };
  399. this.ajax
  400. .post(this.$store.state.api + "getKnowledgeTag", [params])
  401. .then(res => {
  402. tagLoadings[type - 1] = false;
  403. let _data = res.data[0];
  404. _data.forEach(i=>{
  405. if(this.lang.lang == "en" && i.com){
  406. i.name = i.com;
  407. }else if(this.lang.lang == "hk" && i.hk){
  408. i.name = i.hk;
  409. }
  410. })
  411. this[`tagData${type}`] = _data
  412. const checkKey = `check${type}`;
  413. if (type == 3) {
  414. this[checkKey] = this[checkKey].filter(tag =>
  415. this[`tagData${type}`].some(item => item.name === tag)
  416. );
  417. } else {
  418. this[checkKey] = this[checkKey].filter(tag =>
  419. this[`tagData${type}`].some(item => item.id === tag)
  420. );
  421. }
  422. })
  423. .catch(err => {
  424. tagLoadings[type - 1] = false;
  425. console.error(err);
  426. });
  427. },
  428. deleteFile(id) {
  429. this.$confirm(this.lang.confirmDelete, this.lang.prompt, {
  430. confirmButtonText: this.lang.confirm,
  431. cancelButtonText: this.lang.cancel,
  432. type: "warning"
  433. })
  434. .then(() => {
  435. let params = [{ ids: id, folderids: this.folderid }];
  436. this.ajax
  437. .post(this.$store.state.fileApi + "deleteFolder", params)
  438. .then(res => {
  439. this.$message({
  440. message: this.lang.deleteSuccess,
  441. type: "success"
  442. });
  443. this.$emit("checkType", this.pid.split("/")[0]);
  444. })
  445. .catch(err => {
  446. this.$message.error(this.lang.deleteFail);
  447. console.error(err);
  448. });
  449. })
  450. .catch(() => {});
  451. },
  452. goCheckType(val){
  453. this.$emit("checkType", val);
  454. },
  455. copyFolder() {
  456. this.isLoading = true;
  457. let params = [
  458. {
  459. n: this.data.name,
  460. fd: this.data.detail,
  461. uid: this.userid,
  462. folderid: this.folderid,
  463. }
  464. ];
  465. this.ajax
  466. .post(this.$store.state.fileApi + "copyFolder", params)
  467. .then(res => {
  468. this.isLoading = false;
  469. this.$message({
  470. message: this.lang.copySuccess,
  471. type: "success"
  472. });
  473. this.$emit("checkType", this.pid.split("/")[0]);
  474. })
  475. .catch(err => {
  476. this.isLoading = false;
  477. this.$message.error(this.lang.copyFail);
  478. console.error(err);
  479. });
  480. },
  481. editConfirm() {
  482. if (!this.canEdit) {
  483. this.canEdit = true;
  484. this.data.detail += "*1*/123/";
  485. this.$nextTick(() => {
  486. this.data.detail = this.data.detail.replace("*1*/123/", "");
  487. this.$refs.binfo_textarea.focus();
  488. });
  489. } else {
  490. this.canEdit = false;
  491. this.updateFolder();
  492. }
  493. },
  494. updateFolder() {
  495. if (!this.data.name.trim()) {
  496. this.$message.error(this.lang.folderNameMust);
  497. this.canEdit = true;
  498. return;
  499. }
  500. let type = this.pid.split("/");
  501. let params = {
  502. id: type[1],
  503. n: this.data.name,
  504. d: this.data.detail,
  505. st: this.check1.join(","),
  506. ct: this.check2.join(","),
  507. t: this.check3.join(","),
  508. j: this.data.juri,
  509. folderid: this.folderid
  510. };
  511. // return console.log('params',params);
  512. this.ajax
  513. .post(this.$store.state.fileApi + "updateFolder", [params])
  514. .then(res => {
  515. this.$message.success(this.lang.updateSuccess);
  516. this.getData();
  517. })
  518. .catch(err => {
  519. console.error(err);
  520. });
  521. },
  522. handleTagChange(value) {
  523. // console.log('value',value);
  524. const tagArray = this.tagData3;
  525. const selectedTags = value.flatMap(tag =>
  526. tag.split(/[,,]/).map(t => t.trim())
  527. );
  528. // 去掉选中反而选中不带逗号的值
  529. const uniqueTags = [
  530. ...new Set(selectedTags.map(tag => tag.replace(/[,,].*/, "").trim()))
  531. ];
  532. const missingTags = uniqueTags.filter(
  533. selectedTag => !tagArray.some(tag => tag.name === selectedTag)
  534. );
  535. // console.log("Selected tags:", uniqueTags);
  536. // console.log("Missing tags:", missingTags);
  537. this.fileDetailCheck3 = uniqueTags;
  538. missingTags.forEach(tag => this.addTag(tag));
  539. // this.updateFolder();
  540. },
  541. addTag(name) {
  542. let params = {
  543. n: name,
  544. uid: this.userid,
  545. type: 3,
  546. j: 3
  547. };
  548. this.ajax
  549. .post(this.$store.state.api + "addTag", [params])
  550. .then(res => {
  551. this.getTag(3);
  552. })
  553. .catch(err => {
  554. console.error(err);
  555. });
  556. },
  557. deleteTag(id, n) {
  558. this.$confirm(this.lang.confirmDeTag, this.lang.prompt, {
  559. confirmButtonText: this.lang.confirm,
  560. cancelButtonText: this.lang.cancel,
  561. type: "warning"
  562. })
  563. .then(() => {
  564. this.check3 = this.check3.filter(t => t != n);
  565. this.updateFolder();
  566. let params = {
  567. id: id
  568. };
  569. this.ajax
  570. .post(this.$store.state.api + "deleteTag", [params])
  571. .then(res => {
  572. this.$message.success(this.lang.deleteSuccess);
  573. this.getTag(3);
  574. })
  575. .catch(err => {
  576. console.error(err);
  577. });
  578. })
  579. .catch(() => {});
  580. }
  581. }
  582. };
  583. </script>
  584. <style scoped>
  585. .f_box {
  586. width: 100%;
  587. height: 100%;
  588. position: relative;
  589. border-radius: 8px;
  590. box-sizing: border-box;
  591. display: flex;
  592. gap: 16px;
  593. }
  594. .f_box_top {
  595. padding: 10px;
  596. width: 272px;
  597. padding: 16px 24px 24px 24px;
  598. flex-shrink: 0;
  599. box-sizing: border-box;
  600. height: calc(100% - 24px);
  601. border-radius: 8px;
  602. background-color: #fff;
  603. box-sizing: border-box;
  604. }
  605. .f_b_foldBtn{
  606. width: 100%;
  607. height: 20px;
  608. display: flex;
  609. align-items: center;
  610. justify-content: flex-end;
  611. }
  612. .f_b_foldArea{
  613. width: auto;
  614. height: auto;
  615. position: absolute;
  616. right: -10px;
  617. top: 5px;
  618. display: flex;
  619. }
  620. .f_b_foldArea>div{
  621. width: 30px;
  622. height: 30px;
  623. display: flex;
  624. align-items: center;
  625. justify-content: center;
  626. border-radius: 15px 0 0 15px;
  627. background-color: #fff;
  628. cursor: pointer;
  629. box-sizing: border-box;
  630. border: 1px #E8EBF0 solid;
  631. border-right: none;
  632. }
  633. .f_b_foldArea>div>img{
  634. width: 20px;
  635. height: 20px;
  636. }
  637. .f_b_foldBtn>div{
  638. width: 20px;
  639. height: 20px;
  640. cursor: pointer;
  641. }
  642. .f_b_foldBtn>div>img{
  643. width: 100%;
  644. height: 100%;
  645. transform: rotate(180deg);
  646. }
  647. .f_box_top2{
  648. height: calc(100% - 48px);
  649. flex: 1;
  650. max-width: calc(100% - 320px);
  651. display: flex;
  652. flex-direction: column !important;
  653. background-color: #fff;
  654. border-radius: 8px;
  655. padding: 0 0 24px;
  656. }
  657. .t_title{
  658. display: flex;
  659. font-weight: 600;
  660. font-size: 16px;
  661. /* width: 180px; */
  662. color: #111842;
  663. }
  664. /* .t_title p{
  665. overflow: hidden;
  666. white-space: nowrap;
  667. text-overflow: ellipsis;
  668. } */
  669. .t_btn{
  670. display: flex;
  671. gap: 10px;
  672. color: #485264;
  673. padding-top: 8px;
  674. /* margin: 10px 0; */
  675. }
  676. .t_btn div{
  677. padding: 6px 12px;
  678. background: #f4f4f7;
  679. border-radius: 6px;
  680. box-sizing: border-box;
  681. border: 1 #e8ebf0 solid;
  682. font-size: 12.8px;
  683. cursor: pointer;
  684. display: flex;
  685. align-items: center;
  686. justify-content: center;
  687. border: 1px #E8EBF0 solid;
  688. }
  689. .detail_box{
  690. font-size: 12.8px;
  691. color: #667085;
  692. padding-top: 12px;
  693. font-family: PingFang;
  694. -webkit-line-clamp: 5;
  695. display: -webkit-box;
  696. -webkit-box-orient: vertical;
  697. overflow: hidden;
  698. text-overflow: ellipsis;
  699. }
  700. .tags{
  701. display: flex;
  702. flex-wrap: wrap;
  703. align-items: center;
  704. font-family: PingFang;
  705. }
  706. .tags div {
  707. margin-bottom: 10px;
  708. }
  709. .tags >>> span{
  710. height: 24.38px;
  711. line-height: 24.38px;
  712. padding: 4px 10px;
  713. border-radius: 6px;
  714. border: none;
  715. box-sizing: border-box;
  716. font-size: 12.8px;
  717. margin-right: 8px;
  718. }
  719. .flieTag{
  720. font-size: 12px;
  721. font-family: PingFang SC;
  722. /* margin-top: 8px; */
  723. color: #667085;
  724. background-color: #F4F4F7;
  725. height: 55px;
  726. padding: 6px;
  727. border-radius: 8px;
  728. display: flex;
  729. justify-content: center;
  730. align-items: center;
  731. font-size: 12.8px;
  732. box-sizing: border-box;
  733. }
  734. .flieTag div{
  735. display: flex;
  736. align-items: center;
  737. }
  738. .flieTag img{
  739. width: 14px;
  740. margin-right: 5px;
  741. }
  742. .tag_box > .tag > .tag_title {
  743. /* margin-top: 10px; */
  744. display: flex;
  745. /* flex-direction: column; */
  746. flex-wrap: wrap;
  747. }
  748. .tag_title div{
  749. display: flex;
  750. width: 100%;
  751. flex-wrap: wrap;
  752. }
  753. .tag_box > .tag > .tag_check {
  754. display: flex;
  755. }
  756. /* .selectBox {
  757. width: 100%;
  758. height: 100%;
  759. display: flex;
  760. align-items: center;
  761. justify-content: space-between;
  762. } */
  763. /* .controlsBox {
  764. display: flex;
  765. align-items: center;
  766. width: auto;
  767. height: 100%;
  768. display: flex;
  769. }
  770. .delSelect {
  771. width: 16px;
  772. height: 16px;
  773. align-items: center;
  774. justify-content: center;
  775. background: url("../../../assets/icon/classroomObservation/del.svg") no-repeat;
  776. background-size: 100% 100%;
  777. box-sizing: border-box;
  778. } */
  779. /* .tag_check_box {
  780. width: 100%;
  781. display: flex;
  782. margin: 0 0 10px;
  783. flex-shrink: 0;
  784. }
  785. .tag_check_box > span:nth-child(1) {
  786. min-width: 65px;
  787. text-align-last: justify;
  788. }
  789. .tag_check_box > span:nth-child(2) {
  790. word-break: break-all;
  791. } */
  792. .canEditCss >>> .el-dialog{
  793. border-radius: 8px;
  794. width: 500px !important;
  795. }
  796. .canEditCss >>> .el-dialog__body{
  797. padding-top: 0;
  798. padding-bottom: 10px !important;
  799. }
  800. .canEditCss >>> .el-dialog__header{
  801. background-color: rgb(251, 251, 252);
  802. border-radius: 8px 8px 0 0;
  803. font-family: Pingfang;
  804. border-bottom: .5px rgb(244, 246, 248) solid;
  805. }
  806. .canEditTit{
  807. display: flex;
  808. justify-content: flex-start;
  809. align-items: center;
  810. }
  811. .canEditTit img{
  812. width: 25px;
  813. margin-right: 10px;
  814. }
  815. .canEditFileName{
  816. font-size: 14px;
  817. color: #111824;
  818. font-family: PingFang;
  819. height: 21px;
  820. line-height: 21px;
  821. padding-top: 16px;
  822. margin-bottom: 4px;
  823. }
  824. .perName{
  825. flex-shrink: 0;
  826. min-width: 50px;
  827. max-width: 120px;
  828. overflow: hidden;
  829. white-space: nowrap;
  830. text-overflow: ellipsis;
  831. }
  832. </style>