newsAdd.vue.bak 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809
  1. <template>
  2. <div>
  3. <div class="inner--headers">
  4. <h2>{{ pageId }}</h2>
  5. <div class="bread--crumbs--wrap">
  6. <span>홈</span>
  7. <span>미디어 관리</span>
  8. <span>{{ pageId }}</span>
  9. </div>
  10. </div>
  11. <div class="view-wrap mt--45">
  12. <div class="view-box">
  13. <div class="view-box-top">
  14. <h3 v-if="pageType == 'I'">뉴스룸 등록</h3>
  15. <h3 v-else>뉴스룸 수정</h3>
  16. </div>
  17. <div class="view-box-btm">
  18. <div class="form-style1">
  19. <table>
  20. <colgroup>
  21. <col style="width: 12.5rem" />
  22. <col />
  23. </colgroup>
  24. <tbody>
  25. <tr>
  26. <th>언어</th>
  27. <td>
  28. <v-radio-group
  29. v-model="form.formValue0"
  30. inline
  31. hide-details
  32. class="radio--group"
  33. >
  34. <v-radio label="Korean" value="KR"></v-radio>
  35. <v-radio label="English" value="EN"></v-radio>
  36. <v-radio label="Chinese" value="CN"></v-radio>
  37. <v-radio label="Japanese" value="JP"></v-radio>
  38. </v-radio-group>
  39. </td>
  40. </tr>
  41. <tr>
  42. <th>노출여부<span class="bul">*</span></th>
  43. <td>
  44. <v-radio-group
  45. class="radio--group"
  46. v-model="form.formValue2"
  47. inline
  48. hide-details
  49. >
  50. <v-radio label="노출" value="Y"></v-radio>
  51. <v-radio label="비노출" value="N"></v-radio>
  52. </v-radio-group>
  53. </td>
  54. </tr>
  55. <tr>
  56. <th>고정여부<span class="bul">*</span></th>
  57. <td>
  58. <v-radio-group
  59. class="radio--group"
  60. v-model="form.formValue3"
  61. inline
  62. hide-details
  63. >
  64. <v-radio label="고정 " value="Y"></v-radio>
  65. <v-radio label="비고정" value="N"></v-radio>
  66. </v-radio-group>
  67. </td>
  68. </tr>
  69. <tr>
  70. <th>제목<span class="bul">*</span></th>
  71. <td>
  72. <v-text-field
  73. v-model="form.formValue1"
  74. class="custom-input mini"
  75. placeholder="제목을 입력해주세요."
  76. :rules="[useValid.required('제목')]"
  77. ></v-text-field>
  78. </td>
  79. </tr>
  80. <tr>
  81. <th>해시태그<span class="bul">*</span></th>
  82. <td>
  83. <v-text-field
  84. v-model="form.formValue7"
  85. class="custom-input mini"
  86. placeholder="해시태그를 입력해주세요. 예) 태그, 태그 형태로 여러개 입력시 ,를 이용하여 입력해주세요"
  87. :rules="[useValid.required('제목')]"
  88. ></v-text-field>
  89. </td>
  90. </tr>
  91. <tr>
  92. <th>썸네일 이미지<span class="bul">*</span></th>
  93. <td>
  94. <div class="equip--image--wrap">
  95. <!--이미지가 없을 때-->
  96. <div class="equip--image" v-show="!form.formValue4">
  97. <img src="/assets/img/ic_no_img.svg" />
  98. </div>
  99. <!--이미지 첨부했을 때-->
  100. <div class="equip--image" v-show="form.formValue4">
  101. <CoolLightBox
  102. v-if="items.length > 0"
  103. :items="items"
  104. :index="index"
  105. @close="index = null"
  106. />
  107. <div class="images-wrapper">
  108. <div
  109. class="image"
  110. :key="imageIndex"
  111. @click="index = imageIndex"
  112. >
  113. <img id="preview_image" :src="imgTemp" />
  114. </div>
  115. </div>
  116. </div>
  117. <div class="equip--image--select">
  118. <div class="form--group">
  119. <label
  120. for="fileUpload_pic"
  121. class="file--btn"
  122. @click="fnPicFileUploadOpen()"
  123. >파일 선택</label
  124. >
  125. <v-file-input
  126. v-model="form.formValue4"
  127. id="fileUpload_pic"
  128. ref="fileupload_pic"
  129. accept=".jpg, .jpeg, .png, .gif"
  130. variant="plain"
  131. hide-details
  132. placeholder="선택된 파일 없음"
  133. prepend-icon=""
  134. class="custom-input"
  135. style="max-width: 400px"
  136. height="33px"
  137. :clearable="false"
  138. @change="fnUploadPicFileCheck()"
  139. >
  140. <template #append>
  141. <div class="v-input__icon v-input__icon--clear">
  142. <button
  143. @click="clearFile"
  144. type="button"
  145. aria-label="clear icon"
  146. tabindex="-1"
  147. class="v-icon notranslate v-icon--link mdi mdi-close"
  148. ></button>
  149. </div>
  150. </template>
  151. </v-file-input>
  152. </div>
  153. <p class="equip--image--desc">
  154. (권장 이미지 : 1024 x 768 / gif, jpg, jpeg, png)
  155. </p>
  156. </div>
  157. <div class="div_error_text">{{ objProc.validErrorMessage }}</div>
  158. </div>
  159. </td>
  160. </tr>
  161. <tr>
  162. <th>내용<span class="bul">*</span></th>
  163. <td>
  164. <vue-editor
  165. ref="quillEditor"
  166. v-model="form.formValue5"
  167. :options="editorOptions"
  168. ></vue-editor>
  169. </td>
  170. </tr>
  171. <tr>
  172. <th>첨부 파일</th>
  173. <td>
  174. <div
  175. class="form--group--inner"
  176. v-if="pageType == 'U' && uploadFiles[0].file_name"
  177. >
  178. <div @click="fnFileDownload(uploadFiles[0])" class="text--box">
  179. {{ uploadFiles[0].ogn_name }}
  180. </div>
  181. <!-- <v-btn
  182. elevation="0"
  183. class="list--dell--btn"
  184. width="84px"
  185. height="40px"
  186. @click="fnFileDeleteInfo(uploadFiles[0].file_name)"
  187. >삭제하기</v-btn
  188. > -->
  189. </div>
  190. <div class="form--group flex--type max--w320">
  191. <v-file-input
  192. v-model="form.formValue6"
  193. id="fileupload"
  194. ref="fileupload"
  195. accept=".jpg, .jpeg, .png, .zip, .pdf, .ppt, .xls, .pptx, .xlsx, .hwp, .doc, .docx"
  196. placeholder=""
  197. class="custom-input mini"
  198. prepend-icon=""
  199. label=""
  200. variant="outlined"
  201. hide-details
  202. @change="fnUploadFileCheck()"
  203. ></v-file-input>
  204. <v-btn class="file--btn" elevation="0" @click="fnFileUploadOpen()"
  205. >첨부하기</v-btn
  206. >
  207. </div>
  208. </td>
  209. </tr>
  210. </tbody>
  211. </table>
  212. </div>
  213. </div>
  214. </div>
  215. <div class="view-btm-btn">
  216. <div class="btn-l">
  217. <v-btn class="custom-btn btn-list" @click="listLocated"
  218. ><i class="ico"></i>목록</v-btn
  219. >
  220. <v-btn v-show="pageType == 'U'" class="custom-btn btn-del" @click="fnDelEvt"
  221. ><i class="ico"></i>삭제</v-btn
  222. >
  223. </div>
  224. <div class="btn-r">
  225. <v-btn v-if="pageType == 'I'" class="custom-btn btn-blue2" @click="fnBtnEvt"
  226. ><i class="ico"></i>저장</v-btn
  227. >
  228. <v-btn v-else class="custom-btn btn-blue2" @click="fnBtnEvt"
  229. ><i class="ico"></i>수정</v-btn
  230. >
  231. </div>
  232. </div>
  233. </div>
  234. </div>
  235. </template>
  236. <script setup>
  237. import useAxios from "@/composables/useAxios";
  238. import useUtil from "@/composables/useUtil";
  239. import useErrorHandler from "@/composables/useErrorHandler";
  240. /************************************************************************
  241. | 레이아웃
  242. ************************************************************************/
  243. definePageMeta({
  244. layout: "default",
  245. });
  246. /************************************************************************
  247. | 스토어
  248. ************************************************************************/
  249. const useDtStore = useDetailStore();
  250. /************************************************************************
  251. | 전역
  252. ************************************************************************/
  253. const { $toast, $log, $dayjs, $eventBus } = useNuxtApp();
  254. const router = useRouter();
  255. const pageId = ref("NEWS ROOM");
  256. const index = ref(null);
  257. const imageIndex = ref(0);
  258. const items = ref([]);
  259. const quillEditor = ref(null);
  260. const imgTemp = ref(null);
  261. const rowId = ref();
  262. const form = ref({
  263. formValue0: "KR",
  264. formValue1: "",
  265. formValue2: "Y",
  266. formValue3: "N",
  267. formValue4: null,
  268. formValue5: "",
  269. formValue6: null,
  270. formValue7: null,
  271. fileResponse: null,
  272. });
  273. const apiUrl = ref("");
  274. apiUrl.value = import.meta.env.VITE_APP_API_URL;
  275. const fileUpload = ref(null);
  276. const uploadFiles = ref([
  277. {
  278. file_name: "",
  279. ogn_name: "",
  280. },
  281. ]);
  282. const uploadPicFiles = ref([
  283. {
  284. file_name: "",
  285. ogn_name: "-",
  286. },
  287. ]);
  288. const deleteFile = ref("");
  289. const objProc = ref({
  290. validErrorMessage: "",
  291. });
  292. const pageType = ref("");
  293. /************************************************************************
  294. | 함수(METHODS)
  295. ************************************************************************/
  296. const listLocated = () => {
  297. router.push({
  298. path: "/view/media/newsList",
  299. });
  300. };
  301. const editorOptions = ref({
  302. modules: {
  303. toolbar: {
  304. handlers: {
  305. image: () => {
  306. // DOM 요소로 input[type="file"]을 생성하여 이미지 파일을 선택하게 한다.
  307. const input = document.createElement("input");
  308. input.setAttribute("type", "file");
  309. input.setAttribute("accept", "image/*");
  310. input.click(); // 파일 선택 창 열기
  311. input.onchange = async () => {
  312. const file = input.files[0];
  313. if (file) {
  314. const formDataEdt = new FormData();
  315. formDataEdt.append("picObj", file);
  316. try {
  317. // const response = await this.$api.post("/file/upload", formDataEdt, {
  318. // headers: { "Content-Type": "multipart/form-data" },
  319. // }); // 서버에 이미지 업로드
  320. const response = await useAxios()
  321. .post("/pic/upload", formDataEdt, {
  322. headers: { "Content-Type": "multipart/form-data" },
  323. })
  324. .then((res) => {
  325. const quill = quillEditor.value.quill;
  326. let range = quill.getSelection(); // 현재 커서 위치 가져오기
  327. const filePath = res.data.ogn_name.path.replace(/.*\/files\//, "");
  328. const fileName = res.data.ogn_name.file_name;
  329. quill.insertEmbed(
  330. range.index,
  331. "image",
  332. apiUrl.value + "/images/" + filePath + "/" + fileName
  333. );
  334. quill.setSelection(range.index + 1, 0);
  335. })
  336. .catch((error) => {
  337. if (error.status == 500) {
  338. let param = {
  339. id: pageId,
  340. title: "공고사항",
  341. content: "10mb 이상은 업로드가 불가합니다.",
  342. yes: {
  343. text: "확인",
  344. isProc: false,
  345. },
  346. no: {
  347. text: "취소",
  348. isProc: false,
  349. },
  350. };
  351. $eventBus.emit("OPEN_CONFIRM_POP_UP", param);
  352. }
  353. })
  354. .finally(() => {
  355. //$log.debug("[equipMgmtReg][fnGetTenantList][finished]");
  356. //objSlt.value.tenantNameList = _cloneDeep(temp);
  357. });
  358. } catch (error) {
  359. console.error("Image upload failed:", error);
  360. }
  361. }
  362. };
  363. },
  364. },
  365. },
  366. },
  367. });
  368. /**
  369. * 첨부파일 다운로드
  370. */
  371. const fnFileDownload = (objFile) => {
  372. let reqData = { file_name: objFile.file_name };
  373. useAxios()
  374. .post("/file/download", reqData, { responseType: "blob" })
  375. .then((res) => {
  376. const contentType = res.headers["content-type"] || "application/octet-stream"; // 기본값
  377. const blob = new Blob([res.data], { type: contentType });
  378. let fileUrl = window.URL.createObjectURL(blob);
  379. let link = document.createElement("a");
  380. link.href = fileUrl;
  381. link.style.display = "none";
  382. console.log(objFile.ogn_name);
  383. link.download = objFile.ogn_name;
  384. document.body.appendChild(link);
  385. link.click();
  386. link.remove();
  387. window.URL.revokeObjectURL(fileUrl);
  388. })
  389. .catch((error) => {})
  390. .finally(() => {});
  391. };
  392. const fnPicFileUploadOpen = () => {
  393. let fileUpload = document.getElementById("fileupload_pic");
  394. if (fileUpload != null) {
  395. fileUpload.click();
  396. }
  397. };
  398. const fnFileUploadOpen = () => {
  399. let fileUpload = document.getElementById("fileupload");
  400. if (fileUpload != null) {
  401. fileUpload.click();
  402. }
  403. };
  404. /**
  405. * 첨부 파일 등록
  406. */
  407. const fnUploadFileCheck = () => {
  408. if (form.value.formValue6) {
  409. // 10Mb 이상은 업로드 불가
  410. if (form.value.formValue6.size > 10 * 1024 * 1024) {
  411. fnOpenCommPop("10mb 이상은 업로드가 불가합니다.");
  412. form.value.formValue6 = null;
  413. return;
  414. }
  415. // 이미지 파일 형식 체크
  416. let extension = form.value.formValue6.name.split(".").pop().toLowerCase();
  417. if (
  418. extension != "jpg" &&
  419. extension != "jpeg" &&
  420. extension != "png" &&
  421. extension != "gif" &&
  422. extension != "zip" &&
  423. extension != "ppt" &&
  424. extension != "pptx" &&
  425. extension != "pdf" &&
  426. extension != "xls" &&
  427. extension != "xlsx" &&
  428. extension != "hwp" &&
  429. extension != "doc" &&
  430. extension != "docx"
  431. ) {
  432. fnOpenCommPop("파일 형식 또는 확장자가 올바르지 않습니다.");
  433. form.value.formValue6 = null;
  434. return;
  435. }
  436. }
  437. };
  438. /**
  439. * 이미지 다운로드
  440. */
  441. const fnPicFileDownload = (objFile) => {
  442. let local = this;
  443. let reqData = { file_name: objFile.file_name };
  444. useAxios()
  445. .post("/picInfo/download", reqData)
  446. .then((res) => {
  447. let reader = new FileReader();
  448. reader.readAsDataURL(res.data);
  449. reader.onloadend = function () {
  450. // File 객체 생성
  451. let blob = new Blob([res.data]);
  452. let file = new File([blob], objFile.ogn_name);
  453. local.form.formValue4 = file;
  454. // 화면 랜더링
  455. local.items[0] = reader.result;
  456. console.log(reader.result);
  457. $("#preview_image").attr("src", reader.result);
  458. };
  459. })
  460. .catch((err) => {
  461. this.$log.debug("[unitEquipmentAdd][fnPicFileDownload][error]");
  462. })
  463. .finally(() => {
  464. this.$log.debug("[unitEquipmentAdd][fnPicFileDownload][finally]");
  465. });
  466. };
  467. const fnUploadPicFileCheck = () => {
  468. if (form.value.formValue4) {
  469. // 10Mb 이상은 업로드 불가
  470. if (form.value.formValue4.size > 10 * 1024 * 1024) {
  471. fnOpenCommPop("10mb 이상은 업로드가 불가합니다.");
  472. form.value.formValue4 = null;
  473. return;
  474. }
  475. // 이미지 파일 형식 체크
  476. let extension = form.value.formValue4.name.split(".").pop().toLowerCase();
  477. if (
  478. extension != "jpg" &&
  479. extension != "jpeg" &&
  480. extension != "png" &&
  481. extension != "gif"
  482. ) {
  483. fnOpenCommPop("파일 형식 또는 확장자가 올바르지 않습니다.");
  484. form.value.formValue4 = null;
  485. return;
  486. }
  487. objProc.validErrorMessage = "";
  488. // 이미지 미리보기
  489. let previewImage = new Image();
  490. let tempImageUrl = window.URL.createObjectURL(form.value.formValue4);
  491. console.log(tempImageUrl);
  492. previewImage.src = tempImageUrl;
  493. items.value[0] = tempImageUrl;
  494. imgTemp.value = tempImageUrl;
  495. }
  496. };
  497. const clearFile = () => {
  498. form.value.formValue4 = null;
  499. };
  500. /*======================================================================
  501. | 작성 시퀀스
  502. | 1. 작성 컨펌
  503. | 2. 버튼 체크
  504. | 3. 등록시 -> 등록 API 호출
  505. ======================================================================*/
  506. const fnOpenCommPop = (__TEXT) => {
  507. let param = {
  508. id: pageId,
  509. title: "알림",
  510. content: __TEXT,
  511. yes: {
  512. text: "확인",
  513. isProc: false,
  514. },
  515. };
  516. $eventBus.emit("OPEN_CONFIRM_POP_UP", param);
  517. };
  518. const fnRegEvt = () => {
  519. let param = {
  520. id: pageId,
  521. title: "뉴스룸 등록",
  522. content: "등록하시겠습니까?",
  523. yes: {
  524. text: "등록",
  525. isProc: true,
  526. event: "FN_INSERT",
  527. param: "",
  528. },
  529. no: {
  530. text: "취소",
  531. isProc: false,
  532. },
  533. };
  534. $eventBus.emit("OPEN_CONFIRM_POP_UP", param);
  535. };
  536. const fnUpdEvt = () => {
  537. let param = {
  538. id: pageId,
  539. title: "뉴스룸 수정",
  540. content: "수정하시겠습니까?",
  541. yes: {
  542. text: "확인",
  543. isProc: true,
  544. event: "FN_UPDATE",
  545. param: "",
  546. },
  547. no: {
  548. text: "취소",
  549. isProc: false,
  550. },
  551. };
  552. $eventBus.emit("OPEN_CONFIRM_POP_UP", param);
  553. };
  554. const fnInsert = () => {
  555. let frm = new FormData();
  556. let wterGet = localStorage.getItem("tempAccess");
  557. let params = JSON.stringify({
  558. //seq: useDtStore.boardInfo.seq,
  559. //seq: "",
  560. brd_cd: "BR00",
  561. brd_lang: form.value.formValue0,
  562. show_yn: form.value.formValue2,
  563. hash_tag: form.value.formValue7,
  564. title: form.value.formValue1,
  565. content: form.value.formValue5,
  566. wter: wterGet,
  567. fix_yn: form.value.formValue3,
  568. });
  569. frm.append("params", params);
  570. frm.append("picObj", form.value.formValue4);
  571. frm.append("fileObj", form.value.formValue6);
  572. useAxios()
  573. .post("/brd/ins", frm, { headers: { "Content-Type": "multipart/form-data" } })
  574. .then((res) => {
  575. router.push("/view/media/newsList");
  576. })
  577. .catch((error) => {
  578. let param = {
  579. id: pageId,
  580. title: "뉴스룸 등록",
  581. content: "고정여부값은 4건 초과 등록할 수 없습니다",
  582. yes: {
  583. text: "확인",
  584. isProc: true,
  585. },
  586. no: {
  587. text: "취소",
  588. isProc: false,
  589. },
  590. };
  591. $eventBus.emit("OPEN_CONFIRM_POP_UP", param);
  592. })
  593. .finally(() => {
  594. //$log.debug("[equipMgmtReg][fnGetTenantList][finished]");
  595. //objSlt.value.tenantNameList = _cloneDeep(temp);
  596. });
  597. };
  598. const fnUpdate = () => {
  599. let frm = new FormData();
  600. let wterGet = localStorage.getItem("tempAccess");
  601. let params = JSON.stringify({
  602. seq: useDtStore.boardInfo.seq,
  603. brd_cd: "BR00",
  604. brd_lang: form.value.formValue0,
  605. show_yn: form.value.formValue2,
  606. title: form.value.formValue1,
  607. content: form.value.formValue5,
  608. hash_tag: form.value.formValue7,
  609. wter: wterGet,
  610. fix_yn: form.value.formValue3,
  611. url_link: "", //?
  612. });
  613. frm.append("params", params);
  614. frm.append("picObj", form.value.formValue4);
  615. frm.append("fileObj", form.value.formValue6);
  616. useAxios()
  617. .post("/brd/upd", frm, { headers: { "Content-Type": "multipart/form-data" } })
  618. .then((res) => {
  619. router.push("/view/media/newsList");
  620. })
  621. .catch((error) => {
  622. //$log.debug("[equipMgmtReg][fnGetTenantList][error]");
  623. //useErrorHandler().fnSetCommErrorHandle(error, fnGetTenantList);
  624. })
  625. .finally(() => {
  626. //$log.debug("[equipMgmtReg][fnGetTenantList][finished]");
  627. //objSlt.value.tenantNameList = _cloneDeep(temp);
  628. });
  629. };
  630. const fnDelEvt = () => {
  631. let param = {
  632. id: pageId,
  633. title: "뉴스룸",
  634. content: "삭제하시겠습니까?",
  635. yes: {
  636. text: "확인",
  637. isProc: true,
  638. event: "FN_DELETE",
  639. param: "",
  640. },
  641. no: {
  642. text: "취소",
  643. isProc: false,
  644. },
  645. };
  646. $eventBus.emit("OPEN_CONFIRM_POP_UP", param);
  647. };
  648. const fnDelete = () => {
  649. let wterGet = localStorage.getItem("tempAccess");
  650. let req = {
  651. brd_cd: "BR00",
  652. seq: useDtStore.boardInfo.seq,
  653. wter: wterGet,
  654. };
  655. useAxios()
  656. .post("/brd/del", req)
  657. .then((res) => {
  658. router.push("/view/media/newsList");
  659. })
  660. .catch((error) => {
  661. //$log.debug("[equipMgmtReg][fnGetTenantList][error]");
  662. //useErrorHandler().fnSetCommErrorHandle(error, fnGetTenantList);
  663. })
  664. .finally(() => {
  665. //$log.debug("[equipMgmtReg][fnGetTenantList][finished]");
  666. //objSlt.value.tenantNameList = _cloneDeep(temp);
  667. });
  668. };
  669. const fnDetail = () => {
  670. let req = {
  671. seq: useDtStore.boardInfo.seq,
  672. };
  673. useAxios()
  674. .post("/brd/detail", req)
  675. .then((res) => {
  676. const resData = res.data;
  677. form.value.formValue0 = resData.brd_lang;
  678. form.value.formValue2 = resData.show_yn;
  679. form.value.formValue1 = resData.title;
  680. form.value.formValue5 = resData.content.replace(/<\/?div[^>]*>/g, "");
  681. form.value.formValue3 = resData.fix_yn;
  682. form.value.formValue7 = resData.hash_tag;
  683. //console.log(res.data);
  684. uploadFiles.value[0].file_name = resData.file_title;
  685. uploadFiles.value[0].ogn_name = resData.ogn_f_title;
  686. form.value.formValue4 = resData.file_title_pic;
  687. uploadPicFiles.value[0].file_name = resData.file_title_pic;
  688. uploadPicFiles.value[0].ogn_name = resData.ogn_f_title_pic;
  689. imgTemp.value =
  690. apiUrl.value +
  691. "/images/" +
  692. res.data.path.replace(/.*\/files\//, "") +
  693. "/" +
  694. res.data.file_title_pic;
  695. })
  696. .catch((error) => {
  697. //$log.debug("[equipMgmtReg][fnGetTenantList][error]");
  698. //useErrorHandler().fnSetCommErrorHandle(error, fnGetTenantList);
  699. })
  700. .finally(() => {
  701. //$log.debug("[equipMgmtReg][fnGetTenantList][finished]");
  702. //objSlt.value.tenantNameList = _cloneDeep(temp);
  703. });
  704. };
  705. const fnBtnEvt = () => {
  706. if (pageType.value == "I") fnRegEvt();
  707. else fnUpdEvt();
  708. };
  709. /************************************************************************
  710. | 팝업 이벤트버스 정의
  711. ************************************************************************/
  712. $eventBus.off("FN_INSERT");
  713. $eventBus.on("FN_INSERT", () => {
  714. fnInsert();
  715. });
  716. $eventBus.off("FN_UPDATE");
  717. $eventBus.on("FN_UPDATE", () => {
  718. fnUpdate();
  719. });
  720. $eventBus.off("FN_DELETE");
  721. $eventBus.on("FN_DELETE", () => {
  722. fnDelete();
  723. });
  724. /************************************************************************
  725. | 라이프사이클
  726. ************************************************************************/
  727. onMounted(() => {
  728. pageType.value = useDtStore.boardInfo.pageType;
  729. //상세 등록 아니 리스트 클릭시 상세 정보로 접근
  730. if (pageType.value == "U") {
  731. fnDetail();
  732. }
  733. });
  734. /************************************************************************
  735. | WATCH
  736. ************************************************************************/
  737. const observer = new MutationObserver((mutations) => {
  738. mutations.forEach((mutation) => {
  739. if (mutation.type === "childList") {
  740. if (quillEditor.value) {
  741. const quill = quillEditor.value.quill;
  742. if (quill) {
  743. quill
  744. .getModule("toolbar")
  745. .addHandler("image", editorOptions.value.modules.toolbar.handlers.image);
  746. }
  747. }
  748. }
  749. });
  750. });
  751. observer.observe(document.body, { childList: true, subtree: true });
  752. </script>