import { vars } from './variable.js'; import { throttle, checkProjectInactive } from '../main.js'; import { formatBytes, addCommasToNumber, splitBaseAndExt, splitTopPathAndTargetName, extractPathByLength, getDataFromTreeObject, getCurrentTreeObject, targetFocus, pxToRem, headerBtnForceClick, treeBtnForceClick, closeInitProgress, openNewWindowViewer, initFileAreaUI, syncGroupStyle } from './common.js' import { toggleContextFocusBox, toggleContextmenu, toggleControlBox, toggleArchiveMainRight, showNotification, } from './eventManager.js' import { openCreateFolderModal, uploadData, openRenameModal, openEditAuthorModal, openDownloadModal, toggleRelocateCover, openRemoveModal, removeTarget, openDeleteModal, setDataPermission, convertPdf, updateAiButtonState, } from './dataManager.js'; import { mgmtFunc_addClickLog, mgmtFunc_resetConvert } from './managementFunctions.js'; import { toggleModal } from './modalManager.js'; import { OLMultiLayerManager } from './olPmtiles.js'; let mainNotice = document.querySelector('.main-notice'); let treeNotice = document.querySelector('.archive-main .archive-main-left .tree-container .tree-notice'); let treeWrap = document.querySelector('.archive-main .archive-main-left .tree-container .tree-wrap'); let listContainer = document.querySelector('.archive-main .archive-main-center .list-container'); let listNotice = document.querySelector('.archive-main .archive-main-center .list-notice'); let viewerContainer = document.querySelector('.archive-main .archive-main-right .viewer-container'); let viewerNotice = document.querySelector('.archive-main .archive-main-right .viewer-notice'); let viewerWrap = document.querySelector('.viewer-wrap'); let viewerToolbar = viewerContainer?.querySelector('.toolbar'); let infoWrap = viewerContainer?.querySelector('.info-wrap'); let metadata = infoWrap?.querySelector('.metadata'); let subCategoryList = ['version', 'attachment']; let subCategoryData = { version: { idx: 1, korean: '๋ฒ„์ „' }, attachment: { idx: 2, korean: '์ฒจ๋ถ€' }, }; // ๐Ÿ’ก ๊ธ€๋กœ๋ฒŒ ์ž๋™ ์‚ญ์ œ/๋ณด๊ด€ ์ •์ฑ… ์„ค์ • ๋™์  ๋ณ€์ˆ˜ (๊ธฐ๋ณธ๊ฐ’) let FOLDER_KEEP_FILE_THRESHOLD = 3; let FOLDER_KEEP_DAYS_THRESHOLD = 15; let FOLDER_KEEP_POLICY_ACTIVE = false; let isPolicyLoaded = false; async function loadSystemPolicy() { if (isPolicyLoaded) return; try { const res = await axios.get('/common/system-policy'); if (res.data) { FOLDER_KEEP_POLICY_ACTIVE = res.data.is_active ?? false; // ๊ธ€๋กœ๋ฒŒ ์ •์ฑ…์ด ์ผœ์ ธ ์žˆ์„ ๋•Œ๋งŒ DB ๊ฐ’์„ ์ ์šฉํ•˜๊ณ , ๊บผ์ ธ ์žˆ์œผ๋ฉด ๋ฐฐ์ง€ ๋…ธ์ถœ์„ ์ฐจ๋‹จํ•ฉ๋‹ˆ๋‹ค. if (FOLDER_KEEP_POLICY_ACTIVE) { FOLDER_KEEP_FILE_THRESHOLD = Number(res.data.limit_file_count) || 3; FOLDER_KEEP_DAYS_THRESHOLD = Number(res.data.limit_days) || 15; } } isPolicyLoaded = true; } catch (err) { console.error("Failed to load system policy:", err); isPolicyLoaded = true; } } export function updateSystemPolicyCache(policy) { if (policy) { FOLDER_KEEP_POLICY_ACTIVE = policy.is_active ?? false; if (FOLDER_KEEP_POLICY_ACTIVE) { FOLDER_KEEP_FILE_THRESHOLD = Number(policy.limit_file_count) || 3; FOLDER_KEEP_DAYS_THRESHOLD = Number(policy.limit_days) || 15; } else { FOLDER_KEEP_FILE_THRESHOLD = 3; FOLDER_KEEP_DAYS_THRESHOLD = 15; } } else { isPolicyLoaded = false; } } // ๋ธŒ๋ผ์šฐ์ € ๋’ค๋กœ๊ฐ€๊ธฐ, ์•ž์œผ๋กœ๊ฐ€๊ธฐ ์ด๋ฒคํŠธ window.addEventListener('popstate', async (e)=>{ // console.log(e); if(window.location.search.split('?path=')[1]){ // let resourcePath = atob(decodeURIComponent(window.location.search.split('?path=')[1])); let resourcePath = unicodeAtob(window.location.search.split('?path=')[1]); // console.log(getDataFromTreeObject(resourcePath, 'folder').data); // if (!getDataFromTreeObject(resourcePath, 'folder').data) { // } let resourcePathSplit = resourcePath.split('/'); resourcePathSplit.shift(); let headerBtnPath = `/${resourcePath.split('/')[1]}`; // ํœด์ง€ํ†ต ๋’ค๋กœ๊ฐ€๊ธฐ - ์ž„์‹œ if (resourcePath == '/ํœด์ง€ํ†ต') return; let treeItem; if (resourcePath == '/๊ณผ์—…๊ฐœ์š”' || resourcePath == '/๊ณต๋ฌธ') { document.querySelector('.archive-main').style.display = 'none'; if (resourcePath == '/๊ณผ์—…๊ฐœ์š”') { document.querySelector('.overview-main').style.display = 'flex'; document.querySelector('.official-doc-main').style.display = 'none'; } else { document.querySelector('.overview-main').style.display = 'none'; document.querySelector('.official-doc-main').style.display = 'flex'; } let pageRanderingOption = { scope: 'headerBtn_page', resourcePath: resourcePath, pushState: false, } await preparePageRendering(pageRanderingOption); } else { document.querySelector('.archive-main').style.display = 'flex'; document.querySelector('.overview-main').style.display = 'none'; document.querySelector('.official-doc-main').style.display = 'none'; // ํœด์ง€ํ†ต ๋’ค๋กœ๊ฐ€๊ธฐ - ์ž„์‹œ // if (resourcePathSplit[0] == 'ํœด์ง€ํ†ต') { // document.querySelector('.archive-main-left').style.display = 'none'; // } else { // document.querySelector('.archive-main-left').style.display = 'flex'; // } // console.log(resourcePathSplit); if (resourcePathSplit.length == 1) { listNotice.style.display = 'flex'; listContainer.style.display = 'none'; // viewerNotice.style.display = 'flex'; // viewerContainer.style.display = 'none'; document.querySelector('.archive-main .archive-main-left .tree-title').classList.add('selected'); let pageRanderingOption = { scope: 'tree', resourcePath: resourcePath, pushState: false, } await preparePageRendering(pageRanderingOption); } else { listNotice.style.display = 'none'; listContainer.style.display = 'flex'; // viewerNotice.style.display = 'flex'; // viewerContainer.style.display = 'none'; let pageRanderingOption = { scope: 'tree', resourcePath: headerBtnPath, pushState: false, } await preparePageRendering(pageRanderingOption); pageRanderingOption = { scope: 'list', resourcePath: resourcePath, pushState: false, } await preparePageRendering(pageRanderingOption); treeItem = document.querySelector(`.archive-main .archive-main-left .tree-container .tree-item-wrap[data-resource-path="${resourcePath}"]`); await changeTreeItemStyle(treeItem); if (treeItem) targetFocus(treeItem); } } let headerBtn = document.querySelector(`body > .header .center .left.wrap .menu-tab .btn[data-resource-path="${headerBtnPath}"]`); if (!headerBtn) headerBtn = document.querySelector('.official-doc-btn'); await changeHeaderBtnStyle(headerBtn); if (headerBtn) targetFocus(headerBtn); }else{ window.history.back(); } }) // base64 ์ธ์ฝ”๋”ฉ๋œ ๋ฌธ์ž์—ด์„ ํ•œ๊ธ€๋กœ ๋””์ฝ”๋”ฉํ•˜๋Š” ํ•จ์ˆ˜ function unicodeAtob(str) { // base64 ๋””์ฝ”๋”ฉ ํ›„ UTF-8๋กœ ๋””์ฝ”๋”ฉ return decodeURIComponent( Array.prototype.map.call( atob(str), function(c) { return '%' + ('00' + c.charCodeAt(0).toString(16)).slice(-2); } ).join('') ); } // ํ•œ๊ธ€์„ btoa๋กœ ์ธ์ฝ”๋”ฉํ•˜๋Š” ํ•จ์ˆ˜ function unicodeBtoa(str) { // ๋ฌธ์ž์—ด์„ UTF-8 ์ธ์ฝ”๋”ฉ๋œ ๋ฐ”์ด๋„ˆ๋ฆฌ๋กœ ๋ณ€ํ™˜ ํ›„ base64 ์ธ์ฝ”๋”ฉ return btoa( encodeURIComponent(str).replace( /%([0-9A-F]{2})/g, function(match, p1) { return String.fromCharCode('0x' + p1); } ) ); } // ํ™•์žฅ์ž๊ฐ€ ์ •์ƒ์ธ์ง€ ์ฒดํฌํ•˜๋Š” ํ•จ์ˆ˜ function isValidExt(ext) { let result = false; if (!/\s/.test(ext) || /^[A-Za-z0-9]+$/.test(ext)) result = true; return result; } // ์›”, ์ผ ํ•œ ์ž๋ฆฌ์ˆ˜ ์ผ ๋•Œ ์•ž์— 0 ์ถ”๊ฐ€ function changeDateFormat(date) { let dataSplit = date.split('.'); dataSplit.pop(); let [year, month, day] = dataSplit; year = year.substr(2, 4); month = month.replace(' ', ''); day = day.replace(' ', ''); if (month.length == 1) month = '0' + month; if (day.length == 1) day = '0' + day; return [year, month, day].join('-'); } // ์‹œ๊ฐ„ ํ˜•์‹ ๋ณ€ํ™˜ (์‹œ:๋ถ„:์ดˆ -> ์‹œ:๋ถ„) function changeTimeFormat(time) { let [hours, minutes, seconds] = time.split(':'); return `${hours}:${minutes}`; } function getExpiryDate(lastFolderActDate) { let result = {}; // ๋งˆ์ง€๋ง‰์œผ๋กœ ํด๋”์— ์ €์žฅ๋œ ์‹œ๊ฐ„ lastFolderActDate = new Date(lastFolderActDate); // lastFolderActDate๋กœ๋ถ€ํ„ฐ FOLDER_KEEP_DAYS_THRESHOLD์ผ ๋’ค์˜ ์‹œ๊ฐ„ let expiryDate = new Date(lastFolderActDate.getTime() + FOLDER_KEEP_DAYS_THRESHOLD * 24 * 60 * 60 * 1000); // ํ˜„์žฌ ์‹œ๊ฐ„ let nowDate = new Date(); // expiryDate์™€ nowDate์˜ ์ฐจ์ด (๋ฐ€๋ฆฌ์„ธ์ปจ๋“œ) let diffMs = expiryDate - nowDate; if (diffMs <= 0) { } else { let diffSec = Math.floor(diffMs / 1000); let days = Math.floor(diffSec / (24 * 60 * 60)); let hours = Math.floor((diffSec % (24 * 60 * 60)) / 3600); let minutes = Math.floor((diffSec % 3600) / 60); let seconds = diffSec % 60; // ๋‘ ์ž๋ฆฌ ํฌ๋งท let pad = n => String(n).padStart(2, '0'); let formatted = `${pad(days)}์ผ ${pad(hours)}์‹œ๊ฐ„ ${pad(minutes)}๋ถ„ ${pad(seconds)}์ดˆ`; result.days = days; result.formatted = formatted; } return result; } // ๋งŒ๋ฃŒ ํด๋” ์‚ญ์ œ ํ•จ์ˆ˜ function removeExpiredFolder(value) { // useSocket true false ? let params ={ resourcePathArr: [value.resourcePath], dataIdArr: [value.dataId], dataType: 'folder', isExpiredFolder: true } removeTarget(params); } // ๋งŒ๋ฃŒ ๊ธฐ๊ฐ„ ํˆดํŒ ๋ฐ ํƒ€์ด๋จธ ์‚ญ์ œ ํ•จ์ˆ˜ export function removeCountdownTooltip() { let countdownTooltip = document.querySelector('.countdown-tooltip'); if (!countdownTooltip) return; if (vars.countdownTimer) { clearInterval(vars.countdownTimer); vars.countdownTimer = null; } countdownTooltip.remove(); } function sortData(data) { let isRecycleBinModal = document.querySelector('.recycle-bin-modal').style.display == 'flex'; let curSortCol = (isRecycleBinModal) ? vars.curSortCol_bin : vars.curSortCol; let curSortOrder = (isRecycleBinModal) ? vars.curSortOrder_bin : vars.curSortOrder; let entries = Object.entries(data).sort((a, b) => { const fileA = a[0]; const fileB = b[0]; let col = curSortCol; let order = (curSortOrder == 'desc')?-1:1; if (a[1].type == 'folder') { col = 'folder'; order = 1; } const parse = (filename, info) => { const match = filename.match(/^(.+?)(?:_(\d{4}-\d{2}-\d{2} \d{2}-\d{2}-\d{2}-\d{3}))?\.([^.]+)$/); // depth4 ํŒŒ์ผ์—๋Š” ๋ฉ”๋ชจ๊ฐ€ ์—†์ง€๋งŒ ์ด ํŒŒ์ผ์˜ ์ถ”๊ฐ€ํŒŒ์ผ์—๋Š” ๋ฉ”๋ชจ๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ, // depth4 ํŒŒ์ผ์—๋„ ๋ฉ”๋ชจ๊ฐ€ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•œ ํ›„ ๋ฉ”๋ชจ ์ •๋ ฌ์— ํฌํ•จ // ๋ฉ”๋ชจ data : ์›๋ž˜ => String, ๋ฉ”๋ชจ๊ฐ€ ์žˆ๋‹ค๊ณ  ๊ฐ€์ • => boolean(true) const result = getFilenameWithMemoInDepth5ByDepth4Path(info.resourcePath); if (info.depth == 4 && info.memo == '') { if (filename === result.memoFilename) info.memo = true; } return { base: match?.[1] || filename, timestamp: match?.[2] || null, ext: match?.[3] || '', originalLocation: splitTopPathAndTargetName(info.resourcePath).topPath, removeUser: info.modUserNm, removeDate: info.modDate, memo: info.memo, author: info.authorNm, uploader: info.userNm, createDate: info.createDate, size: info.size, state: (info.needConvert)?`${info.isConverted}` : `${info.isSupported}`, depth: info.depth, isSub: result.isSub, }; }; const A = parse(fileA, a[1]); const B = parse(fileB, b[1]); switch(col){ case 'original-location': if (isRecycleBinModal) { const originalLocationCmp = A.originalLocation.localeCompare(B.originalLocation, undefined, { numeric: true, sensitivity: 'base' }); if(originalLocationCmp !==0) return originalLocationCmp * order; } break; case 'remove-user': if (isRecycleBinModal) { const removeUserCmp = A.removeUser.localeCompare(B.removeUser, undefined, { numeric: true, sensitivity: 'base' }); if(removeUserCmp !==0) return removeUserCmp * order; } break; case 'remove-date': if (isRecycleBinModal) { const removeDateCmp = A.removeDate.localeCompare(B.removeDate, undefined, { numeric: true, sensitivity: 'base' }); if(removeDateCmp !==0) return removeDateCmp * order; } break; case 'memo': const getMemoPriority = (item) => { // ์ •๋ ฌ ์šฐ์„ ์ˆœ์œ„ if (item.depth == 4 && item.isSub == false && item.memo != '') return 0; if (item.depth == 4 && item.isSub == true && item.memo != '' && item.memo != true) return 1; if (item.depth == 4 && item.isSub == true && item.memo == true) return 2; if (item.depth == 5 && item.memo != '') return 3; return 99; }; const memoA = getMemoPriority(A); const memoB = getMemoPriority(B); if (memoA !== memoB) return (memoA - memoB) * order; case 'author': if (A.author == '' || A.author == undefined || A.author == null) A.author = A.uploader; if (B.author == '' || B.author == undefined || B.author == null) B.author = B.uploader; const authorCmp = A.author.localeCompare(B.author, undefined, { numeric: true, sensitivity: 'base' }); if(authorCmp !==0) return authorCmp * order; break; case 'uploader': const uploaderCmp = A.uploader.localeCompare(B.uploader, undefined, { numeric: true, sensitivity: 'base' }); if(uploaderCmp !==0) return uploaderCmp * order; break; case 'create-date': const dateCmp = A.createDate.localeCompare(B.createDate, undefined, { numeric: true, sensitivity: 'base' }); if(dateCmp !==0) return dateCmp * order; break; case 'size': const sizeCmp = A.size.localeCompare(B.size, undefined, { numeric: true, sensitivity: 'base' }); if(sizeCmp !==0) return sizeCmp * order; break; case 'state': const stateCmp = A.state.localeCompare(B.state, undefined, { numeric: true, sensitivity: 'base' }); if(stateCmp !==0) return stateCmp * order; break; default : // 1. base name ์ •๋ ฌ const baseCmp = A.base.localeCompare(B.base, undefined, { numeric: true, sensitivity: 'base' }); if (baseCmp !== 0) return baseCmp * order; // 2. ํ™•์žฅ์ž ์ •๋ ฌ const extCmp = A.ext.localeCompare(B.ext, undefined, { numeric: true, sensitivity: 'base' }); if (extCmp !== 0) return extCmp * order; // 3. timestamp ์—†๋Š” ํŒŒ์ผ ๋จผ์ € if (A.timestamp && B.timestamp) { return A.timestamp.localeCompare(B.timestamp) * order; } else if (A.timestamp) { return 1 * order; // A๋Š” ์žˆ์Œ โ†’ B๊ฐ€ ๋จผ์ € } else if (B.timestamp) { return -1 * order; // B๋Š” ์žˆ์Œ โ†’ A๊ฐ€ ๋จผ์ € } break; } return 0; }); return entries; } // depth4 ๊ฒฝ๋กœ๋ฅผ ๊ธฐ์ค€์œผ๋กœ, 1. depth4 ํŒŒ์ผ์ด ์ถ”๊ฐ€ํŒŒ์ผ(depth5)์„ ๊ฐ€์ง€๊ณ  ์žˆ๋Š”์ง€ ํŒ๋‹จ ํ›„ ๋ฐ˜ํ™˜ // 2. depth4 ์ž์ฒด์—๋Š” ๋ฉ”๋ชจ๊ฐ€ ์—†๊ณ  ํ•˜์œ„ depth5 ํŒŒ์ผ ์ค‘ ๋ฉ”๋ชจ๊ฐ€ ํ•˜๋‚˜๋ผ๋„ ์กด์žฌํ•˜๋ฉด ๊ทธ depth4 ํŒŒ์ผ์˜ ์ด๋ฆ„์„ ๋ฐ˜ํ™˜ function getFilenameWithMemoInDepth5ByDepth4Path(depth4Path) { let isSub = false; let memoFilename = null; for (const ele of subCategoryList) { let sub = getDataFromTreeObject(`${depth4Path}_${ele}`, 'folder', vars.allTreeObject).data; const subFiles = sub?.child?.file; if (subFiles) { isSub = true; for (const key of Object.keys(subFiles)) { if (subFiles[key]?.memo) { memoFilename = subFiles[key].mainFileName; break; } } } if (memoFilename) break; } return { isSub: isSub, memoFilename }; } export function resetSort() { let isRecycleBinModal = document.querySelector('.recycle-bin-modal').style.display == 'flex'; let listContainer, curSortCol, curSortOrder; if (isRecycleBinModal) { listContainer = document.querySelector('.recycle-bin-modal .list-container'); curSortCol = 'remove-date'; vars.curSortCol_bin = curSortCol; vars.curSortOrder_bin = 'desc' } else { listContainer = document.querySelector('.archive-main-center .list-container'); curSortCol = 'name'; vars.curSortCol = curSortCol; vars.curSortOrder = 'asc' } let headers = listContainer.querySelector('.list-header-area').querySelectorAll('div'); headers.forEach(h=>{ h.classList.remove('sort-asc', 'sort-desc'); if (h.classList.contains(curSortCol)) h.classList.add('sort-asc'); }) } function translateActivity(activity) { let result; /* < _ ๋ถ„๋ฆฌ O > uploadData_file renameTarget_file renameTarget_folder downloadTarget_file removeTarget_file removeTarget_folder setDataPermission_folder addOn_version addOn_attachment < _ ๋ถ„๋ฆฌ X > createFolder convertPdf */ let activitySplit = activity.split('_'); if (activitySplit[1]) { let prefix, suffix; if (activitySplit[1] == 'file') prefix = 'ํŒŒ์ผ'; if (activitySplit[1] == 'folder') prefix = 'ํด๋”'; if (activitySplit[1] == 'version') prefix = '๋ฒ„์ „ํŒŒ์ผ'; if (activitySplit[1] == 'attachment') prefix = '์ฒจ๋ถ€ํŒŒ์ผ'; if (activitySplit[1] == 'subMaster') prefix = '๋ถ€๊ด€๋ฆฌ์ž'; if (activitySplit[1] == 'securityWorker') prefix = '๋ณด์•ˆ์ฐธ์—ฌ์ž'; if (activitySplit[1] == 'worker') prefix = '์ผ๋ฐ˜์ฐธ์—ฌ์ž'; if (activitySplit[1] == 'viewer') prefix = '์ฐธ๊ด€์ž'; if (activitySplit[0] == 'uploadData') suffix = '์—…๋กœ๋“œ'; if (activitySplit[0] == 'renameTarget') suffix = '์ด๋ฆ„ ๋ณ€๊ฒฝ'; if (activitySplit[0] == 'relocateTarget') suffix = '์ด๋™'; if (activitySplit[0] == 'downloadTarget') suffix = '๋‹ค์šด๋กœ๋“œ'; if (activitySplit[0] == 'removeTarget') { suffix = (activitySplit[1] == 'file') ? 'ํœด์ง€ํ†ต์œผ๋กœ ์ด๋™' : 'ํด๋” ์‚ญ์ œ'; if (activitySplit[2] && activitySplit[2] == 'expired') suffix = 'ํด๋” ์ž๋™ ์‚ญ์ œ (ํŒŒ์ผ ๊ฐœ์ˆ˜ ๋ฏธ๋‹ฌ)'; prefix = ''; } if (activitySplit[0] == 'deleteTarget') suffix = 'ํŒŒ์ผ ์‚ญ์ œ'; if (activitySplit[0] == 'setDataPermission') suffix = '๊ถŒํ•œ ์„ค์ •'; if (activitySplit[0] == 'addOn') suffix = '์ถ”๊ฐ€'; if (activitySplit[0] == 'addPermission') suffix = '๊ถŒํ•œ ์ถ”๊ฐ€'; if (activitySplit[0] == 'deletePermission') suffix = '๊ถŒํ•œ ์‚ญ์ œ'; result = `${prefix} ${suffix}`; } else { if (activitySplit[0] == 'createFolder') result = '์ƒˆ ํด๋” ์ƒ์„ฑ'; if (activitySplit[0] == 'convertPdf') result = 'PDF ๋ณ€ํ™˜'; if (activitySplit[0] == 'saveMemo') result = '๋ฉ”๋ชจ ๋ฐ์ดํ„ฐ ์ €์žฅ'; if (activitySplit[0] == 'editAuthor') result = '์ž‘์„ฑ์ž ๋ณ€๊ฒฝ'; if (activitySplit[0] == 'summarizeAI') result = 'AI์š”์•ฝ'; } if (result) result = result.trim(); return result; } export async function preparePageRendering(pageRanderingOption) { if (checkProjectInactive()) return; // scope: headerBtn, tree(depth2, depth3), list let headerBtn = false, tree = false, list = false; let scope = pageRanderingOption.scope; let resourcePath = pageRanderingOption.resourcePath; let userCurPath = (pageRanderingOption.userCurPath) ? pageRanderingOption.userCurPath : resourcePath; if (scope == 'headerBtn') headerBtn = true, resourcePath = '/'; if (scope == 'tree') tree = true; if (scope == 'list') list = true; if (scope == 'recycle_bin') list = true; let isInit = (pageRanderingOption) ? pageRanderingOption.isInit : undefined; if (isInit != true) isInit = false; let getTreeObject = (pageRanderingOption) ? pageRanderingOption.getTreeObject : undefined; if (getTreeObject != false) getTreeObject = true; let pushState = (pageRanderingOption) ? pageRanderingOption.pushState : undefined; if (pushState != false) pushState = true; // ์ดˆ๊ธฐ ์‹คํ–‰ ์‹œ if (isInit) { // // ๋ฐ์ดํ„ฐ ๋กœ๋”ฉ ํ”„๋กœ๊ทธ๋ ˆ์Šค ์‹œ์ž‘ document.querySelector('.init-progress').style.display = 'flex'; // // ๋งˆ์ง€๋ง‰ ํžˆ์Šคํ† ๋ฆฌ๋ฅผ ํ˜„์žฌ ๊ฒฝ๋กœ๋กœ ๋Œ€์ฒด window.history.replaceState(window.history.length+1,'',window.location.pathname); } // 251114 ๊น€์•„๋ฆ„ // if (pushState && resourcePath != '/') window.history.pushState(window.history.length+1,'',window.location.pathname + '?path='+unicodeBtoa(resourcePath)); if (pushState) { const isValidPath = resourcePath && resourcePath !== '/'; if (isValidPath) { window.history.pushState(window.history.length+1,'',window.location.pathname + '?path='+unicodeBtoa(resourcePath)); } else { window.history.pushState(window.history.length+1,'',window.location.pathname); } } // ํœด์ง€ํ†ต ๋ฆฌ์ŠคํŠธ๋ฅผ ๋ณด๊ณ  ์žˆ์ง€ ์•Š๋Š” ๊ฒฝ์šฐ์—๋งŒ ํŒŒ์ผ ๋ฆฌ์ŠคํŠธ ํ™”๋ฉด์œผ๋กœ ๋ณ€๊ฒฝ if (vars.lastHeaderBtn && vars.lastHeaderBtn.dataset.resourcePath != '/ํœด์ง€ํ†ต') { if (document.querySelector('.archive-main-left').style.display == 'none') { // ์ขŒ์ธกํŠธ๋ฆฌ์˜์—ญ ํ‘œ์‹œ document.querySelector('.archive-main-left').style.display = 'flex'; // list-item-wrap์— ์ถ”๊ฐ€ํ–ˆ๋˜ recycle-binํด๋ž˜์Šค ์‚ญ์ œ vars.listItemWrap.classList.remove('recycle-bin'); } } if (!scope) return; if (scope == 'updateTreeObject') { // TreeObject๋งŒ ๊ฐฑ์‹ ํ•˜๊ณ  ๋ Œ๋”๋ง์€ ํ•˜์ง€ ์•Š์Œ let userString = vars.userInfoString; let user = JSON.parse(userString); user.project_id = vars.project_id; user.curPath = resourcePath; if (userCurPath) user.curPath = userCurPath; let getTreeObjectParams = { userInfoString: JSON.stringify(user), storageType: vars.storageType, resourcePath: resourcePath }; let getTreeObjectRes = await axios.get(`${vars.path_name}/getTreeObject`, {params: {params: getTreeObjectParams}}); if (getTreeObjectRes.data.message == 'getTreeObject_success') { vars.currentTreeObject = getTreeObjectRes.data.currentTreeObject; // allTreeObject ๊ฐฑ์‹  if (resourcePath != '/') { let parentData = getDataFromTreeObject(resourcePath, 'folder', vars.allTreeObject).parentData; let data = getDataFromTreeObject(resourcePath, 'folder', vars.allTreeObject).data; if (data) { data.child = vars.currentTreeObject; let targetName = splitTopPathAndTargetName(resourcePath).targetName; parentData.folder[targetName] = data; } } } return; } if (getTreeObject) { let meString = vars.userInfoString; let me = JSON.parse(meString); me.project_id = vars.project_id; me.curPath = resourcePath; if (userCurPath) me.curPath = userCurPath; vars.socket.emit('setUser',{me:me, stat:'no'}); vars.socket.emit('getMe'); if(me.bookmark && me.bookmark != '' && me.bookmark != 'null') me.bookmark = ''; let getTreeObjectParams = { userInfoString: JSON.stringify(me), storageType: vars.storageType, resourcePath: resourcePath }; try { let getTreeObjectRes = await axios.get(`${vars.path_name}/getTreeObject`, { params: { params: getTreeObjectParams } }); if (getTreeObjectRes.data.message == 'getTreeObject_success') { vars.convertingDataArr = getTreeObjectRes.data.convertingDataArr; vars.currentTreeObject = getTreeObjectRes.data.currentTreeObject; if (!vars.allTreeObject || resourcePath == '/') { vars.allTreeObject = vars.currentTreeObject; } else { if (scope != 'recycle_bin') { let parentData = getDataFromTreeObject(resourcePath, 'folder', vars.allTreeObject).parentData; let data = getDataFromTreeObject(resourcePath, 'folder', vars.allTreeObject).data; if (data) { data.child = vars.currentTreeObject; let targetName = splitTopPathAndTargetName(resourcePath).targetName; parentData.folder[targetName] = data; } } else { console.log(1234567890); } } } else if (getTreeObjectRes.data.message == 'getTreeObject_failed') { console.log('---------------- getTreeObject ์‹คํŒจ'); closeInitProgress(); } } catch (err) { console.error('---------------- getTreeObject ์—๋Ÿฌ ๋ฐœ์ƒ:', err); closeInitProgress(); } } else { vars.allTreeObject = vars.allTreeObject; vars.currentTreeObject = getCurrentTreeObject(resourcePath); } // if (!scope) return; if (scope == 'headerBtn_page' || scope == 'updateTreeObject') return; await (async function () { // ๊ณผ์—…๊ฐœ์š” ๋น„ํ™œ์„ฑํ™” ๋œ ๊ฒฝ์šฐ ํŠธ๋ฆฌ ์˜ค๋ธŒ์ ํŠธ ์ƒ์„ฑ ํ›„์— ์‹œ์ž‘๊ฒฝ๋กœ๊ฐ€ ์—†์œผ๋ฉด ์ดˆ๊ธฐ ํ”„๋กœ๊ทธ๋ ˆ์Šค ์ข…๋ฃŒ // if (isInit && !vars.project.overview) { // if (!vars.startPathDepth1 && !vars.startPathDepth2 && !vars.startPathDepth3) document.querySelector('.init-progress').style.display = 'none'; // } let userInfo = JSON.parse(vars.userInfoString); if (userInfo.permission != null && typeof userInfo.permission == 'number') { if (headerBtn) { //// header folder let headerBtnParent = document.querySelector('body > .header .center .left.wrap .menu-tab'); await renderHeaderBtn(headerBtnParent, vars.currentTreeObject.folder, isInit); // ํ—ค๋” ๋ฒ„ํŠผ์ด ์—†์œผ๋ฉด ์ดˆ๊ธฐ ํ”„๋กœ๊ทธ๋ ˆ์Šค ์ข…๋ฃŒ ํ›„ mainNotice ํ‘œ์‹œ if (document.querySelector('body > .header .center .left.wrap .menu-tab').children.length == 0) { console.log('******** ํ—ค๋”๋ฒ„ํŠผ ์˜์—ญ ๋ Œ๋”๋ง ํ›„ ์ดˆ๊ธฐ ํ”„๋กœ๊ทธ๋ ˆ์Šค ์ข…๋ฃŒ (๊ณผ์—…๊ฐœ์š”๋ฒ„ํŠผ ์—†์Œ, ํ—ค๋”ํด๋”๋ฒ„ํŠผ ์—†์Œ)'); await closeInitProgress(); mainNotice.style.display = 'flex'; } } if (tree) { let treeTitle = document.querySelector('.archive-main-left .tree-title'); let treeContainer = document.querySelector('.archive-main-left .tree-container'); let treeWrap = treeContainer.querySelector('.tree-wrap'); treeTitle.querySelector('.wrap .text').textContent = vars.lastHeaderBtn.querySelector('.name-text').textContent; treeTitle.dataset.resourcePath = vars.lastHeaderBtn.dataset.resourcePath; treeContainer.dataset.resourcePath = vars.lastHeaderBtn.dataset.resourcePath; treeWrap.dataset.resourcePath = vars.lastHeaderBtn.dataset.resourcePath; await renderTree(treeWrap, vars.currentTreeObject.folder); //////// pm-bcmf ์—ฐ๊ฒฐ์šฉ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ - ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ์ „๋‹ฌ๋ฐ›์€ ์‹œ์ž‘๊ฒฝ๋กœ๋กœ ํ™”๋ฉด ์ „ํ™˜ (depth3) if (vars.startPathDepth3) { let path = `/${vars.startPathDepth1}/${vars.startPathDepth2}/${vars.startPathDepth3}`; let treeBtn = document.querySelector(`.tree-container .tree-wrap .tree-item-wrap[data-resource-path="${path}"] .tree-item`); if (treeBtn) await treeBtnForceClick(treeBtn); } if (document.querySelector('.init-progress').style.display != 'none') { console.log('******** ํŠธ๋ฆฌ ์˜์—ญ ๋ Œ๋”๋ง ํ›„ ์ดˆ๊ธฐ ํ”„๋กœ๊ทธ๋ ˆ์Šค ์ข…๋ฃŒ'); await closeInitProgress(); } } if (list) { let listParent = document.querySelector('.archive-main-center .list-container .list-wrap.list-body .list-item-wrap'); renderList(listParent, vars.currentTreeObject.file); } } })(); } export async function prepareRecycleBinRendering() { let resourcePath = '/ํœด์ง€ํ†ต'; let getRecycleBinObjectParams = { userInfoString: vars.userInfoString, storageType: vars.storageType, resourcePath: resourcePath }; let getRecycleBinObjectRes = await axios.get(`${vars.path_name}/getRecycleBinObject`, { params: { params: getRecycleBinObjectParams } }); if (getRecycleBinObjectRes.data.message == 'getRecycleBinObject_success') { vars.recycleBinObject = getRecycleBinObjectRes.data.recycleBinObject; let listParent = document.querySelector('.recycle-bin-modal .recycle-bin-wrap .list-container .list-body .list-item-wrap'); listParent.classList.add('recycle-bin'); renderRecycleBin(listParent, vars.recycleBinObject.recycleBin); } } export async function renderHeaderBtn(parent, data, isInit) { let headerCenter = document.querySelector('body > .header .center'); let rightWrap = headerCenter.querySelector('.right.wrap'); let leftWrap = headerCenter.querySelector('.left.wrap'); let menuTab = leftWrap.querySelector('.menu-tab'); leftWrap.style.width = `${headerCenter.offsetWidth - rightWrap.offsetWidth - 16}px`; // body > .header .center -> gap: 16px; // let me = JSON.parse(vars.userInfoString); //// ๊ณผ์—…๊ฐœ์š” ๋ฒ„ํŠผ ์‚ฌ์šฉํ•˜๋Š” ํ”„๋กœ์ ํŠธ์ธ ๊ฒฝ์šฐ ๊ณผ์—…๊ฐœ์š” ๋ฒ„ํŠผ ๋ณต์ œ let overviewBtnClone; if (vars.project.overview && menuTab.querySelector('.overview-btn')) { overviewBtnClone = menuTab.querySelector('.overview-btn').cloneNode(true); //// ๋ณต์ œํ•œ ๊ณผ์—…๊ฐœ์š” ๋ฒ„ํŠผ์— ํด๋ฆญ ์ด๋ฒคํŠธ ์ถ”๊ฐ€ overviewBtnClone.addEventListener('click', async () => { if (document.querySelector('.archive-main')) document.querySelector('.archive-main').style.display = 'none'; if (document.querySelector('.overview-main')) document.querySelector('.overview-main').style.display = 'flex'; if (document.querySelector('.official-doc-main')) document.querySelector('.official-doc-main').style.display = 'none'; if (mainNotice.style.display == 'flex') mainNotice.style.display = 'none'; //// vars์—์„œ ๋งˆ์ง€๋ง‰ ์„ ํƒ ์•„์ดํ…œ์„ ์ €์žฅํ•œ ์†์„ฑ๋“ค ์ดˆ๊ธฐํ™” - ๋ณต์ œํ•œ ๊ณผ์—…๊ฐœ์š” ๋ฒ„ํŠผ์— ํด๋ฆญ ์ด๋ฒคํŠธ ์ถ”๊ฐ€ vars.lastMainTreeItem = undefined; vars.lastListItem = undefined; vars.lastListGroupTarget = undefined; vars.lastContextTarget = undefined; vars.lastSelectTarget = undefined; vars.multiSelectListItemArr = []; let pageRanderingOption = { scope: 'headerBtn_page', resourcePath: '/๊ณผ์—…๊ฐœ์š”' }; await preparePageRendering(pageRanderingOption); changeHeaderBtnStyle(overviewBtnClone); // ์ปจํŠธ๋กค ๋ฐ•์Šค ์ˆจ๊น€ toggleControlBox(false); }) } //// menuTab ์ „์ฒด ์ดˆ๊ธฐํ™” -> menuTab์— ๋ณต์ œํ•œ ๊ณผ์—…๊ฐœ์š” ๋ฒ„ํŠผ ์ถ”๊ฐ€ menuTab.innerHTML = ''; if (overviewBtnClone) menuTab.appendChild(overviewBtnClone); let docFragment = document.createDocumentFragment(); let entries = sortData(data); entries.forEach(entry => { let key = entry[0]; let value = entry[1]; let childState; if (value.filesCount == 0) { childState = 'empty'; } else { childState = 'filled'; } let resourcePath = value.resourcePath; let btn = document.createElement('div'); btn.classList.add('btn'); btn.classList.add('folder-btn'); btn.classList.add(`depth${value.depth}`); btn.classList.add(childState); btn.classList.add('folder'); btn.dataset.resourcePath = resourcePath; btn.dataset.id = value.dataId; btn.dataset.size = value.size; let wrap = document.createElement('div'); wrap.classList.add('wrap'); let image = document.createElement('div'); image.classList.add('image'); let nameText = document.createElement('div'); nameText.classList.add('name-text'); nameText.innerHTML = key; wrap.appendChild(image); wrap.appendChild(nameText); let addPermissionBadge = false, permissionEng = '', permissionKor = ''; if (value.permission == 0) { addPermissionBadge = true; permissionEng = 'sub-master'; permissionKor = '๊ด€๋ฆฌ'; } if (value.permission == 8) { addPermissionBadge = true; permissionEng = 'security-worker'; permissionKor = '๋ณด์•ˆ'; } if (value.permission == 4) { addPermissionBadge = true; permissionEng = 'worker'; permissionKor = '์ผ๋ฐ˜'; } // if (value.permission == 2) { // addPermissionBadge = true; // permissionEng = 'uploader'; // permissionKor = '์—…๋กœ๋”'; // } if (addPermissionBadge) { let permissionBadge = document.createElement('div'); permissionBadge.classList.add(`user-permission-${permissionEng}`); // permissionBadge.style.marginLeft = '8px'; let h6 = document.createElement('h6'); h6.innerText = permissionKor; permissionBadge.appendChild(h6); wrap.appendChild(permissionBadge); } btn.appendChild(wrap); docFragment.appendChild(btn); btn.addEventListener('click', async (e) => { headerBtnClickFunc(btn); }); // depth1 ํด๋” ์šฐํด๋ฆญ ์‹œ ๊ฐ•์กฐ ๋ฐ ์ปจํ…์ŠคํŠธ ๋ฉ”๋‰ด ์—ด๊ธฐ btn.addEventListener('contextmenu', async (e) => { headerBtnContextmenuFunc(e); }); }); parent.appendChild(docFragment); processHeaderBtnOverflow(); if (isInit) { // ํ—ค๋” ๋ฒ„ํŠผ ์ตœ์ดˆ ๋ Œ๋”๋ง ์‹œ let headerBtn; // ์‹œ์ž‘๊ฒฝ๋กœ๊ฐ€ ์žˆ๊ณ  ๊ณผ์—…๊ฐœ์š”๋ฅผ ์‚ฌ์šฉ ์•ˆํ•˜๋Š” ํ”„๋กœ์ ํŠธ์ธ ๊ฒฝ์šฐ ์‹œ์ž‘๊ฒฝ๋กœ๋กœ ํ™”๋ฉด ์ „ํ™˜ if (vars.startPathDepth1 && !vars.project.overview) { //////// pm-bcmf ์—ฐ๊ฒฐ์šฉ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ - ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ์ „๋‹ฌ๋ฐ›์€ ์‹œ์ž‘๊ฒฝ๋กœ๋กœ ํ™”๋ฉด ์ „ํ™˜ (depth1) headerBtn = document.querySelector(`body > .header .center .left.wrap .menu-tab .btn[data-resource-path="/${vars.startPathDepth1}"]`); } else { // ์‹œ์ž‘๊ฒฝ๋กœ ์—†๋Š” ๊ฒฝ์šฐ ์ฒซ ๋ฒˆ์งธ ํ—ค๋”๋ฒ„ํŠผ์œผ๋กœ ํ™”๋ฉด ์ „ํ™˜ headerBtn = document.querySelectorAll('body > .header .center .left.wrap .menu-tab .btn')[0]; } if (headerBtn) await headerBtnForceClick(headerBtn); } else { if (!vars.lastHeaderBtn) return; let headerBtnPath = vars.lastHeaderBtn.dataset.resourcePath; let headerBtn = document.querySelector(`body > .header .center .left.wrap .menu-tab .btn[data-resource-path="${headerBtnPath}"]`); if (headerBtn == null || headerBtn == undefined || !headerBtn) vars.lastHeaderBtn = undefined; if (headerBtn) await changeHeaderBtnStyle(headerBtn); } } async function headerBtnClickFunc(btn) { vars.lastSelectTarget = btn; if (btn) targetFocus(btn); if (document.querySelector('.archive-main')) document.querySelector('.archive-main').style.display = 'flex'; if (document.querySelector('.overview-main')) document.querySelector('.overview-main').style.display = 'none'; if (document.querySelector('.official-doc-main')) document.querySelector('.official-doc-main').style.display = 'none'; if (mainNotice.style.display == 'flex') mainNotice.style.display = 'none'; listContainer.style.display = 'none'; listNotice.style.display = 'flex'; resetViewer(); changeHeaderBtnStyle(btn); let resourcePath = btn.dataset.resourcePath; document.querySelector('.archive-main-left .tree-title').dataset.resourcePath = resourcePath; document.querySelector('.archive-main-left .tree-container').dataset.resourcePath = resourcePath; let pageRanderingOption = { scope: 'tree', resourcePath: resourcePath } await preparePageRendering(pageRanderingOption); document.querySelector('.archive-main-left .tree-title').classList.add('selected'); // ํŒŒ์ผ ์ด๋™ ๋ชจ๋“œ(listViewerCover display flex)์ผ ๋•Œ ํ—ค๋” ๋ฒ„ํŠผ ํด๋ฆญํ•˜๋ฉด ์„ ํƒ ํด๋” ๊ฒฝ๋กœ ์ดˆ๊ธฐํ™” let listViewerCover = document.querySelector('.list-viewer-cover'); if (listViewerCover.style.display == 'flex') { listViewerCover.querySelector('.new-path .value').innerText = '-'; } else { //// vars์—์„œ ๋งˆ์ง€๋ง‰ ์„ ํƒ ์•„์ดํ…œ์„ ์ €์žฅํ•œ ์†์„ฑ๋“ค ์ดˆ๊ธฐํ™” - renderTree // ํŒŒ์ผ ์ด๋™ ๋ชจ๋“œ์—์„œ ์ดˆ๊ธฐํ™”ํ•˜๋ฉด ์ด๋™ ์ „, ํ›„ ๊ฒฝ๋กœ๋ฅผ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์—†์–ด์„œ ํŒŒ์ผ ์ด๋™ ๋ชจ๋“œ ์•„๋‹ ๋•Œ์—๋งŒ ์ดˆ๊ธฐํ™” vars.lastMainTreeItem = undefined; vars.lastListItem = undefined; vars.lastListGroupTarget = undefined; vars.lastContextTarget = undefined; vars.multiSelectListItemArr = []; } //// ๋ฆฌ์ŠคํŠธ ์˜์—ญ ๊ฐ€์ด๋“œ ํ™”๋ฉด ํ‘œ์‹œ const viewer = document.querySelector('.list-notice-viewer'); viewer.dataset.resourcePath = resourcePath; let param = { resourcePath }; let res = await axios.get(`${vars.path_name}/isMainTitleImage`, {params: param}); if(res.data.result || !res.data.result == undefined) { let mainTitleImg = res.data.result.path2; if(mainTitleImg.includes('MAIN_TITLE_IMAGE___')) { let generateImageUrlParams = { resourcePath: `${vars.lastHeaderBtn.dataset.resourcePath}` }; let imgUrlRes = await axios.get(`${vars.path_name}/generateImageUrl`, { params: generateImageUrlParams }); let imageUrl = imgUrlRes.data.result.url; document.querySelector('.list-notice-viewer').src = imageUrl; document.querySelector('.list-notice-viewer').style.display = 'flex'; document.querySelector('.list-notice-top').style.display = 'none'; document.querySelector('.list-notice-bottom').style.display = 'none'; } else { document.querySelector('.list-notice-viewer').style.display = 'none'; document.querySelector('.list-notice-top').style.display = 'flex'; document.querySelector('.list-notice-bottom').style.display = 'flex'; } }else { document.querySelector('.list-notice-viewer').style.display = 'none'; document.querySelector('.list-notice-top').style.display = 'flex'; document.querySelector('.list-notice-bottom').style.display = 'flex'; } // ์ปจํŠธ๋กค ๋ฐ•์Šค ์ˆจ๊น€ toggleControlBox(false); // // ์•„์นด์ด๋ธŒ ์šฐ์ธก ์˜์—ญ ํ‘œ์‹œ // let option = { // from: 'ํ—ค๋” ๋ฒ„ํŠผ ํด๋ฆญ' // } // toggleArchiveMainRight(true, option); toggleArchiveMainRight(false); } function headerBtnContextmenuFunc(event) { let scope = 'headerBtn'; toggleContextFocusBox(true, event.target, scope); toggleContextmenu(true, event, scope); } export function processHeaderBtnOverflow() { if (checkProjectInactive()) return; let headerCenter = document.querySelector('body > .header .center'); let leftWrap = headerCenter.querySelector('.left.wrap'); let leftWrapWidth = leftWrap.offsetWidth; let menuTab = leftWrap.querySelector('.menu-tab'); let menuAdd = leftWrap.querySelector('.menu-add'); let menuAddWidth = 0; if (menuAdd) menuAddWidth = menuAdd.offsetWidth; let menuTabMaxWidth = leftWrapWidth - menuAddWidth - 16 - 16 - 16; // .left.wrap => padding-left: 16px / gap: 16px / padding-right: 16px; let btnsWidth = 0; Object.values(menuTab.children).forEach(btn => { btn.style.display = 'flex'; btnsWidth += (btn.offsetWidth + 4); // ๋ฒ„ํŠผ์— margin: 0 2px ์„ค์ •๋˜์–ด ์žˆ์–ด์„œ ์ขŒ์šฐ ๋งˆ์ง„๊ฐ’ 4 ์ถ”๊ฐ€ }) let scrollLeft = document.querySelector('.scroll-left'); let scrollRight = document.querySelector('.scroll-right'); if (btnsWidth > menuTabMaxWidth) { leftWrap.style.paddingRight = '80px'; scrollLeft.style.display = 'flex'; scrollRight.style.display = 'flex'; } else { leftWrap.style.paddingRight = '16px'; scrollLeft.style.display = 'none'; scrollRight.style.display = 'none'; } } export async function renderTree(parent, data, isSub) { await loadSystemPolicy(); if (parent.matches('.tree-wrap')) { document.querySelectorAll('.tree-wrap').forEach(treeWrap => { treeWrap.innerHTML = ''; }) } let entries = sortData(data); if (entries.length != 0) { if (!isSub) { treeNotice.style.display = 'none'; treeWrap.style.display = 'flex'; } let docFragment = document.createDocumentFragment(); let tree = document.createElement('div'); tree.classList.add('tree'); if (isSub) tree.classList.add('sub'); docFragment.appendChild(tree); // entries.forEach(async entry => { entries.forEach(async (entry, idx) => { let key = entry[0]; let value = entry[1]; let childState; if (value.filesCount == 0) { childState = 'empty'; } else { childState = 'filled'; } let treeItemWrap = document.createElement('div'); treeItemWrap.classList.add('tree-item-wrap'); treeItemWrap.classList.add(`depth${value.depth}`); treeItemWrap.classList.add(childState); treeItemWrap.classList.add('folder'); treeItemWrap.dataset.resourcePath = value.resourcePath; treeItemWrap.dataset.id = value.dataId; treeItemWrap.dataset.size = value.size; tree.appendChild(treeItemWrap); if (FOLDER_KEEP_POLICY_ACTIVE && value.depth == 3 && value.filesCount < FOLDER_KEEP_FILE_THRESHOLD) { if (value.folderType == null || value.folderType == undefined) { treeItemWrap.classList.add('default-folder'); } else { treeItemWrap.classList.add(`${value.folderType}-folder`); } let lastFolderActDate = new Date(value.lastFolderActDate); let expiryDate = getExpiryDate(lastFolderActDate); if (expiryDate.days < 1) { treeItemWrap.classList.add('expired-warn'); // ํƒ€์ด๋จธ ๋™์ž‘ ๋ถ€๋ถ„ let tick = () => { let expiryDate = getExpiryDate(lastFolderActDate); if (!expiryDate.formatted) { if (treeItemWrap.countdownTimer) { clearInterval(treeItemWrap.countdownTimer); treeItemWrap.countdownTimer = null; } // ํด๋” ์‚ญ์ œ removeExpiredFolder(value); return; } }; // ์ฆ‰์‹œ 1ํšŒ ๊ฐฑ์‹  ํ›„ 1์ดˆ ๊ฐ„๊ฒฉ์œผ๋กœ ๊ฐฑ์‹  tick(); treeItemWrap.countdownTimer = setInterval(tick, 1000); } } let treeItem = document.createElement('div'); treeItem.classList.add('tree-item'); let nameWrap = document.createElement('div'); nameWrap.classList.add('name-wrap'); let image = document.createElement('div'); image.classList.add('image'); let textWrap = document.createElement('div'); textWrap.classList.add('text-wrap'); let nameText = document.createElement('div'); nameText.classList.add('name-text'); nameText.innerHTML = key; textWrap.appendChild(nameText); if (value.depth == 3) nameWrap.appendChild(image); nameWrap.appendChild(textWrap); treeItem.appendChild(nameWrap); let addPermissionBadge = false, permissionEng = '', permissionKor = ''; if (value.permission == 0) { addPermissionBadge = true; permissionEng = 'sub-master'; permissionKor = '๊ด€๋ฆฌ'; } if (value.permission == 8) { addPermissionBadge = true; permissionEng = 'security-worker'; permissionKor = '๋ณด์•ˆ'; } if (value.permission == 4) { addPermissionBadge = true; permissionEng = 'worker'; permissionKor = '์ผ๋ฐ˜'; } // if (value.permission == 2) { // addPermissionBadge = true; // permissionEng = 'uploader'; // permissionKor = '์—…๋กœ๋”'; // } if (addPermissionBadge) { let permissionBadge = document.createElement('div'); permissionBadge.classList.add(`user-permission-${permissionEng}`); // permissionBadge.style.marginLeft = '8px'; let h6 = document.createElement('h6'); h6.innerText = permissionKor; permissionBadge.appendChild(h6); nameWrap.appendChild(permissionBadge); } // depth3์ผ ๋•Œ ํŒŒ์ผ ๊ฐœ์ˆ˜ ํ‘œ์‹œ if (isSub) { let fileCount = document.createElement('div'); fileCount.classList.add('file-count'); // ํŒŒ์ผ ๊ฐœ์ˆ˜๊ฐ€ 3๊ฐœ ๋ฏธ๋งŒ์ด๋ฉด, lastFolderActDate๋ž‘ ํ˜„์žฌ ๋‚ ์งœ ๋น„๊ตํ•ด์„œ ๋งŒ๋ฃŒ ๊ธฐ๊ฐ„ ๊ณ„์‚ฐ // ๋งŒ๋ฃŒ ๊ธฐ๊ฐ„ ์ง€๋‚˜๋ฉด ํด๋” ์‚ญ์ œ ๋ฐ ํ•˜์œ„ ํŒŒ์ผ ํœด์ง€ํ†ต์œผ๋กœ ์ด๋™ if (FOLDER_KEEP_POLICY_ACTIVE && value.filesCount < FOLDER_KEEP_FILE_THRESHOLD) { // ํŠธ๋ฆฌ ์ƒ์„ฑํ•  ๋•Œ ์ด๋ฏธ ๋งŒ๋ฃŒ ๊ธฐ๊ฐ„์ด ์ง€๋‚œ ํด๋”๋Š” ๋ฐ”๋กœ ์‚ญ์ œ let lastFolderActDate = new Date(value.lastFolderActDate); let expiryDate = getExpiryDate(lastFolderActDate); if (!expiryDate.formatted) { // ํด๋” ์‚ญ์ œ removeExpiredFolder(value); return; } let countdown = document.createElement('div'); countdown.classList.add('countdown'); let countdownText = document.createElement('div'); countdownText.classList.add('text'); countdownText.innerHTML = `D-${expiryDate.days}`; countdown.appendChild(countdownText); treeItem.appendChild(countdown); let countdownTooltip; treeItem.addEventListener('pointerenter', () => { // ๋งˆ์šฐ์Šค๊ฐ€ treeItem์— ์ง„์ž…ํ•˜๋ฉด ๊ธฐ์กด countdownTooltip ์ œ๊ฑฐ removeCountdownTooltip(); // treeItem์ด๋ž‘ countdownTooltip์ด ์„ธ๋กœ ๊ธฐ์ค€์œผ๋กœ ๊ฐ€์šด๋ฐ ์ •๋ ฌ ๋˜๋„๋ก ์œ„์น˜ ์กฐ์ • let treeItemRect = treeItemWrap.getBoundingClientRect(); let rectTop = treeItemRect.top; let rectLeft = treeItemRect.left; let rectWidth = treeItemRect.width; let rectHeight = treeItemRect.height; let top = rectTop + (rectHeight/2); let left = rectLeft + rectWidth - 8; countdownTooltip = document.createElement('div'); countdownTooltip.classList.add('countdown-tooltip'); countdownTooltip.style.top = `${pxToRem(top)}rem`; countdownTooltip.style.left = `${pxToRem(left)}rem`; // countdownTooltip ๋‚ด์šฉ ๊ตฌ์„ฑ (๋ฉ”์‹œ์ง€, ๊ธฐ๊ฐ„ ์—ฐ์žฅ ๋ฒ„ํŠผ) let countdownTooltipWrap = document.createElement('div'); countdownTooltipWrap.classList.add('wrap'); let message1 = document.createElement('pre'); message1.classList.add('message'); message1.innerHTML = `ํ•ด๋‹น ํด๋”์˜ ํŒŒ์ผ ๊ฐœ์ˆ˜๊ฐ€ ${FOLDER_KEEP_FILE_THRESHOLD}๊ฐœ ๋ฏธ๋งŒ์ด๋ฏ€๋กœ,`; let message2 = document.createElement('pre'); message2.classList.add('message'); message2.innerHTML = `๋งŒ๋ฃŒ ๊ธฐ๊ฐ„์ด ์ง€๋‚˜๋ฉด ์ž๋™์œผ๋กœ ์‚ญ์ œ๋˜๊ณ ,`; let message3 = document.createElement('pre'); message3.classList.add('message'); message3.innerHTML = `ํด๋” ๋‚ด ํŒŒ์ผ์€ ํœด์ง€ํ†ต์œผ๋กœ ์ด๋™๋ฉ๋‹ˆ๋‹ค.`; let message4 = document.createElement('pre'); message4.classList.add('message', 'expiry-date'); let countdownSpan = document.createElement('span'); countdownSpan.classList.add('bold', 'color', 'countdown'); countdownSpan.textContent = 'dd์ผ hh์‹œ๊ฐ„ mm๋ถ„ ss์ดˆ'; // ์ดˆ๊ธฐ ํ‘œ์‹œ message4.innerHTML = `๋งŒ๋ฃŒ ๊ธฐ๊ฐ„`; message4.appendChild(countdownSpan); let renewExpiryDateBtn = document.createElement('div'); renewExpiryDateBtn.classList.add('renew-expiry-date-btn'); renewExpiryDateBtn.dataset.resourcePath = value.resourcePath; renewExpiryDateBtn.dataset.dataId = value.dataId; let renewExpiryDateBtnText = document.createElement('div'); renewExpiryDateBtnText.classList.add('text'); renewExpiryDateBtnText.classList.add('ft-12'); renewExpiryDateBtnText.innerHTML = '๋งŒ๋ฃŒ ๊ธฐ๊ฐ„ ๊ฐฑ์‹ '; renewExpiryDateBtn.appendChild(renewExpiryDateBtnText); countdownTooltipWrap.appendChild(message1); countdownTooltipWrap.appendChild(message2); countdownTooltipWrap.appendChild(message3); countdownTooltipWrap.appendChild(message4); countdownTooltipWrap.appendChild(renewExpiryDateBtn); let devRenewExpiryDateBtn; if (vars.permission.checkPermission('dev-menu')) { devRenewExpiryDateBtn = document.createElement('div'); devRenewExpiryDateBtn.classList.add('dev-renew-expiry-date-btn'); devRenewExpiryDateBtn.dataset.resourcePath = value.resourcePath; devRenewExpiryDateBtn.dataset.dataId = value.dataId; let devRenewExpiryDateBtnText = document.createElement('div'); devRenewExpiryDateBtnText.classList.add('text'); devRenewExpiryDateBtnText.classList.add('ft-12'); devRenewExpiryDateBtnText.innerHTML = '(๊ฐœ๋ฐœ์ž) ๋งŒ๋ฃŒ ๊ธฐ๊ฐ„ ๋ณ€๊ฒฝ'; devRenewExpiryDateBtn.appendChild(devRenewExpiryDateBtnText); countdownTooltipWrap.appendChild(devRenewExpiryDateBtn); } countdownTooltip.appendChild(countdownTooltipWrap); document.querySelector('body').appendChild(countdownTooltip); // ํƒ€์ด๋จธ ๋™์ž‘ ๋ถ€๋ถ„ let lastFolderActDate = new Date(value.lastFolderActDate); let tick = () => { let expiryDate = getExpiryDate(lastFolderActDate); if (!expiryDate.formatted) { // ๋งŒ๋ฃŒ๋จ: 0์ดˆ๋กœ ๊ณ ์ •ํ•˜๊ฑฐ๋‚˜, ํˆดํŒ์„ ๋‹ซ์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. countdownSpan.textContent = '00์ผ 00์‹œ๊ฐ„ 00๋ถ„ 00์ดˆ'; if (vars.countdownTimer) { clearInterval(vars.countdownTimer); vars.countdownTimer = null; } // ํด๋” ์‚ญ์ œ removeExpiredFolder(value); return; } countdownSpan.textContent = expiryDate.formatted; }; // ์ฆ‰์‹œ 1ํšŒ ๊ฐฑ์‹  ํ›„ 1์ดˆ ๊ฐ„๊ฒฉ์œผ๋กœ ๊ฐฑ์‹  tick(); vars.countdownTimer = setInterval(tick, 1000); // ํŽธ์˜์„ฑ - countdownTooltip์ด ํ™”๋ฉด ์˜์—ญ ์•„๋ž˜๋กœ ๋“ค์–ด๊ฐ€์ง€ ์•Š๋„๋ก ์œ„์น˜ ์กฐ์ • if (countdownTooltip.offsetHeight + rectTop > window.innerHeight) { countdownTooltip.style.top = `${pxToRem(window.innerHeight - (countdownTooltip.offsetHeight/2) - 1)}rem`; } // ๋งˆ์šฐ์Šค๊ฐ€ countdownTooltip์„ ๋ฒ—์–ด๋‚˜๋ฉด countdownTooltip ์ œ๊ฑฐ countdownTooltip.addEventListener('pointerleave', () => { removeCountdownTooltip(); }) // renewExpiryDateBtn ํด๋ฆญ ์ด๋ฒคํŠธ ์ถ”๊ฐ€ renewExpiryDateBtn.addEventListener('click', async (e) => { let renewExpiryDateParams = { userInfoString: vars.userInfoString, storageType: vars.storageType, resourcePath: value.resourcePath, dataId: value.dataId, depth3DataIdArr: [e.target.dataset.dataId], } let renewExpiryDateRes = await axios.post(`${vars.path_name}/renewExpiryDate`, { params: renewExpiryDateParams }); if (renewExpiryDateRes.data.message == 'renewExpiryDate_success') { console.log('renewExpiryDate_success'); // renewExpiryDateBtn์„ ํด๋ฆญํ•˜๋ฉด countdownTooltip dom ์ œ๊ฑฐ ๋ฐ ํˆดํŒํƒ€์ด๋จธ, ํŠธ๋ฆฌ์•„์ดํ…œํƒ€์ด๋จธ ์ œ๊ฑฐ removeCountdownTooltip(); clearInterval(document.querySelector(`.tree-item-wrap[data-resource-path="${value.resourcePath}"]`).countdownTimer); document.querySelector(`.tree-item-wrap[data-resource-path="${value.resourcePath}"]`).countdownTimer = null; let toggleParams = { text: `'${key}' ํด๋”์˜ ๋งŒ๋ฃŒ ๊ธฐ๊ฐ„์ด ${FOLDER_KEEP_DAYS_THRESHOLD}์ผ๋กœ ๊ฐฑ์‹ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.`, // text: `'${key}' ํด๋”์˜ ๋งŒ๋ฃŒ ๊ธฐ๊ฐ„์ด ${FOLDER_KEEP_DAYS_THRESHOLD-1}์ผ๋กœ ๊ฐฑ์‹ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.`, type: 'alertModal' }; toggleModal(true, toggleParams); } }) // ๊ฐœ๋ฐœ์ž์šฉ devRenewExpiryDateBtn ํด๋ฆญ ์ด๋ฒคํŠธ ์ถ”๊ฐ€ if (devRenewExpiryDateBtn) { devRenewExpiryDateBtn.addEventListener('click', async (e) => { let toggleParams = { text: `์ž…๋ ฅํ•œ ์ดˆ(sec)๋งŒํผ ๋งŒ๋ฃŒ ๊ธฐ๊ฐ„์ด ๋ณ€๊ฒฝ๋ฉ๋‹ˆ๋‹ค.(์ž…๋ ฅ ์•ˆํ•˜๊ณ  ํ™•์ธ์„ ๋ˆ„๋ฅด๋ฉด 15์ผ๋กœ ๋ณ€๊ฒฝ๋ฉ๋‹ˆ๋‹ค.)`, type: 'devRenewExpiryDate', resourcePath: value.resourcePath, dataId: value.dataId, depth3DataIdArr: [e.target.dataset.dataId], folderName: key }; toggleModal(true, toggleParams); }) } }) treeItem.addEventListener('pointerleave', (e) => { // ๋งˆ์šฐ์Šค๊ฐ€ treeItem์„ ๋ฒ—์–ด๋‚œ ์งํ›„ ๋งˆ์šฐ์Šค ์œ„์น˜ ๋Œ€์ƒ์ด countdownTooltip์ธ ๊ฒฝ์šฐ ๋ฆฌํ„ด let next = e.relatedTarget; if (next && next.closest('.countdown-tooltip')) return; // ๋งˆ์šฐ์Šค๊ฐ€ treeItem์„ ๋ฒ—์–ด๋‚˜๋ฉด countdownTooltip ์ œ๊ฑฐ removeCountdownTooltip(); }) } else { let fileCountText = document.createElement('div'); fileCountText.classList.add('file-count-text'); fileCountText.innerHTML = addCommasToNumber(value.filesCount); fileCount.appendChild(fileCountText); treeItem.appendChild(fileCount); } } treeItemWrap.appendChild(treeItem); if (value.depth == 2) renderTree(treeItemWrap, value.child.folder, true); treeItem.addEventListener('click', async (e) => { vars.lastSelectTarget = treeItem; let parent = treeItem.parentElement; if (value.depth == 2) { // console.log('depth2'); // let targetTree = 'main'; // changeTreeItemStyle(treeItem, targetTree); } if (value.depth == 3) { if (vars.lastHeaderBtn) targetFocus(vars.lastHeaderBtn); listContainer.querySelector('.list-body .list-item-wrap').innerHTML = ''; listContainer.style.display = 'flex'; listNotice.style.display = 'none'; resetViewer(); let isMainTree = e.target.closest('.archive-main-left .tree-container'); // let isModalTree = e.target.closest('.archive-main-center .list-container'); let targetTree; if (isMainTree) targetTree = 'main'; // if (isModalTree) targetTree = 'modal'; let selectedDepth3TreeItemWrap = document.querySelector(`.archive-${targetTree} .tree-item-wrap.depth3.selected`); if (selectedDepth3TreeItemWrap) selectedDepth3TreeItemWrap.classList.remove('selected'); treeItemWrap.classList.add('selected'); // document.querySelector('.control-box .file-area-mode-btn.selected')?.classList.remove('selected'); // document.querySelector(`.control-box .file-area-mode-btn.${fileAreaMode}`).classList.add('selected'); // let targetTree = 'main'; // if (option.modalTree) { // targetTree = 'modal'; // compareMovePath(resourcePath); // } changeTreeItemStyle(treeItemWrap, targetTree); // let childFileData = getDataFromTreeObject(resourcePath, 'folder', vars.allTreeObject).data.child.file; // console.log(childFileData); // let listParent = document.querySelector('.main-center .list-container .list-wrap.list-body .list-item-wrap'); // renderList(listParent, childFileData); // let pageRanderingOption = { // isInit: isInit, // // favorite: ์ฆ๊ฒจ์ฐพ๊ธฐ ํ•œ ๊ฒฝ๋กœ // } // .list-wrap.list-header, .list-wrap.list-body์— dataset.resourcePath ์„ค์ • document.querySelector('.archive-main-center .list-container .list-wrap.list-header').dataset.resourcePath = value.resourcePath; document.querySelector('.archive-main-center .list-container .list-wrap.list-body').dataset.resourcePath = value.resourcePath; // ํŠธ๋ฆฌ ํด๋” ๋ฒ„ํŠผ ํด๋ฆญํ•  ๋•Œ ๋ฆฌ์ŠคํŠธ ์ƒ์„ฑ ์ˆœ์„œ ๋’ค์ง‘ํžˆ์ง€ ์•Š๋„๋ก list sort ์ดˆ๊ธฐํ™” resetSort(); // ๊ธฐ์กด ๋ฆฌ์ŠคํŠธ ์˜์—ญ ํ™”๋ฉด์ด ์œ„์น˜ ์ˆ˜์ • ๋ชจ๋“œ์ธ ๊ฒฝ์šฐ ์ดˆ๊ธฐํ™” if (vars.mapMode == 'edit') { vars.mapMode = 'normal'; document.querySelector('.map-container').classList.remove('edit-mode'); } // ๋‹ค์ค‘ ์„ ํƒ ์•„์ดํ…œ ๋ฐฐ์—ด ์ดˆ๊ธฐํ™” vars.multiSelectListItemArr = []; let pageRanderingOption = { scope: 'list', resourcePath: value.resourcePath } await preparePageRendering(pageRanderingOption); // ํŒŒ์ผ ์ด๋™ ๋ชจ๋“œ(listViewerCover display flex)์ผ ๋•Œ ํŠธ๋ฆฌ depth3 ๋ฉ”๋‰ด ํด๋ฆญํ•˜๋ฉด ์„ ํƒ ํด๋” ๊ฒฝ๋กœ ๋ณ€๊ฒฝ let listViewerCover = document.querySelector('.list-viewer-cover'); if (listViewerCover.style.display == 'flex') { listViewerCover.querySelector('.new-path .value').textContent = value.resourcePath; } else { //// vars์—์„œ ๋งˆ์ง€๋ง‰ ์„ ํƒ ์•„์ดํ…œ์„ ์ €์žฅํ•œ ์†์„ฑ๋“ค ์ดˆ๊ธฐํ™” - renderTree // ํŒŒ์ผ ์ด๋™ ๋ชจ๋“œ์—์„œ ์ดˆ๊ธฐํ™”ํ•˜๋ฉด ์ด๋™ ์ „, ํ›„ ๊ฒฝ๋กœ๋ฅผ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์—†์–ด์„œ ํŒŒ์ผ ์ด๋™ ๋ชจ๋“œ ์•„๋‹ ๋•Œ์—๋งŒ ์ดˆ๊ธฐํ™” vars.lastListItem = undefined; vars.lastListGroupTarget = undefined; vars.lastContextTarget = undefined; } } }) }) parent.appendChild(docFragment); document.querySelector('.archive-main-left .tree-title').classList.add('selected'); } else { if (!isSub) { treeNotice.style.display = 'flex'; treeWrap.style.display = 'none'; } } } async function renderRecycleBin(parent, data) { let listItemWrap = document.querySelector('.recycle-bin-modal .list-container .list-wrap.list-body .list-item-wrap'); listItemWrap.innerHTML = ''; listItemWrap.style.display = 'flex'; initFileAreaUI('list'); await createRecycleBinItems(parent, data); } function createRecycleBinItems(parent, data) { let docFragment = document.createDocumentFragment(); let entries = sortData(data); entries.forEach(async (entry, idx) => { let key = entry[0].split('___[recycle-bin]___')[0]; let value = entry[1]; let ext = (value.ext).toLowerCase(); // ํŒŒ์ผ resourcePath ๋งจ ๋งˆ์ง€๋ง‰์— / ๋ถ™์–ด์žˆ์œผ๋ฉด ์ œ๊ฑฐ let resourcePathSplit = value.resourcePath.split('/'); if (resourcePathSplit[resourcePathSplit.length-1] == '') resourcePathSplit.pop(); let resourcePath = resourcePathSplit.join('/'); let dataId = value.dataId; let listItem = document.createElement('div'); listItem.classList.add('list-item'); listItem.classList.add(`depth${value.depth}`); listItem.classList.add('file'); listItem.classList.add('main-list-item'); listItem.dataset.resourcePath = resourcePath; listItem.dataset.id = dataId; listItem.dataset.size = value.size; listItem.dataset.mainFileName = `${dataId}_${resourcePath}`; // ํ™•์žฅ์ž๊ฐ€ ์œ ํšจํ•œ ๊ฒฝ์šฐ ํด๋ž˜์Šค์— ext ์ถ”๊ฐ€ if (isValidExt(ext)) listItem.classList.add(ext); let wrap = document.createElement('div'); wrap.classList.add('wrap'); // ํŒŒ์ผ ํƒ€์ž… // let type = document.createElement('div'); // type.classList.add('type'); // type.classList.add('list-item-data'); // let typeImage = document.createElement('div'); // typeImage.classList.add('type-image'); // type.appendChild(typeImage); // ํŒŒ์ผ๋ช… let name = document.createElement('div'); name.classList.add('name'); name.classList.add('list-item-data'); let typeImage = document.createElement('div'); typeImage.classList.add('type-image'); name.appendChild(typeImage); // let typeImage = document.createElement('div'); // typeImage.classList.add('type-image'); // name.appendChild(typeImage); let nameText = document.createElement('div'); nameText.classList.add('name-text'); nameText.classList.add('text'); nameText.classList.add('ft-14'); nameText.innerHTML = key; name.appendChild(nameText); // ์›๋ž˜ ์œ„์น˜ let originalLocation = document.createElement('div'); originalLocation.classList.add('original-location'); originalLocation.classList.add('list-item-data'); let originalLocationText = document.createElement('div'); originalLocationText.classList.add('text'); originalLocationText.classList.add('ft-12'); originalLocationText.innerHTML = splitTopPathAndTargetName(resourcePath).topPath; originalLocation.appendChild(originalLocationText); // ์‚ญ์ œ์ž let removeUser = document.createElement('div'); removeUser.classList.add('remove-user'); removeUser.classList.add('list-item-data'); let removeUserText = document.createElement('div'); removeUserText.classList.add('text'); removeUserText.classList.add('ft-12'); removeUserText.innerHTML = value.modUserNm; removeUser.appendChild(removeUserText); // ์‚ญ์ œ์ผ์ž let removeDate = document.createElement('div'); removeDate.classList.add('remove-date'); removeDate.classList.add('list-item-data'); let removeDateText = document.createElement('div'); removeDateText.classList.add('text'); removeDateText.classList.add('ft-12'); removeDateText.innerHTML = '-'; if (value.modDate) { let date = new Date(value.modDate); removeDateText.innerHTML = `${changeDateFormat(date.toLocaleDateString('ko-KR'))} ${changeTimeFormat(date.toLocaleTimeString('en-US', {hour12: false}))}`; } removeDate.appendChild(removeDateText); // ์ž‘์„ฑ์ž let author = document.createElement('div'); author.classList.add('author'); author.classList.add('list-item-data'); let authorText = document.createElement('div'); authorText.classList.add('text'); authorText.classList.add('ft-12'); authorText.innerHTML = (value.authorNm) ? value.authorNm : value.userNm; author.appendChild(authorText); // ๋“ฑ๋ก์ž let uploader = document.createElement('div'); uploader.classList.add('uploader'); uploader.classList.add('list-item-data'); let uploaderText = document.createElement('div'); uploaderText.classList.add('text'); uploaderText.classList.add('ft-12'); uploaderText.innerHTML = '-'; if (value.userNm) uploaderText.innerHTML = value.userNm; uploader.appendChild(uploaderText); // ๋“ฑ๋ก์ผ์ž let createDate = document.createElement('div'); createDate.classList.add('create-date'); createDate.classList.add('list-item-data'); let createDateText = document.createElement('div'); createDateText.classList.add('text'); createDateText.classList.add('ft-12'); createDateText.innerHTML = '-'; if (value.createDate) { let date = new Date(value.createDate); createDateText.innerHTML = `${changeDateFormat(date.toLocaleDateString('ko-KR'))} ${changeTimeFormat(date.toLocaleTimeString('en-US', {hour12: false}))}`; } createDate.appendChild(createDateText); // ์šฉ๋Ÿ‰ let size = document.createElement('div'); size.classList.add('size'); size.classList.add('list-item-data'); let sizeText = document.createElement('div'); sizeText.classList.add('text'); sizeText.classList.add('ft-12'); sizeText.innerHTML = formatBytes(value.size); if (value.size >= 1073741824) sizeText.classList.add('large'); size.appendChild(sizeText); // ์ƒํƒœ let state = document.createElement('div'); state.classList.add('state'); state.classList.add('list-item-data'); let stateText = document.createElement('div'); stateText.classList.add('state-text'); stateText.classList.add('ft-12'); if (value.isSupported) { // ์ง€์› if (value.needConvert && !value.isConverted) { state.classList.add('convert'); stateText.innerHTML = '๋ณ€ํ™˜ํ•„์š”'; } else { // ์—ด๋žŒ๊ฐ€๋Šฅ - ๋ณ€ํ™˜ ๋œ ํŒŒ์ผ ๋˜๋Š” ๋ณ€ํ™˜ ํ•„์š” ์—†๋Š” ํŒŒ์ผ์ผ ๋•Œ state.classList.add('viewable'); stateText.innerHTML = '์—ด๋žŒ๊ฐ€๋Šฅ'; } } else { // ๋ฏธ์ง€์› state.classList.add('unsupport'); stateText.innerHTML = '๋ฏธ์ง€์›'; } state.appendChild(stateText); // wrap.appendChild(type); wrap.appendChild(name); wrap.appendChild(originalLocation); wrap.appendChild(removeUser); wrap.appendChild(removeDate); wrap.appendChild(author); wrap.appendChild(uploader); wrap.appendChild(createDate); wrap.appendChild(size); wrap.appendChild(state); listItem.appendChild(wrap); docFragment.appendChild(listItem); wrap.addEventListener('dblclick', async (e) => { openNewWindowViewer(); }) wrap.addEventListener('click', async (e) => { let isCtrl = e.ctrlKey; let isShift = e.shiftKey; let target = e.target; // ์ขŒํด๋ฆญ์ด ์•„๋‹Œ ๊ฒฝ์šฐ ๋ฌด์‹œ if (e.button !== 0) return; let clickedListItem = target.closest('.list-item'); if (!clickedListItem) return; let allItems = [...document.querySelectorAll('.recycle-bin-modal .list-container .list-body .list-item')]; let clickedIndex = allItems.indexOf(clickedListItem); let isClickFinished = false; // --- Ctrl + Shift --- if (!isClickFinished && isCtrl && isShift) { isClickFinished = true; let anchorIndex = allItems.indexOf(vars.lastListItem_bin); if (anchorIndex == -1) anchorIndex = 0; let [start, end] = [anchorIndex, clickedIndex].sort((a, b) => a - b); for (let i = start; i <= end; i++) { let item = allItems[i]; if (!vars.multiSelectListItemArr_bin.includes(item)) { vars.multiSelectListItemArr_bin.push(item); } item.classList.add('selected'); item.classList.add('group-style'); } isClickFinished = true; } // --- Shift only --- if (!isClickFinished && isShift) { let anchorIndex = allItems.indexOf(vars.lastListItem_bin); if (anchorIndex == -1) anchorIndex = 0; // ๊ธฐ์กด ์„ ํƒ ํ•ด์ œ vars.multiSelectListItemArr_bin = []; allItems.forEach(item => { item.classList.remove('selected'); }); let [start, end] = [anchorIndex, clickedIndex].sort((a, b) => a - b); for (let i = start; i <= end; i++) { let item = allItems[i]; vars.multiSelectListItemArr_bin.push(item); item.classList.add('selected'); } //// shift ๋‹ค์ค‘ ์„ ํƒ ํ›„ deleteํ‚ค๋กœ ํœด์ง€ํ†ต์œผ๋กœ ์ด๋™ vars.lastSelectTarget_bin = vars.multiSelectListItemArr_bin[0]; isClickFinished = true; } // --- Ctrl only --- if (!isClickFinished && isCtrl) { if (vars.multiSelectListItemArr_bin.includes(clickedListItem)) { vars.multiSelectListItemArr_bin = vars.multiSelectListItemArr_bin.filter(item => item !== clickedListItem); clickedListItem.classList.remove('selected'); } else { vars.multiSelectListItemArr_bin.push(clickedListItem); clickedListItem.classList.add('selected'); } vars.lastListItem_bin = clickedListItem; isClickFinished = true; } if (!isClickFinished) { // --- ์ผ๋ฐ˜ ํด๋ฆญ (๊ธฐ์กด ์„ ํƒ ์ œ๊ฑฐ ํ›„ ๋‹จ์ผ ์„ ํƒ + ๋™์ž‘ ์‹คํ–‰) --- vars.multiSelectListItemArr_bin = []; document.querySelectorAll('.recycle-bin-modal .list-container .list-body .list-item').forEach((elem) => { elem.classList.remove('selected'); }); clickedListItem.classList.add('selected'); vars.lastListItem_bin = clickedListItem; if (!isCtrl && !isShift) { vars.lastSelectTarget_bin = clickedListItem; } changeListItemStyle(clickedListItem, '๋ฆฌ์ŠคํŠธ ์•„์ดํ…œ ํด๋ฆญ'); } await syncGroupStyle(); }); }) parent.appendChild(docFragment); } export async function renderList(parent, data, isSub, subCategory) { // ํด๋”ํƒ€์ž… ์ง€์ • // fileAreaMode = document.querySelector('.control-box .file-area-mode-btn.selected').id; let fileAreaMode = vars.lastFileAreaMode; // ์ปจํŠธ๋กค ๋ฐ•์Šค ํ‘œ์‹œ toggleControlBox(true, fileAreaMode); listContainer.classList.remove('list'); listContainer.classList.add(fileAreaMode); let listItemWrap = listContainer.querySelector('.list-body .list-item-wrap'); listItemWrap.innerHTML = ''; // ํŒŒ์ผ ์˜์—ญ ๋ชจ๋“œ์— ๋งž๊ฒŒ ํŒŒ์ผ ์˜์—ญ UI ์ดˆ๊ธฐํ™” initFileAreaUI(fileAreaMode); // ํด๋”ํƒ€์ž…์— ๋”ฐ๋ผ ์•„์ดํ…œ ์ƒ์„ฑ if (fileAreaMode == 'list') { if (!isSub) { // ์•„์นด์ด๋ธŒ ์šฐ์ธก ์˜์—ญ ํ‘œ์‹œ let option = { from: '๋ฆฌ์ŠคํŠธ ๋ Œ๋”๋ง' } await toggleArchiveMainRight(true, option); } await createListItems(parent, data, isSub, subCategory); } if (fileAreaMode == 'grid') { // ์•„์นด์ด๋ธŒ ์šฐ์ธก ์˜์—ญ ์ˆจ๊น€ let option = { from: '๊ทธ๋ฆฌ๋“œ ๋ Œ๋”๋ง' } await toggleArchiveMainRight(false, option); // vars.listOrder ๋ฐฐ์—ด ์ดˆ๊ธฐํ™” ํ›„ createListOrder ํ•จ์ˆ˜์—์„œ vars.listOrder ๋ฐฐ์—ด์— ๋ฆฌ์ŠคํŠธ ๊ธฐ์ค€ ์ˆœ์„œ๋กœ ํŒŒ์ผ๋ช…, ๋ฐ์ดํ„ฐid ๋‹ด๊ธด ๊ฐ์ฒด ์ถ”๊ฐ€ vars.listOrder = []; await createListOrder(data, isSub, subCategory); // newData์— depth4, depth5 ๋ฐ์ดํ„ฐ ์ถ”๊ฐ€ํ•ด์„œ ๋ ˆ๋ฒจ ํ‰ํƒ„ํ™” let entries = Object.entries(data); let newData = {}; entries.forEach(async (entry) => { let key = entry[0]; let value = entry[1]; newData[key] = value; subCategoryList.forEach(async (ele) => { let sub = getDataFromTreeObject(`${value.resourcePath}_${ele}`, 'folder', vars.allTreeObject).data; if (sub) { let subEntries = Object.entries(sub.child.file); subEntries.forEach(async (subEntry) => { let subKey = subEntry[0]; let subValue = subEntry[1]; subValue.name = `${key}___${subKey}`; newData[`${key}___${subKey}`] = subValue; }) } }) }) // dataId ๊ธฐ์ค€์œผ๋กœ newData ์ •๋ ฌํ•œ map ์ƒ์„ฑ let newDataById = new Map( Object.values(newData).map(item => [item.dataId, item]) ); // vars.listOrder ์ˆœ์„œ๋Œ€๋กœ dataId ์‚ฌ์šฉํ•ด์„œ map์—์„œ ๋ฐ์ดํ„ฐ ๊บผ๋‚ด์„œ orderedData์— ์ถ”๊ฐ€ let orderedData = {}; for (const item of vars.listOrder) { const data = newDataById.get(item.dataId); if (data) orderedData[data.name] = data; } // ํ‰ํƒ„ํ™”, ๋ฆฌ์ŠคํŠธ ๊ธฐ์ค€ ์ •๋ ฌ ๋œ orderedData๋กœ ๊ทธ๋ฆฌ๋“œ ํ™”๋ฉด ์ƒ์„ฑ await createGridItems(parent, orderedData); } if (fileAreaMode == 'map') { await createMapItems(data); } if (vars.multiSelectListItemArr.length > 0) { let newMultiSelectListArr = []; vars.multiSelectListItemArr.forEach(item => { let dataId = item.dataset.id; let newItem = listContainer.querySelector(`.list-item[data-id="${dataId}"]`); if (newItem) { newItem.classList.add('selected'); newItem.classList.add('group-style'); newMultiSelectListArr.push(newItem); } }); vars.multiSelectListItemArr = newMultiSelectListArr; if (vars.lastListItem) await changeListItemStyle(vars.lastListItem, 'renderList ๋๋ถ€๋ถ„'); await syncGroupStyle(); } } function createListItems(parent, data, isSub, subCategory) { let docFragment = document.createDocumentFragment(); let entries = sortData(data); entries.forEach(async (entry, idx) => { let key = entry[0]; let value = entry[1]; let ext = (value.ext).toLowerCase(); // ํŒŒ์ผ resourcePath ๋งจ ๋งˆ์ง€๋ง‰์— / ๋ถ™์–ด์žˆ์œผ๋ฉด ์ œ๊ฑฐ let resourcePathSplit = value.resourcePath.split('/'); if (resourcePathSplit[resourcePathSplit.length-1] == '') resourcePathSplit.pop(); let resourcePath = resourcePathSplit.join('/'); let dataId = value.dataId; let listItem = document.createElement('div'); listItem.classList.add('list-item'); listItem.classList.add(`depth${value.depth}`); listItem.classList.add('file'); listItem.dataset.resourcePath = resourcePath; listItem.dataset.id = dataId; listItem.dataset.size = value.size; listItem.dataset.mainFileName = value.mainFileName; // ํ™•์žฅ์ž๊ฐ€ ์œ ํšจํ•œ ๊ฒฝ์šฐ ํด๋ž˜์Šค์— ext ์ถ”๊ฐ€ if (isValidExt(ext)) listItem.classList.add(ext); let wrap = document.createElement('div'); wrap.classList.add('wrap'); // ํŒŒ์ผ ํƒ€์ž… // let type = document.createElement('div'); // type.classList.add('type'); // type.classList.add('list-item-data'); // let typeImage = document.createElement('div'); // typeImage.classList.add('type-image'); // type.appendChild(typeImage); // ํŒŒ์ผ๋ช… let name = document.createElement('div'); name.classList.add('name'); name.classList.add('list-item-data'); if (isSub) { listItem.classList.add('sub-list-item'); let subSign = document.createElement('div'); subSign.classList.add('sub-sign'); let symbol = document.createElement('div'); symbol.classList.add('symbol'); symbol.innerText = 'โ””'; let subSignText = document.createElement('div'); subSignText.classList.add('text'); subSign.classList.add(subCategory); subSignText.innerText = subCategoryData[subCategory].korean; subSign.appendChild(symbol); subSign.appendChild(subSignText); name.appendChild(subSign); } else { listItem.classList.add('main-list-item'); let typeImage = document.createElement('div'); typeImage.classList.add('type-image'); name.appendChild(typeImage); } // let typeImage = document.createElement('div'); // typeImage.classList.add('type-image'); // name.appendChild(typeImage); let nameText = document.createElement('div'); nameText.classList.add('name-text'); nameText.classList.add('text'); nameText.classList.add('ft-14'); nameText.innerHTML = key; name.appendChild(nameText); // ๊ถŒํ•œ์„ค์ • - ํŒŒ์ผ์— ๊ถŒํ•œ์„ค์ •? // let addPermissionBadge = false, permissionEng = '', permissionKor = ''; // if (value.permission == 0) { // nameText.classList.add('sub-master'); // addPermissionBadge = true; // permissionEng = 'sub-master'; // permissionKor = '๋ถ€๊ด€๋ฆฌ์ž'; // } // if (value.permission == 8) { // nameText.classList.add('worker'); // addPermissionBadge = true; // permissionEng = 'worker'; // permissionKor = '์ฐธ์—ฌ์ž'; // } // if (addPermissionBadge) { // let permissionBadge = document.createElement('div'); // permissionBadge.classList.add(`user-permission-${permissionEng}`); // permissionBadge.style.marginLeft = '8px'; // // let image = document.createElement('img'); // // image.src = `/main/img/permission/${permissionEng}.svg`; // // image.alt = permissionKor; // let h6 = document.createElement('h6'); // h6.innerText = permissionKor; // // permissionBadge.appendChild(image); // permissionBadge.appendChild(h6); // } // name.appendChild(permissionBadge); // ์ž‘์„ฑ์ž let author = document.createElement('div'); author.classList.add('author'); author.classList.add('list-item-data'); let authorText = document.createElement('div'); authorText.classList.add('text'); authorText.classList.add('ft-12'); authorText.innerHTML = (value.authorNm) ? value.authorNm : value.userNm; author.appendChild(authorText); // ๋“ฑ๋ก์ž let uploader = document.createElement('div'); uploader.classList.add('uploader'); uploader.classList.add('list-item-data'); let uploaderText = document.createElement('div'); uploaderText.classList.add('text'); uploaderText.classList.add('ft-12'); uploaderText.innerHTML = '-'; if (value.userNm) uploaderText.innerHTML = value.userNm; uploader.appendChild(uploaderText); // ๋“ฑ๋ก์ผ์ž let createDate = document.createElement('div'); createDate.classList.add('create-date'); createDate.classList.add('list-item-data'); let createDateText = document.createElement('div'); createDateText.classList.add('text'); createDateText.classList.add('ft-12'); createDateText.innerHTML = '-'; if (value.createDate) { let date = new Date(value.createDate); createDateText.innerHTML = `${changeDateFormat(date.toLocaleDateString('ko-KR'))} ${changeTimeFormat(date.toLocaleTimeString('en-US', {hour12: false}))}`; } createDate.appendChild(createDateText); // ์šฉ๋Ÿ‰ let size = document.createElement('div'); size.classList.add('size'); size.classList.add('list-item-data'); let sizeText = document.createElement('div'); sizeText.classList.add('text'); sizeText.classList.add('ft-12'); sizeText.innerHTML = formatBytes(value.size); if (value.size >= 1073741824) sizeText.classList.add('large'); size.appendChild(sizeText); // ์ƒํƒœ let state = document.createElement('div'); state.classList.add('state'); state.classList.add('list-item-data'); let stateText = document.createElement('div'); stateText.classList.add('state-text'); stateText.classList.add('ft-12'); let convertBtn = document.createElement('div'); convertBtn.classList.add('convert-btn'); let convertBtnImage = document.createElement('div'); let convertBtnText = document.createElement('div'); convertBtnImage.classList.add('convert-btn-image'); convertBtnText.classList.add('convert-btn-text'); convertBtnText.classList.add('ft-12'); convertBtn.appendChild(convertBtnImage); convertBtn.appendChild(convertBtnText); let addBtn = false; if (value.isSupported) { // ์ง€์› if (vars.convertingDataArr.some(data => Number(data.dataId) === Number(dataId))) { // ๋ณ€ํ™˜์ค‘ addBtn = true; state.classList.add('working'); convertBtnText.innerHTML = '๋ณ€ํ™˜์ค‘'; } else { if (value.needConvert && !value.isConverted) { // ** ๊ถŒํ•œ ๊ด€๋ จ // ๋ณ€ํ™˜ํ•„์š” - ๋ณ€ํ™˜ ํ•„์š”ํ•œ ํŒŒ์ผ์ด๋ฉด์„œ ๋ณ€ํ™˜์ด ์•ˆ ๋œ ์ƒํƒœ์ผ ๋•Œ let permission = JSON.parse(vars.userInfoString).permission; if (permission == 1) { state.classList.add('convert'); stateText.innerHTML = '๋ณ€ํ™˜ํ•„์š”'; } else { addBtn = true; state.classList.add('convert'); convertBtnText.innerHTML = '๋ณ€ํ™˜ํ•„์š”'; } } else { // ์—ด๋žŒ๊ฐ€๋Šฅ - ๋ณ€ํ™˜ ๋œ ํŒŒ์ผ ๋˜๋Š” ๋ณ€ํ™˜ ํ•„์š” ์—†๋Š” ํŒŒ์ผ์ผ ๋•Œ state.classList.add('viewable'); stateText.innerHTML = '์—ด๋žŒ๊ฐ€๋Šฅ'; } } } else { // ๋ฏธ์ง€์› state.classList.add('unsupport'); stateText.innerHTML = '๋ฏธ์ง€์›'; } state.appendChild(stateText); if (addBtn) state.appendChild(convertBtn); // ๋ฉ”๋ชจ์œ ๋ฌด ์•„์ด์ฝ˜ let isMemo = document.createElement('div'); isMemo.classList.add('memo'); isMemo.classList.add('list-item-data'); let memoIconWrap = document.createElement('div'); memoIconWrap.classList.add('memo-item-wrap'); let memoIcon = document.createElement('img'); memoIcon.classList.add('memo-icon'); memoIcon.src = '/main/img/archive/icon__list-memo.svg'; if (!(value.memo == '' || value.memo == undefined || value.memo == null || value.memo == true)) memoIconWrap.appendChild(memoIcon); isMemo.appendChild(memoIconWrap); // ์œ„์น˜ ํ…์ŠคํŠธ ์ €์žฅ let gpsData = document.createElement('div'); gpsData.classList.add('gps-data'); gpsData.style.display = 'none'; let gpsDataText = document.createElement('div'); gpsDataText.classList.add('text'); gpsDataText.innerHTML = `๊ฒฝ๋„: ${(value.lon) ? value.lon : '์—†์Œ'} / ์œ„๋„: ${(value.lat) ? value.lat : '์—†์Œ'}`; gpsDataText.style.display = 'none'; gpsData.appendChild(gpsDataText); // wrap.appendChild(type); wrap.appendChild(name); wrap.appendChild(author); wrap.appendChild(uploader); wrap.appendChild(createDate); wrap.appendChild(size); wrap.appendChild(state); wrap.appendChild(isMemo); wrap.appendChild(gpsData); listItem.appendChild(wrap); // ์ถ”๊ฐ€ ํŒŒ์ผ์ด ์žˆ๋Š” ๊ฒฝ์šฐ ์ถ”๊ฐ€ ํŒŒ์ผ ์ƒ์„ฑ subCategoryList.forEach(async (ele) => { let sub = getDataFromTreeObject(`${resourcePath}_${ele}`, 'folder', vars.allTreeObject).data; if (sub) { let subListItemWrap = document.createElement('div'); subListItemWrap.classList.add('list-item-wrap'); subListItemWrap.classList.add('sub-list-item-wrap'); listItem.appendChild(subListItemWrap); renderList(subListItemWrap, sub.child.file, true, ele); } }) docFragment.appendChild(listItem); if (vars.lastListItem?.dataset.resourcePath == resourcePath) { // const memo = getDataFromTreeObject(value.resourcePath, 'file', vars.allTreeObject).data; let res = await axios.get(`${vars.path_name}/getMemoInfo`, { params: { userInfoString: vars.userInfoString, resourcePath: resourcePath, dataId: dataId } } ); let memo = res.data.result.memo; setTimeout(() => { renderMemo (memo, dataId); }, 100); } wrap.addEventListener('dblclick', async (e) => { openNewWindowViewer(); }) wrap.addEventListener('click', async (e) => { let isCtrl = e.ctrlKey; let isShift = e.shiftKey; let target = e.target; // ์ขŒํด๋ฆญ์ด ์•„๋‹Œ ๊ฒฝ์šฐ ๋ฌด์‹œ if (e.button !== 0) return; let clickedListItem = target.closest('.list-item'); if (!clickedListItem) return; if (vars.lastHeaderBtn) targetFocus(vars.lastHeaderBtn); if (vars.lastMainTreeItem) targetFocus(vars.lastMainTreeItem); let allItems = [...document.querySelectorAll('.archive-main .list-container .list-body .list-item')]; let clickedIndex = allItems.indexOf(clickedListItem); let isClickFinished = false; // --- Ctrl + Shift --- if (!isClickFinished && isCtrl && isShift) { isClickFinished = true; let anchorIndex = allItems.indexOf(vars.lastListItem); if (anchorIndex == -1) anchorIndex = 0; let [start, end] = [anchorIndex, clickedIndex].sort((a, b) => a - b); for (let i = start; i <= end; i++) { let item = allItems[i]; if (!vars.multiSelectListItemArr.includes(item)) { vars.multiSelectListItemArr.push(item); } item.classList.add('selected'); item.classList.add('group-style'); } isClickFinished = true; resetViewer(); } // --- Shift only --- if (!isClickFinished && isShift) { let anchorIndex = allItems.indexOf(vars.lastListItem); if (anchorIndex == -1) anchorIndex = 0; // ๊ธฐ์กด ์„ ํƒ ํ•ด์ œ vars.multiSelectListItemArr = []; allItems.forEach(item => { item.classList.remove('selected'); }); let [start, end] = [anchorIndex, clickedIndex].sort((a, b) => a - b); for (let i = start; i <= end; i++) { let item = allItems[i]; vars.multiSelectListItemArr.push(item); item.classList.add('selected'); } //// shift ๋‹ค์ค‘ ์„ ํƒ ํ›„ deleteํ‚ค๋กœ ํœด์ง€ํ†ต์œผ๋กœ ์ด๋™ vars.lastSelectTarget = vars.multiSelectListItemArr[0]; isClickFinished = true; resetViewer(); } // --- Ctrl only --- if (!isClickFinished && isCtrl) { if (vars.multiSelectListItemArr.includes(clickedListItem)) { vars.multiSelectListItemArr = vars.multiSelectListItemArr.filter(item => item !== clickedListItem); clickedListItem.classList.remove('selected'); } else { vars.multiSelectListItemArr.push(clickedListItem); clickedListItem.classList.add('selected'); } vars.lastListItem = clickedListItem; isClickFinished = true; resetViewer(); } if (!isClickFinished) { // --- ์ผ๋ฐ˜ ํด๋ฆญ (๊ธฐ์กด ์„ ํƒ ์ œ๊ฑฐ ํ›„ ๋‹จ์ผ ์„ ํƒ + ๋™์ž‘ ์‹คํ–‰) --- vars.multiSelectListItemArr = []; document.querySelectorAll('.archive-main .list-container .list-body .list-item').forEach((elem) => { elem.classList.remove('selected'); }); clickedListItem.classList.add('selected'); vars.lastListItem = clickedListItem; if (!isCtrl && !isShift) { vars.lastSelectTarget = clickedListItem; let res = await axios.get(`${vars.path_name}/getMemoInfo`, { params: { userInfoString: vars.userInfoString, resourcePath , dataId } }); let memo = res.data.result.memo; setTimeout(() => { renderMemo(memo, dataId); }, 100); // ์ •๋ณด์˜์—ญ ํ‘œ์‹œ // document.querySelector('.archive-main .archive-main-right .viewer-container .info-wrap').classList.add('open'); // document.querySelector('.archive-main .archive-main-right .viewer-container .info-wrap').classList.remove('close'); vars.viewerConnectingTime = vars.viewerConnectingTimeValue; if (value.isSupported == false || (value.needConvert == true && value.isConverted == false)) { // ๋ฏธ์ง€์› ํŒŒ์ผ์ธ ๊ฒฝ์šฐ -> value.isSupported == false // ๋ณ€ํ™˜ ํ•„์š” ํŒŒ์ผ์ธ ๊ฒฝ์šฐ -> value.needConvert == true && value.isConverted == false (๋ณ€ํ™˜ํ•ด์•ผ๋˜์ง€๋งŒ ์•„์ง ๋ณ€ํ™˜ ์•ˆํ•œ ์ƒํƒœ) // ๋ทฐ์–ด ํ”„๋กœ๊ทธ๋ ˆ์Šค ํ‘œ์‹œ ์‹œ๊ฐ„ 0์œผ๋กœ ์„ค์ • vars.viewerConnectingTime = 0; } renderViewer(resourcePath, dataId); if (target === convertBtn && state.classList.contains('convert')) { convertPdf(resourcePath, dataId); } } else { } changeListItemStyle(clickedListItem, '๋ฆฌ์ŠคํŠธ ์•„์ดํ…œ ํด๋ฆญ'); } await syncGroupStyle(); }); }) parent.appendChild(docFragment); if (vars.lastSelectTarget && vars.lastSelectTarget.classList.contains('list-item')) { let dataId = vars.lastSelectTarget.dataset.id; let item = document.querySelector(`.list-item[data-id="${dataId}"]`); if (item) { changeListItemStyle(item, '๋ฆฌ์ŠคํŠธ ์•„์ดํ…œ ์ƒ์„ฑ'); targetFocus(item, 'instant'); } } } async function createListOrder(data, isSub, subCategory) { let entries = sortData(data); entries.forEach(async (entry, idx) => { let obj = {}; let key = entry[0]; let value = entry[1]; let dataId = value.dataId; // ํŒŒ์ผ resourcePath ๋งจ ๋งˆ์ง€๋ง‰์— / ๋ถ™์–ด์žˆ์œผ๋ฉด ์ œ๊ฑฐ let resourcePathSplit = value.resourcePath.split('/'); if (resourcePathSplit[resourcePathSplit.length-1] == '') resourcePathSplit.pop(); let resourcePath = resourcePathSplit.join('/'); obj.name = key; if (isSub) obj.name = `${value.mainFileName}___${key}`; obj.dataId = dataId; // obj.author = (value.authorNm) ? value.authorNm : value.userNm;; // obj.uploader = (value.userNm) ? value.userNm : '-'; // let date = new Date(value.createDate); // obj.createDate = (value.createDate) ? `${changeDateFormat(date.toLocaleDateString('ko-KR'))} ${changeTimeFormat(date.toLocaleTimeString('en-US', {hour12: false}))}` : '-'; // obj.size = formatBytes(value.size); // obj.isSub = isSub; // obj.subCategory = subCategory; vars.listOrder.push(obj); subCategoryList.forEach(async (ele) => { let sub = getDataFromTreeObject(`${resourcePath}_${ele}`, 'folder', vars.allTreeObject).data; if (sub) { await createListOrder(sub.child.file, true, ele); } }) }) } async function createGridItems(parent, data) { vars.curSortCol = document.querySelector('input[type="radio"][name="category"]:checked').value; vars.curSortOrder = document.querySelector('input[type="radio"][name="sort"]:checked').value; //// ์ธ๋„ค์ผ ๋ชจ๋“œ์—์„œ vars.curSortCol์ด none(๋ผ๋ฒจ ์ˆจ๊น€)์œผ๋กœ ์ €์žฅ๋œ ์ฑ„ ๋ฆฌ์ŠคํŠธ ๋ชจ๋“œ๋กœ ๋ฐ”๊พผ ๋’ค //// ๋ฐ”๋กœ ํŒŒ์ผ๋ช… ์ •๋ ฌ์„ ํ•˜๋ฉด ๋ฌด์‹œ๋˜๋Š” ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธฐ๊ธฐ ๋•Œ๋ฌธ์— vars.curSortCol์ด none์ธ ๊ฒฝ์šฐ name์œผ๋กœ ๊ฐ•์ œ ์ €์žฅ if (vars.curSortCol == 'none') vars.curSortCol = 'name'; let docFragment = document.createDocumentFragment(); let entries = Object.entries(data); // let imageExtArr = ['jpg', 'jpeg', 'png']; let videoExtArr = ['mp4', 'mov', 'webm']; let currentTreeItem = vars.lastMainTreeItem; for (let i = 0; i < entries.length; i++) { let entry = entries[i]; let key = entry[0]; let value = entry[1]; let ext = (value.ext).toLowerCase(); // ํŒŒ์ผ resourcePath ๋งจ ๋งˆ์ง€๋ง‰์— / ๋ถ™์–ด์žˆ์œผ๋ฉด ์ œ๊ฑฐ let resourcePathSplit = value.resourcePath.split('/'); if (resourcePathSplit[resourcePathSplit.length-1] == '') resourcePathSplit.pop(); let resourcePath = resourcePathSplit.join('/'); let dataId = value.dataId; let gridItem = document.createElement('div'); gridItem.classList.add('list-item'); gridItem.classList.add('grid-item'); gridItem.classList.add(`depth${value.depth}`); gridItem.classList.add('file'); gridItem.dataset.resourcePath = resourcePath; gridItem.dataset.id = dataId; gridItem.dataset.size = value.size; gridItem.dataset.mainFileName = value.mainFileName; // ํ™•์žฅ์ž๊ฐ€ ์œ ํšจํ•œ ๊ฒฝ์šฐ ํด๋ž˜์Šค์— ext ์ถ”๊ฐ€ if (isValidExt(ext)) gridItem.classList.add(ext); // ๋งˆ์ง€๋ง‰์œผ๋กœ ์„ ํƒํ•œ ๋ฆฌ์ŠคํŠธ ์•„์ดํ…œ์— ๊ทธ๋ฃน์ƒํƒœ ํด๋ž˜์Šค ์ถ”๊ฐ€ let wrap = document.createElement('div'); wrap.classList.add('wrap'); // ๋™์˜์ƒ ํ‘œ์‹œ ์•„์ด์ฝ˜ let play = document.createElement('div'); play.classList.add('play'); let playImage = document.createElement('div'); playImage.classList.add('image'); play.appendChild(playImage); // ๊ทธ๋ฆฌ๋“œ ์•„์ดํ…œ ์„ ํƒ๋์„ ๋•Œ ๊ฐ•์กฐํ‘œ์‹œ์šฉ div let highlight = document.createElement('div'); highlight.classList.add('highlight'); // ์ถ”๊ฐ€ ํŒŒ์ผ์ผ ๋•Œ(value.depth == 5) ์ถ”๊ฐ€ ํŒŒ์ผ ์ข…๋ฅ˜ ๋ฑƒ์ง€ ์ถ”๊ฐ€ if (value.depth == 5) { gridItem.classList.add('sub-list-item'); gridItem.classList.add(value.subCategory); let subSign = document.createElement('div'); subSign.classList.add('sub-sign'); let subSignText = document.createElement('div'); subSignText.classList.add('text'); subSignText.classList.add('ft-14'); subSign.classList.add(value.subCategory); subSignText.innerText = subCategoryData[value.subCategory].korean; subSign.appendChild(subSignText); wrap.appendChild(subSign); } else { gridItem.classList.add('main-list-item'); } // ์œ„์น˜ ์œ ๋ฌด ์•„์ด์ฝ˜ ๋ฐ ์œ„์น˜ ํ…์ŠคํŠธ ์ €์žฅ let gpsData = document.createElement('div'); gpsData.classList.add('gps-data'); gpsData.classList.add('text-wrap'); let gpsDataWrap = document.createElement('div'); gpsDataWrap.classList.add('gps-data-wrap'); let gpsDataTooltip = document.createElement('div'); gpsDataTooltip.classList.add('tooltip'); gpsDataTooltip.classList.add('ft-14'); if (value.lon && value.lat) { gpsData.classList.add('gps-data-yes'); gpsDataTooltip.innerHTML = '์œ„์น˜์žˆ์Œ'; } else { gpsData.classList.add('gps-data-no'); gpsDataTooltip.innerHTML = '์œ„์น˜์—†์Œ'; } let gpsDataImage = document.createElement('div'); gpsDataImage.classList.add('image'); let gpsDataText = document.createElement('div'); gpsDataText.classList.add('text'); gpsDataText.innerHTML = `๊ฒฝ๋„: ${(value.lon) ? value.lon : '์—†์Œ'} / ์œ„๋„: ${(value.lat) ? value.lat : '์—†์Œ'}`; gpsDataText.style.display = 'none'; gpsDataWrap.appendChild(gpsDataTooltip); gpsDataWrap.appendChild(gpsDataImage); gpsDataWrap.appendChild(gpsDataText); gpsData.appendChild(gpsDataWrap); // ์ธ๋„ค์ผ // let extType; // if (imageExtArr.includes(ext)) extType = 'img'; // if (videoExtArr.includes(ext)) extType = 'video'; // let defaultThumbnail = `/main/img/archive/file_extension/${extType}.svg`; // let defaultThumbnail = `/main/img/archive/file_extension/${ext}.svg`; // let thumbnail = document.createElement('img'); // thumbnail.classList.add('thumbnail'); // thumbnail.src = defaultThumbnail; // thumbnail.onerror = function() { // this.onerror = null; // ๋ฌดํ•œ๋ฃจํ”„ ๋ฐฉ์ง€ // this.src = defaultThumbnail; // }; let thumbnail = document.createElement('div'); thumbnail.classList.add('thumbnail'); let thumbnailImg = document.createElement('img'); thumbnail.appendChild(thumbnailImg); // ํŒŒ์ผ๋ช… let name = document.createElement('div'); name.classList.add('name'); name.classList.add('thumbnail-title'); name.classList.add('text-wrap'); let nameText = document.createElement('div'); nameText.classList.add('name-text'); nameText.classList.add('text'); nameText.classList.add('ft-14'); nameText.classList.add('ellipsis'); // ๊ทธ๋ฆฌ๋“œ ์•„์ดํ…œ ํŒŒ์ผ๋ช… ์ค„๋ฐ”๊ฟˆ ์ ์šฉ // nameText.classList.add('line-break'); nameText.innerHTML = key; if (key.split('___')[1] && key.split('___')[0] == value.mainFileName) { nameText.innerHTML = key.split('___')[1]; } name.appendChild(nameText); // ๋“ฑ๋ก์ž let uploader = document.createElement('div'); uploader.classList.add('uploader'); uploader.classList.add('thumbnail-title'); uploader.classList.add('text-wrap'); let uploaderText = document.createElement('div'); uploaderText.classList.add('text'); uploaderText.classList.add('ft-14'); uploaderText.innerHTML = '-'; if (value.userNm) uploaderText.innerHTML = value.userNm; // if (value.userNm) uploaderText.innerHTML = value.userNm.split('___')[1]; uploader.appendChild(uploaderText); // ๋“ฑ๋ก์ผ์ž let createDate = document.createElement('div'); createDate.classList.add('create-date'); createDate.classList.add('thumbnail-title'); createDate.classList.add('text-wrap'); let createDateText = document.createElement('div'); createDateText.classList.add('text'); createDateText.classList.add('ft-14'); createDateText.innerHTML = '-'; if (value.createDate) { let date = new Date(value.createDate); // let date = new Date(value.createDate.split('___')[1]); createDateText.innerHTML = `${changeDateFormat(date.toLocaleDateString('ko-KR'))} ${changeTimeFormat(date.toLocaleTimeString('en-US', {hour12: false}))}`; } createDate.appendChild(createDateText); // ์šฉ๋Ÿ‰ let size = document.createElement('div'); size.classList.add('size'); size.classList.add('thumbnail-title'); size.classList.add('text-wrap'); let sizeText = document.createElement('div'); sizeText.classList.add('text'); sizeText.classList.add('ft-14'); sizeText.innerHTML = formatBytes(value.size); // sizeText.innerHTML = formatBytes(value.size.split('___')[1]); if (value.size >= 1073741824) sizeText.classList.add('large'); size.appendChild(sizeText); // ์ž‘์„ฑ์ž let author = document.createElement('div'); author.classList.add('author'); author.classList.add('thumbnail-title'); author.classList.add('text-wrap'); let authorText = document.createElement('div'); authorText.classList.add('text'); authorText.classList.add('ft-14'); authorText.innerHTML = (value.authorNm) ? value.authorNm : value.userNm; author.appendChild(authorText); // name.style.display = 'none'; uploader.style.display = 'none'; createDate.style.display = 'none'; size.style.display = 'none'; author.style.display = 'none'; if (videoExtArr.includes(ext)) wrap.appendChild(play); wrap.appendChild(highlight); wrap.appendChild(gpsData); wrap.appendChild(thumbnail); wrap.appendChild(name); wrap.appendChild(uploader); wrap.appendChild(createDate); wrap.appendChild(size); wrap.appendChild(author); gridItem.appendChild(wrap); docFragment.appendChild(gridItem); // ์ธ๋„ค์ผ์—์„œ ์œ„์น˜์žˆ์Œ/์—†์Œ ๋ฒ„ํŠผ ํด๋ฆญ ์‹œ ์œ„์น˜ ์ˆ˜์ • ๋ชจ๋“œ ์ „ํ™˜ ํ™•์ธ ๋ชจ๋‹ฌ์ฐฝ ํ‘œ์‹œ gpsData.addEventListener('click', async function(e) { vars.lastSelectTarget = gridItem; let toggleParams = { title: '์œ„์น˜ ์ˆ˜์ •', text: 'ํ™•์ธ ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด ์œ„์น˜ ์ˆ˜์ • ๋ชจ๋“œ๋กœ ์ „ํ™˜๋ฉ๋‹ˆ๋‹ค.', type: 'editPosition', }; toggleModal(true, toggleParams); let res = await axios.get(`${vars.path_name}/getMemoInfo`, { params: { userInfoString: vars.userInfoString, resourcePath, dataId } }); let memo = res.data.result.memo; setTimeout(() => { renderMemo(memo, dataId); }, 100); // ์ •๋ณด์˜์—ญ ์ˆจ๊น€ // document.querySelector('.archive-main .archive-main-right .viewer-container .info-wrap').classList.remove('open'); // document.querySelector('.archive-main .archive-main-right .viewer-container .info-wrap').classList.add('close'); vars.viewerConnectingTime = vars.viewerConnectingTimeValue; if (value.isSupported == false || (value.needConvert == true && value.isConverted == false)) { // ๋ฏธ์ง€์› ํŒŒ์ผ์ธ ๊ฒฝ์šฐ -> value.isSupported == false // ๋ณ€ํ™˜ ํ•„์š” ํŒŒ์ผ์ธ ๊ฒฝ์šฐ -> value.needConvert == true && value.isConverted == false (๋ณ€ํ™˜ํ•ด์•ผ๋˜์ง€๋งŒ ์•„์ง ๋ณ€ํ™˜ ์•ˆํ•œ ์ƒํƒœ) // ๋ทฐ์–ด ํ”„๋กœ๊ทธ๋ ˆ์Šค ํ‘œ์‹œ ์‹œ๊ฐ„ 0์œผ๋กœ ์„ค์ • vars.viewerConnectingTime = 0; } renderViewer(resourcePath, dataId); }) gridItem.addEventListener('dblclick', async (e) => { if (e.target.classList.contains('gps-data')) return; openNewWindowViewer(); }) gridItem.addEventListener('click', async (e) => { // ์œ„์น˜์žˆ์Œ/์—†์Œ ๋ฒ„ํŠผ ํด๋ฆญํ•˜๋ฉด ์œ„์น˜ ์ˆ˜์ • ๋ชจ๋“œ ์ „ํ™˜ ํ™•์ธ ๋ชจ๋‹ฌ์ฐฝ ํ‘œ์‹œ๋กœ ์—ฐ๊ฒฐ๋˜์–ด์•ผ ํ•˜๋ฏ€๋กœ ์—ฌ๊ธฐ์„œ๋Š” ๋ฆฌํ„ด if (e.target.classList.contains('gps-data')) return; let isCtrl = e.ctrlKey; let isShift = e.shiftKey; let target = e.target; // let resourcePath = value.resourcePath; // ์ขŒํด๋ฆญ์ด ์•„๋‹Œ ๊ฒฝ์šฐ ๋ฌด์‹œ if (e.button !== 0) return; let clickedListItem = target.closest('.list-item'); if (!clickedListItem) return; if (vars.lastHeaderBtn) targetFocus(vars.lastHeaderBtn); if (vars.lastMainTreeItem) targetFocus(vars.lastMainTreeItem); //// non-selected: ๊ทธ๋ฆฌ๋“œ ๋ชจ๋“œ์—์„œ ์„ ํƒ๋˜์ง€ ์•Š์€ ์•„์ดํ…œ์€ thumbnail์˜ opacity๋ฅผ 0.5๋กœ ์„ค์ • //// selected: ๊ทธ๋ฆฌ๋„ ๋ชจ๋“œ์—์„œ ์„ ํƒ๋œ ์•„์ดํ…œ์€ thumbnail์˜ opacity๋ฅผ 1๋กœ ์„ค์ • let allItems = [...document.querySelectorAll('.archive-main .list-container .list-body .list-item')]; allItems.forEach(item => { if (!item.classList.contains('selected')) item.classList.add('non-selected'); }); let clickedIndex = allItems.indexOf(clickedListItem); let isClickFinished = false; // --- Ctrl + Shift --- if (!isClickFinished && isCtrl && isShift) { let anchorIndex = allItems.indexOf(vars.lastListItem); if (anchorIndex == -1) anchorIndex = 0; let [start, end] = [anchorIndex, clickedIndex].sort((a, b) => a - b); for (let i = start; i <= end; i++) { let item = allItems[i]; if (!vars.multiSelectListItemArr.includes(item)) { vars.multiSelectListItemArr.push(item); } item.classList.add('group-style'); item.classList.add('selected'); item.classList.remove('non-selected'); } isClickFinished = true; } // --- Shift only --- if (!isClickFinished && isShift) { let anchorIndex = allItems.indexOf(vars.lastListItem); if (anchorIndex == -1) anchorIndex = 0; // ๊ธฐ์กด ์„ ํƒ ํ•ด์ œ vars.multiSelectListItemArr = []; allItems.forEach(item => { item.classList.remove('selected'); item.classList.add('non-selected'); }); let [start, end] = [anchorIndex, clickedIndex].sort((a, b) => a - b); for (let i = start; i <= end; i++) { let item = allItems[i]; vars.multiSelectListItemArr.push(item); item.classList.add('selected'); item.classList.remove('non-selected'); } //// shift ๋‹ค์ค‘ ์„ ํƒ ํ›„ deleteํ‚ค๋กœ ํœด์ง€ํ†ต์œผ๋กœ ์ด๋™ vars.lastSelectTarget = vars.multiSelectListItemArr[0]; isClickFinished = true; } // --- Ctrl only --- if (!isClickFinished && isCtrl) { if (vars.multiSelectListItemArr.includes(clickedListItem)) { vars.multiSelectListItemArr = vars.multiSelectListItemArr.filter(item => item !== clickedListItem); clickedListItem.classList.remove('selected'); clickedListItem.classList.add('non-selected'); } else { vars.multiSelectListItemArr.push(clickedListItem); clickedListItem.classList.add('selected'); clickedListItem.classList.remove('non-selected'); } vars.lastListItem = clickedListItem; isClickFinished = true; } if (!isClickFinished) { // --- ์ผ๋ฐ˜ ํด๋ฆญ (๊ธฐ์กด ์„ ํƒ ์ œ๊ฑฐ ํ›„ ๋‹จ์ผ ์„ ํƒ + ๋™์ž‘ ์‹คํ–‰) --- vars.multiSelectListItemArr = []; document.querySelectorAll('.archive-main .list-container .list-body .list-item').forEach((elem) => { elem.classList.remove('selected'); elem.classList.add('non-selected'); }); clickedListItem.classList.add('selected'); clickedListItem.classList.remove('non-selected'); vars.lastListItem = clickedListItem; if (!isCtrl && !isShift) { vars.lastSelectTarget = clickedListItem; let res = await axios.get(`${vars.path_name}/getMemoInfo`, { params: { userInfoString: vars.userInfoString, resourcePath, dataId } }); let memo = res.data.result.memo; setTimeout(() => { renderMemo(memo, dataId); }, 100); // ์ •๋ณด์˜์—ญ ์ˆจ๊น€ // document.querySelector('.archive-main .archive-main-right .viewer-container .info-wrap').classList.remove('open'); // document.querySelector('.archive-main .archive-main-right .viewer-container .info-wrap').classList.add('close'); vars.viewerConnectingTime = vars.viewerConnectingTimeValue; if (value.isSupported == false || (value.needConvert == true && value.isConverted == false)) { // ๋ฏธ์ง€์› ํŒŒ์ผ์ธ ๊ฒฝ์šฐ -> value.isSupported == false // ๋ณ€ํ™˜ ํ•„์š” ํŒŒ์ผ์ธ ๊ฒฝ์šฐ -> value.needConvert == true && value.isConverted == false (๋ณ€ํ™˜ํ•ด์•ผ๋˜์ง€๋งŒ ์•„์ง ๋ณ€ํ™˜ ์•ˆํ•œ ์ƒํƒœ) // ๋ทฐ์–ด ํ”„๋กœ๊ทธ๋ ˆ์Šค ํ‘œ์‹œ ์‹œ๊ฐ„ 0์œผ๋กœ ์„ค์ • vars.viewerConnectingTime = 0; } renderViewer(resourcePath, dataId); } else { } changeListItemStyle(clickedListItem, '๊ทธ๋ฆฌ๋“œ ์•„์ดํ…œ ํด๋ฆญ'); } await syncGroupStyle(); }); } parent.appendChild(docFragment); if (vars.lastSelectTarget && vars.lastSelectTarget.classList.contains('list-item')) { let dataId = vars.lastSelectTarget.dataset.id; let item = document.querySelector(`.grid-item[data-id="${dataId}"]`); if (item) { changeListItemStyle(item, '๊ทธ๋ฆฌ๋“œ ์•„์ดํ…œ ์ƒ์„ฑ'); targetFocus(item, 'instant'); } } // ๊ฐค๋Ÿฌ๋ฆฌ ํด๋” ํ—ค๋”์—์„œ ๋ถ„๋ฅ˜ ๋ผ๋””์˜ค๋ฒ„ํŠผ ํด๋ฆญ ์‹œ ์ธ๋„ค์ผ ํƒ€์ดํ‹€์— ํด๋ฆญ๋œ ๋ผ๋””์˜ค๋ฒ„ํŠผ value์— ํ•ด๋‹นํ•˜๋Š” ํ…์ŠคํŠธ ํ‘œ์‹œ if (vars.curSortCol) { document.querySelectorAll('.list-container.grid .list-body .list-item .thumbnail-title').forEach(thumbnailTitle => { thumbnailTitle.style.display = 'none'; }) document.querySelectorAll(`.list-container.grid .list-body .list-item .thumbnail-title.${vars.curSortCol}`).forEach(thumbnailTitle => { thumbnailTitle.style.display = 'flex'; }) } // ์ธ๋„ค์ผ ์˜ค๋ธŒ์ ํŠธํ‚ค๋กœ ์ด๋ฏธ์ง€ ๊ฐ€์ ธ์™€์„œ ํ™”๋ฉด์— ํ‘œ์‹œ for (let i = 0; i < entries.length; i++) { let entry = entries[i]; let value = entry[1]; // ํŒŒ์ผ resourcePath ๋งจ ๋งˆ์ง€๋ง‰์— / ๋ถ™์–ด์žˆ์œผ๋ฉด ์ œ๊ฑฐ let resourcePathSplit = value.resourcePath.split('/'); if (resourcePathSplit[resourcePathSplit.length-1] == '') resourcePathSplit.pop(); let resourcePath = resourcePathSplit.join('/'); let thumbnailKey = value.thumbnailKey; if (thumbnailKey) { // ์ธ๋„ค์ผํ‚ค๊ฐ€ ์žˆ์œผ๋ฉด ๋ฐ”๋กœ ์ธ๋„ค์ผ์— ํ‘œ์‹œ let generateDownloadUrlParams = { objectKey: thumbnailKey, resourcePath: resourcePath, isThumbnail: true } let generateDownloadUrlRes = await axios.post(`${vars.path_name}/generateDownloadUrl`, generateDownloadUrlParams); // grid-item์ด ๋งŒ๋“ค์–ด์ง€๋Š” depth3 ํด๋”์™€ ํ˜„์žฌ ๋ณด๊ณ  ์žˆ๋Š” depth3 ํด๋”๊ฐ€ ๋‹ค๋ฅด๋ฉด ๋ฆฌํ„ด if (currentTreeItem != vars.lastMainTreeItem) return; if (generateDownloadUrlRes.data.message == 'generateDownloadUrl_success') { let presignedUrl = generateDownloadUrlRes.data.url; let thumbnailImg = document.querySelector(`.list-container.grid .grid-item[data-resource-path="${resourcePath}"] .thumbnail img`); if (thumbnailImg) { thumbnailImg.src = presignedUrl; } } } else { // console.log('๊ทธ๋ฆฌ๋“œ ์•„์ดํ…œ ์ƒ์„ฑ ์™„๋ฃŒ / ์ธ๋„ค์ผํ‚ค ์—†์Œ'); let src = '/main/img/archive/file_extension/file.svg'; if (value.ext == 'pdf') src = '/main/img/archive/file_extension/pdf.svg'; if (value.ext == 'hwp') src = '/main/img/archive/file_extension/hwp.svg'; if (value.ext == 'hwpx') src = '/main/img/archive/file_extension/hwp.svg'; if (value.ext == 'doc') src = '/main/img/archive/file_extension/doc.svg'; if (value.ext == 'docx') src = '/main/img/archive/file_extension/doc.svg'; if (value.ext == 'xls') src = '/main/img/archive/file_extension/xls.svg'; if (value.ext == 'xlsx') src = '/main/img/archive/file_extension/xls.svg'; if (value.ext == 'xlsm') src = '/main/img/archive/file_extension/xls.svg'; if (value.ext == 'ppt') src = '/main/img/archive/file_extension/ppt.svg'; if (value.ext == 'pptx') src = '/main/img/archive/file_extension/ppt.svg'; if (value.ext == 'dwg') src = '/main/img/archive/file_extension/dwg.svg'; if (value.ext == 'dxf') src = '/main/img/archive/file_extension/dwg.svg'; if (value.ext == 'grm') src = '/main/img/archive/file_extension/dwg.svg'; if (value.ext == 'mp3') src = '/main/img/archive/file_extension/audio.svg'; if (value.ext == 'wav') src = '/main/img/archive/file_extension/audio.svg'; if (value.ext == 'jpg') src = '/main/img/archive/file_extension/img.svg'; if (value.ext == 'jpeg') src = '/main/img/archive/file_extension/img.svg'; if (value.ext == 'png') src = '/main/img/archive/file_extension/img.svg'; if (value.ext == 'mp4') src = '/main/img/archive/file_extension/video.svg'; if (value.ext == 'webm') src = '/main/img/archive/file_extension/video.svg'; if (value.ext == 'mov') src = '/main/img/archive/file_extension/video.svg'; if (value.ext == 'avi') src = '/main/img/archive/file_extension/video.svg'; if (value.ext == 'mkv') src = '/main/img/archive/file_extension/video.svg'; if (value.ext == 'zip') src = '/main/img/archive/file_extension/zip.svg'; if (value.ext == 'txt') src = '/main/img/archive/file_extension/text.svg'; if (value.ext == 'gsim') src = '/main/img/archive/file_extension/gsim.svg'; if (value.ext == 'ifc') src = '/main/img/archive/file_extension/3d.svg'; let thumbnailImg = document.querySelector(`.list-container.grid .grid-item[data-resource-path="${resourcePath}"] .thumbnail img`); if (thumbnailImg) { thumbnailImg.src = src; thumbnailImg.classList.add('default-image'); // default-image ํด๋ž˜์Šค๊ฐ€ ๋ถ™์œผ๋ฉด css์—์„œ width, height๋ฅผ 70%๋กœ ์„ค์ • } } } } async function createMapItems(data) { // ์ง€๋„ ์ดˆ๊ธฐํ™” initOlMap(); // let imageExtArr = ['jpg', 'jpeg', 'png']; let videoExtArr = ['mp4', 'mov', 'webm']; let currentTreeItem = vars.lastMainTreeItem; // ์˜ค๋ฒ„๋ ˆ์ด ๋ฐ ํ”ผ์ณ๋ฅผ ๋‹ด์•„๋‘๋Š” ๋ฐฐ์—ด let overlayArr = []; let featureArr = []; // ํฌ์ธํŠธ ๋ ˆ์ด์–ด ์„ค์ • let pointSource = new ol.source.Vector(); let pointStyle = new ol.style.Style({ image: new ol.style.Circle({ radius: 8, // ์  ํฌ๊ธฐ(px) fill: new ol.style.Fill({ color: '#fff' }), // ๋‚ด๋ถ€์ƒ‰ stroke: new ol.style.Stroke({ color: '#000', width: 4 }) // ํ…Œ๋‘๋ฆฌ }) }); let pointLayer = new ol.layer.Vector({ source: pointSource, style: pointStyle, zIndex: 11, // ํด๋Ÿฌ์Šคํ„ฐ ๋ ˆ์ด์–ด zIndex๋ฅผ ๋” ํฌ๊ฒŒ ๋‘๋ฉด ์œ„์— ๋ณด์ž„ }); pointLayer.setVisible(false); // pointLayer.setVisible(true); // ์ „์—ญ๋ณ€์ˆ˜์™€ ol ์ง€๋„์— ํฌ์ธํŠธ ๋ ˆ์ด์–ด ์ €์žฅ ๋ฐ ์ถ”๊ฐ€ vars.olPointLayer = pointLayer; ol.map.addLayer(pointLayer); let entries = sortData(data); for (let i = 0; i < entries.length; i++) { let entry = entries[i]; let key = entry[0]; let value = entry[1]; let ext = (value.ext).toLowerCase(); // ํŒŒ์ผ resourcePath ๋งจ ๋งˆ์ง€๋ง‰์— / ๋ถ™์–ด์žˆ์œผ๋ฉด ์ œ๊ฑฐ let resourcePathSplit = value.resourcePath.split('/'); if (resourcePathSplit[resourcePathSplit.length-1] == '') resourcePathSplit.pop(); let resourcePath = resourcePathSplit.join('/'); let dataId = value.dataId; let lon = value.lon; let lat = value.lat; // let height = value.height; //// ๊ฒฝ๋„/์œ„๋„ ์ •๋ณด๊ฐ€ ์žˆ์œผ๋ฉด ์ง€๋„์— ์˜ค๋ฒ„๋ ˆ์ด ํ‘œ์‹œ if (lon && lat) { // ์ง€๋„ ์ค€๋น„์ค‘ ํ”„๋กœ๊ทธ๋ ˆ์Šค let progressData = {}; progressData.fileName = key; progressData.count = entries.length; progressData.idx = i+1; await toggleMapProgress(true, progressData); let mapItem = document.createElement('div'); mapItem.classList.add('list-item'); mapItem.classList.add('map-item'); mapItem.classList.add(`depth${value.depth}`); mapItem.classList.add('file'); mapItem.dataset.resourcePath = resourcePath; mapItem.dataset.id = dataId; mapItem.dataset.size = value.size; mapItem.classList.add('main-list-item'); // ํ™•์žฅ์ž๊ฐ€ ์œ ํšจํ•œ ๊ฒฝ์šฐ ํด๋ž˜์Šค์— ext ์ถ”๊ฐ€ if (isValidExt(ext)) mapItem.classList.add(ext); let wrap = document.createElement('div'); wrap.classList.add('wrap'); // ๋™์˜์ƒ ํ‘œ์‹œ ์•„์ด์ฝ˜ let play = document.createElement('div'); play.classList.add('play'); let playImage = document.createElement('div'); playImage.classList.add('image'); play.appendChild(playImage); // ์œ„์น˜ ํ…์ŠคํŠธ ์ €์žฅ let gpsData = document.createElement('div'); gpsData.classList.add('gps-data'); let gpsDataText = document.createElement('div'); gpsDataText.classList.add('text'); gpsDataText.innerHTML = `๊ฒฝ๋„: ${(value.lon) ? value.lon : '์—†์Œ'} / ์œ„๋„: ${(value.lat) ? value.lat : '์—†์Œ'}`; gpsDataText.style.display = 'none'; gpsData.appendChild(gpsDataText); // ์ธ๋„ค์ผ let thumbnail = document.createElement('img'); thumbnail.classList.add('thumbnail'); thumbnail.classList.add('cover'); // ํŒŒ์ผ๋ช… let name = document.createElement('div'); name.classList.add('name'); name.classList.add('thumbnail-title'); let nameText = document.createElement('div'); nameText.classList.add('name-text'); nameText.classList.add('text'); nameText.classList.add('ft-14'); nameText.classList.add('ellipsis'); // nameText.classList.add('line-break'); nameText.innerHTML = key; name.appendChild(nameText); // ๋“ฑ๋ก์ž let uploader = document.createElement('div'); uploader.classList.add('uploader'); uploader.classList.add('thumbnail-title'); let uploaderText = document.createElement('div'); uploaderText.classList.add('text'); uploaderText.classList.add('ft-14'); uploaderText.innerHTML = '-'; if (value.userNm) uploaderText.innerHTML = value.userNm; uploader.appendChild(uploaderText); // ๋“ฑ๋ก์ผ์ž let createDate = document.createElement('div'); createDate.classList.add('create-date'); createDate.classList.add('thumbnail-title'); let createDateText = document.createElement('div'); createDateText.classList.add('text'); createDateText.classList.add('ft-14'); createDateText.innerHTML = '-'; if (value.createDate) { let date = new Date(value.createDate); createDateText.innerHTML = `${changeDateFormat(date.toLocaleDateString('ko-KR'))} ${changeTimeFormat(date.toLocaleTimeString('en-US', {hour12: false}))}`; } createDate.appendChild(createDateText); // ์šฉ๋Ÿ‰ let size = document.createElement('div'); size.classList.add('size'); size.classList.add('thumbnail-title'); let sizeText = document.createElement('div'); sizeText.classList.add('text'); sizeText.classList.add('ft-14'); sizeText.innerHTML = formatBytes(value.size); if (value.size >= 1073741824) sizeText.classList.add('large'); size.appendChild(sizeText); // ์ž‘์„ฑ์ž let author = document.createElement('div'); author.classList.add('author'); author.classList.add('thumbnail-title'); let authorText = document.createElement('div'); authorText.classList.add('text'); authorText.classList.add('ft-14'); authorText.innerHTML = (value.authorNm) ? value.authorNm : value.userNm; author.appendChild(authorText); name.style.display = 'none'; uploader.style.display = 'none'; createDate.style.display = 'none'; size.style.display = 'none'; author.style.display = 'none'; if (videoExtArr.includes(ext)) wrap.appendChild(play); wrap.appendChild(gpsData); wrap.appendChild(thumbnail); wrap.appendChild(name); wrap.appendChild(uploader); wrap.appendChild(createDate); wrap.appendChild(size); wrap.appendChild(author); mapItem.appendChild(wrap); // mapItem ์ˆจ๊น€ ์ƒํƒœ๋กœ ์ƒ์„ฑ mapItem.style.display = 'none'; mapItem.addEventListener('click', async function(e) { // ๊ฐค๋Ÿฌ๋ฆฌ ํด๋”์—์„œ ์œ„์น˜ ์ˆ˜์ • ๋ชจ๋“œ๊ฐ€ ์‹คํ–‰์ค‘์ธ ๊ฒฝ์šฐ ๋ฆฌํ„ด if (vars.mapMode == 'edit') return; //// ์ปจํŠธ๋กค, ์‰ฌํ”„ํŠธ ์กฐํ•ฉ ํด๋ฆญ ์ด๋ฒคํŠธ ์ถ”๊ฐ€? // ์ด์ „์— ์„ ํƒ๋œ ํด๋Ÿฌ์Šคํ„ฐ ์„ ํƒ ์ƒํƒœ ํ•ด์ œ if (clusterLayer && vars.lastSelectCluster) { vars.lastSelectCluster.set('selected', false); vars.lastSelectCluster.set('clicked', false); vars.lastSelectCluster = null; clusterLayer.changed(); } // clusterListWrap ์ˆจ๊น€ clusterListWrap.style.display = 'none'; let option = { from: '์˜ค๋ฒ„๋ ˆ์ด ํด๋ฆญ' } toggleArchiveMainRight(true, option); let res = await axios.get(`${vars.path_name}/getMemoInfo`, { params: { userInfoString: vars.userInfoString, resourcePath, dataId } }); let memo = res.data.result.memo; setTimeout(() => { renderMemo(memo, dataId); }, 100); // ์ •๋ณด์˜์—ญ ์ˆจ๊น€ // document.querySelector('.archive-main .archive-main-right .viewer-container .info-wrap').classList.remove('open'); // document.querySelector('.archive-main .archive-main-right .viewer-container .info-wrap').classList.add('close'); vars.viewerConnectingTime = vars.viewerConnectingTimeValue; if (value.isSupported == false || (value.needConvert == true && value.isConverted == false)) { // ๋ฏธ์ง€์› ํŒŒ์ผ์ธ ๊ฒฝ์šฐ -> value.isSupported == false // ๋ณ€ํ™˜ ํ•„์š” ํŒŒ์ผ์ธ ๊ฒฝ์šฐ -> value.needConvert == true && value.isConverted == false (๋ณ€ํ™˜ํ•ด์•ผ๋˜์ง€๋งŒ ์•„์ง ๋ณ€ํ™˜ ์•ˆํ•œ ์ƒํƒœ) // ๋ทฐ์–ด ํ”„๋กœ๊ทธ๋ ˆ์Šค ํ‘œ์‹œ ์‹œ๊ฐ„ 0์œผ๋กœ ์„ค์ • vars.viewerConnectingTime = 0; } renderViewer(resourcePath, dataId); vars.lastSelectTarget = mapItem; vars.multiSelectListItemArr = []; changeListItemStyle(e.target); }) let zoom = ol.map.getView().getZoom(); let scale = Math.max(0.5, Math.min(1.5, zoom / 5)); mapItem.style.setProperty('--overlay-scale-transform', `scale(${scale})`); let coord3857 = ol.proj.fromLonLat([lon, lat]); // ์˜ค๋ฒ„๋ ˆ์ด ์ƒ์„ฑ let overlay = new ol.Overlay({ element: mapItem, position: coord3857, positioning: 'bottom-center', stopEvent: false }); // ์ง€๋„์— ์˜ค๋ฒ„๋ ˆ์ด ์ถ”๊ฐ€ ol.map.addOverlay(overlay); // ํ”ผ์ณ ์ƒ์„ฑ let feature = new ol.Feature({ geometry: new ol.geom.Point(coord3857), dataId: dataId }); // ํ”ผ์ณ์— ์˜ค๋ฒ„๋ ˆ์ด ์†์„ฑ ์ถ”๊ฐ€ // -> ํด๋Ÿฌ์Šคํ„ฐ ํด๋ฆญ ์‹œ ํ•ด๋‹น ํด๋Ÿฌ์Šคํ„ฐ์— ํฌํ•จ๋œ ํ”ผ์ณ๋ฅผ ํƒ์ƒ‰ํ•˜๊ณ , // ๊ฐ ํ”ผ์ณ์— ํฌํ•จ๋œ ์˜ค๋ฒ„๋ ˆ์ด ์†์„ฑ์„ ํด๋Ÿฌ์Šคํ„ฐ ๋ฆฌ์ŠคํŠธ ๋ Œ๋”์— ์‚ฌ์šฉ feature.set('overlay', overlay); // ํฌ์ธํŠธ ์†Œ์Šค์— ๊ฐ ํ”ผ์ณ ์ถ”๊ฐ€ pointSource.addFeature(feature); // overlayArr/featureArr์— ๊ฐ๊ฐ ์˜ค๋ฒ„๋ ˆ์ด/ํ”ผ์ณ ์ถ”๊ฐ€ overlayArr.push(overlay); featureArr.push(feature); if (value.thumbnailKey) { let objectKey = value.thumbnailKey; let generateDownloadUrlParams = { objectKey: objectKey, resourcePath: resourcePath, isThumbnail: true } let generateDownloadUrlRes = await axios.post(`${vars.path_name}/generateDownloadUrl`, generateDownloadUrlParams); // map-item์ด ๋งŒ๋“ค์–ด์ง€๋Š” depth3 ํด๋”์™€ ํ˜„์žฌ ๋ณด๊ณ  ์žˆ๋Š” depth3 ํด๋”๊ฐ€ ๋‹ค๋ฅด๋ฉด ๋ฆฌํ„ด if (currentTreeItem != vars.lastMainTreeItem) return; if (generateDownloadUrlRes.data.message == 'generateDownloadUrl_success') { let presignedUrl = generateDownloadUrlRes.data.url; thumbnail.src = presignedUrl; } } else { let src = '/main/img/archive/file_extension/file.svg'; if (value.ext == 'pdf') src = '/main/img/archive/file_extension/pdf.svg'; if (value.ext == 'hwp') src = '/main/img/archive/file_extension/hwp.svg'; if (value.ext == 'hwpx') src = '/main/img/archive/file_extension/hwp.svg'; if (value.ext == 'doc') src = '/main/img/archive/file_extension/doc.svg'; if (value.ext == 'docx') src = '/main/img/archive/file_extension/doc.svg'; if (value.ext == 'xls') src = '/main/img/archive/file_extension/xls.svg'; if (value.ext == 'xlsx') src = '/main/img/archive/file_extension/xls.svg'; if (value.ext == 'xlsm') src = '/main/img/archive/file_extension/xls.svg'; if (value.ext == 'ppt') src = '/main/img/archive/file_extension/ppt.svg'; if (value.ext == 'pptx') src = '/main/img/archive/file_extension/ppt.svg'; if (value.ext == 'dwg') src = '/main/img/archive/file_extension/dwg.svg'; if (value.ext == 'dxf') src = '/main/img/archive/file_extension/dwg.svg'; if (value.ext == 'grm') src = '/main/img/archive/file_extension/dwg.svg'; if (value.ext == 'mp3') src = '/main/img/archive/file_extension/audio.svg'; if (value.ext == 'wav') src = '/main/img/archive/file_extension/audio.svg'; if (value.ext == 'jpg') src = '/main/img/archive/file_extension/img.svg'; if (value.ext == 'jpeg') src = '/main/img/archive/file_extension/img.svg'; if (value.ext == 'png') src = '/main/img/archive/file_extension/img.svg'; if (value.ext == 'mp4') src = '/main/img/archive/file_extension/video.svg'; if (value.ext == 'webm') src = '/main/img/archive/file_extension/video.svg'; if (value.ext == 'mov') src = '/main/img/archive/file_extension/video.svg'; if (value.ext == 'avi') src = '/main/img/archive/file_extension/video.svg'; if (value.ext == 'mkv') src = '/main/img/archive/file_extension/video.svg'; if (value.ext == 'zip') src = '/main/img/archive/file_extension/zip.svg'; if (value.ext == 'txt') src = '/main/img/archive/file_extension/text.svg'; if (value.ext == 'gsim') src = '/main/img/archive/file_extension/gsim.svg'; if (value.ext == 'ifc') src = '/main/img/archive/file_extension/3d.svg'; thumbnail.src = src; } } } // ์•„์นด์ด๋ธŒ ์šฐ์ธก ์˜์—ญ ํ‘œ์‹œ/์ˆจ๊น€ if (vars.lastListItem && document.querySelector(`.map-item[data-id="${vars.lastListItem.dataset.id}"]`) && vars.mapMode == 'normal') { console.log(vars.mapMode); let option = { from: '์ง€๋„ ๋ Œ๋”๋ง - ๋ฏธ๋ฆฌ๋ณด๊ธฐ ํ‘œ์‹œ', } toggleArchiveMainRight(true, option); } else { let option = { from: '์ง€๋„ ๋ Œ๋”๋ง - ๋ฏธ๋ฆฌ๋ณด๊ธฐ ์ˆจ๊น€', } toggleArchiveMainRight(false, option); } if (vars.lastSelectTarget && vars.lastSelectTarget.classList.contains('list-item')) { let dataId = vars.lastSelectTarget.dataset.id; let item = document.querySelector(`.map-item[data-id="${dataId}"]`); if (item) { changeListItemStyle(item); // ๊ฐค๋Ÿฌ๋ฆฌ ํด๋” ์ƒ๋‹จ ๋ผ๋””์˜ค๋ฒ„ํŠผ ๋ณ€๊ฒฝ ์‹œ ๋ทฐ์–ด ์˜์—ญ๋„ ์ƒˆ๋กœ ๊ทธ๋ฆฌ๋ ค๋ฉด renderViewer ์‹คํ–‰ // let resourcePath = vars.lastSelectTarget.dataset.resourcePath; // renderViewer(resourcePath, dataId); } } // ์ง€๋„ ๋ชจ๋“œ ์ „ํ™˜ ์‹œ ๋ชจ๋“  ์˜ค๋ฒ„๋ ˆ์ด์˜ ๋ฒ”์œ„์— ๋งž๊ฒŒ ์นด๋ฉ”๋ผ ์ด๋™ํ•˜๋„๋ก overlayPositionArr ๋ณ€์ˆ˜ ์ƒ์„ฑ let overlayPositionArr = overlayArr.map(overlay => overlay.getPosition()); let extent = new ol.extent.boundingExtent(overlayPositionArr); vars.allOverlayExtent = extent; if (vars.mapMode == 'edit') { let validCoordResult = isValidCoord(); if (validCoordResult == true) { let lonInput = document.querySelector('.edit-mode-ui .coord-input.lon'); let latInput = document.querySelector('.edit-mode-ui .coord-input.lat'); let lon = lonInput.value; let lat = latInput.value; let overlayPosition = ol.proj.fromLonLat([lon, lat]); // ์œ„์น˜ ์ˆ˜์ • ๋ชจ๋“œ ์‹คํ–‰ ์‹œ ๊ฒฝ๋„/์œ„๋„ ์ •๋ณด๊ฐ€ ์žˆ์œผ๋ฉด ํ•ด๋‹น ์œ„์น˜๋กœ ์นด๋ฉ”๋ผ ์ด๋™ํ•˜๋„๋ก overlayPositionArr ๋ณ€์ˆ˜ ๊ฐฑ์‹  overlayPositionArr = [overlayPosition]; // ๋งˆ์ปค ํ‘œ์‹œ if(vars.markerOverlay) { vars.markerOverlay.setPosition(overlayPosition); } } } let overlayFitBtn = document.querySelector('.map-container .control-btn-wrap .overlays-fit-btn'); if (overlayPositionArr.length > 0) { // overlayPositionArr์˜ length๊ฐ€ 1 ์ด์ƒ์ด๋ฉด ์˜ค๋ฒ„๋ ˆ์ด์˜ ๋ฒ”์œ„์— ๋งž๊ฒŒ ์นด๋ฉ”๋ผ ์ด๋™ await fitToOverlayExtent(overlayPositionArr, async () => { // ๋‹ค์Œ ๋กœ์ง ์‹คํ–‰ - ์ง€๋„ ํ”„๋กœ๊ทธ๋ ˆ์Šค ์ข…๋ฃŒ await toggleMapProgress(false); }); let maxZoom; if (overlayPositionArr.length != 1 && !vars.lastListItem) maxZoom = vars.allOverlayVisibleZoom - 1; overlayFitBtn.style.display = 'flex'; overlayFitBtn.addEventListener('click', async() => { let paddingValue = 100; let maxZoom = vars.allOverlayVisibleZoom; if (overlayPositionArr.length != 1 && !vars.lastListItem) maxZoom = vars.allOverlayVisibleZoom - 1; ol.map.getView().fit(vars.allOverlayExtent, { padding: [paddingValue, paddingValue, paddingValue, paddingValue], // duration: 500, // constrainResolution: true, maxZoom: maxZoom }); if (vars.lastSelectCluster) { renderClusterList(vars.lastSelectCluster.get('features'), vars.olClusterLayer); } }) } else { // overlayPositionArr์˜ length๊ฐ€ 0์ด๋ฉด ๋ฐ”๋กœ ์ง€๋„ ํ”„๋กœ๊ทธ๋ ˆ์Šค ์ข…๋ฃŒ await toggleMapProgress(false); overlayFitBtn.style.display = 'none'; } // await toggleMapProgress(false); // ์คŒ ๋ ˆ๋ฒจ์— ๋”ฐ๋ผ ์˜ค๋ฒ„๋ ˆ์ด ํฌ๊ธฐ ์กฐ์ ˆ await scaleOverlaysByZoom(); //// ํด๋Ÿฌ์Šคํ„ฐ ์ฝ”๋“œ let clusterListWrap = document.querySelector('.map-container .cluster-list-wrap'); let rawSource = new ol.source.Vector({ features: featureArr }); let clusterSource = new ol.source.Cluster({ distance: vars.clusterDistance, minDistance: 0, source: rawSource }); // ์ตœ์†Œ ๊ฑฐ๋ฆฌ(minDistance) ๊ณ„์‚ฐ ํ›„ ์ ์šฉ let radius = 20; // circle radius (์Šคํƒ€์ผ์—์„œ ์“ฐ๋Š” ๊ฐ’๊ณผ ๋™์ผ) let strokeWidth = 4; // stroke width let padding = 6; // ์—ฌ์œ  let wantMin = 2 * radius + strokeWidth + padding; // ๋Œ€๋žต 50px clusterSource.setDistance(Math.max(clusterSource.getDistance(), wantMin)); if (clusterSource.setMinDistance) { clusterSource.setMinDistance(wantMin); } clusterSource.refresh(); let clusterStyleCache = { normal: {}, hover: {}, selected: {}, clicked: {} }; let clusterLayer = new ol.layer.Vector({ source: clusterSource, declutter: false, style: (clusterFeature) => { const members = clusterFeature.get('features'); const size = members?.length || 0; if (size <= 1) return null; let selectedId = vars.lastSelectTarget?.dataset?.id; let isSelectedCluster = selectedId && members.some(f => String(f.get('dataId')) === String(selectedId)); let state = 'normal'; if (isSelectedCluster) state = 'selected'; if (clusterFeature.get('hover')) state = 'hover'; if (clusterFeature.get('clicked')) state = 'clicked'; return clusterStyleFor(size, state, clusterStyleCache); }, zIndex: 12, }); // ์ „์—ญ๋ณ€์ˆ˜์™€ ol ์ง€๋„์— ํด๋Ÿฌ์Šคํ„ฐ ๋ ˆ์ด์–ด ์ €์žฅ ๋ฐ ์ถ”๊ฐ€ vars.olClusterLayer = clusterLayer; ol.map.addLayer(clusterLayer); let lastHoveredCluster = null; // ๋งˆ์ง€๋ง‰์œผ๋กœ hover๋œ ํด๋Ÿฌ์Šคํ„ฐ let hoverSeq = 0; // ๋น„๋™๊ธฐ ์‘๋‹ต ์ˆœ์„œ ๋ณดํ˜ธ์šฉ ol.map.on('pointermove', (evt) => { // ๋“œ๋ž˜๊ทธ ์ค‘์ธ ๊ฒฝ์šฐ ๋ฆฌํ„ด (์„ฑ๋Šฅ/๊นœ๋นก์ž„ ๋ฐฉ์ง€) if (evt.dragging) return; // ์œ„์น˜ ์ˆ˜์ • ๋ชจ๋“œ์ธ ๊ฒฝ์šฐ ๋ฆฌํ„ด if (document.querySelector('.list-container .list-body .map-container').classList.contains('edit-mode')) return; // ํด๋Ÿฌ์Šคํ„ฐ ๋ ˆ์ด์–ด๊ฐ€ ์ˆจ๊ฒจ์ง„ ์ƒํƒœ์ธ ๊ฒฝ์šฐ ๋ฆฌํ„ด if (clusterLayer.getVisible() == false) return; const seq = ++hoverSeq; // ํด๋Ÿฌ์Šคํ„ฐ ๋ ˆ์ด์–ด๋งŒ ํžˆํŠธ ๊ฒ€์‚ฌ (๋น„๋™๊ธฐ) clusterLayer.getFeatures(evt.pixel).then((hits) => { if (seq !== hoverSeq) return; // ์ด์ „ pointermove์˜ ์ง€์—ฐ ์‘๋‹ต ๋ฌด์‹œ let cf = null; if (hits && hits.length) { const cand = hits[0]; const members = cand.get('features'); if (members && members.length > 1) cf = cand; // ์ง„์งœ ํด๋Ÿฌ์Šคํ„ฐ๋งŒ hover ๋Œ€์ƒ } // ๊ธฐ์กด hover ํ•ด์ œ if (lastHoveredCluster && lastHoveredCluster !== cf) { lastHoveredCluster.set('hover', false); lastHoveredCluster = null; clusterLayer.changed(); // ์žฌ๋ Œ๋” } // ์ƒˆ hover ์„ค์ • if (cf) { if (lastHoveredCluster !== cf) { cf.set('hover', true); lastHoveredCluster = cf; clusterLayer.changed(); } ol.map.getTargetElement().style.cursor = 'pointer'; } else { ol.map.getTargetElement().style.cursor = 'default'; } }); }); // ๋งต ์˜์—ญ์„ ๋ฒ—์–ด๋‚ฌ์„ ๋•Œ hover ๋ฆฌ์…‹ ol.map.getTargetElement().addEventListener('mouseleave', () => { if (lastHoveredCluster) { lastHoveredCluster.set('hover', false); lastHoveredCluster = null; clusterLayer.changed(); } ol.map.getTargetElement().style.cursor = 'default'; }); // ์ดˆ๊ธฐ 1ํšŒ ๋™๊ธฐํ™” - clusterSource๊ฐ€ ํด๋Ÿฌ์Šคํ„ฐ ํ”ผ์ฒ˜๋ฅผ ๋งŒ๋“  ๋’ค ๊ทธ ํ”„๋ ˆ์ž„์ด ๊ทธ๋ ค์ง„ ๋‹ค์Œ์— ์‹คํ–‰ // clusterSource.refresh(); // ol.map.once('rendercomplete', () => { // syncOverlaysByCluster(overlayArr, clusterSource); // }); let startZoom, endZoom; ol.map.on('movestart', () => { startZoom = ol.map.getView().getZoom(); // vars.olPointLayer.setVisible(true); // ์ง€๋„ ์ด๋™ ๋ฐ ์คŒ ๋ณ€๊ฒฝ ์‹œ์ž‘ํ•  ๋•Œ map-container์— overlay-suspend ํด๋ž˜์Šค ์ถ”๊ฐ€ํ•ด์„œ ์˜ค๋ฒ„๋ ˆ์ด ์ˆจ๊น€ document.querySelector('.map-container').classList.add('overlay-suspend'); }) // ์ด๋™/์คŒ ์ข…๋ฃŒ ์‹œ ๋™๊ธฐํ™” - ๋ Œ๋”๊ฐ€ ๋๋‚œ ๋’ค์— ํ•œ ๋ฒˆ๋งŒ ์‹คํ–‰ ol.map.on('moveend', async (e) => { if (!vars.lastSelectTarget || !vars.lastSelectTarget.classList.contains('map-item')) { // vars.lastSelectTarget์ด ์—†๊ฑฐ๋‚˜ vars.lastSelectTarget์˜ ํด๋ž˜์Šค ๋ฆฌ์ŠคํŠธ์— map-item์ด ์—†๋Š” ๊ฒฝ์šฐ vars.lastSelectCluster = undefined; } endZoom = ol.map.getView().getZoom(); if (endZoom >= vars.allOverlayVisibleZoom) { // ์คŒ ๋ณ€๊ฒฝ ์ข…๋ฃŒ ์‹œ์ ์˜ ์คŒ ๋ ˆ๋ฒจ์ด vars.allOverlayVisibleZoom ์ด์ƒ์ด๋ฉด ํด๋Ÿฌ์Šคํ„ฐ๋ ˆ์ด์–ด ์ˆจ๊ธฐ๊ณ  ํฌ์ธํŠธ ๋ ˆ์ด์–ด ํ‘œ์‹œ vars.olClusterLayer.setVisible(false); vars.olPointLayer.setVisible(true); } else { // ์คŒ ๋ณ€๊ฒฝ ์ข…๋ฃŒ ์‹œ์ ์˜ ์คŒ ๋ ˆ๋ฒจ์ด vars.allOverlayVisibleZoom ๋ณด๋‹ค ์ž‘์œผ๋ฉด ํด๋Ÿฌ์Šคํ„ฐ๋ ˆ์ด์–ด ํ‘œ์‹œํ•˜๊ณ  ํฌ์ธํŠธ ๋ ˆ์ด์–ด ์ˆจ๊น€ vars.olClusterLayer.setVisible(true); vars.olPointLayer.setVisible(false); await requestAnimationFrame(() => { reapplyClickedByLastOverlay(clusterSource, clusterLayer, startZoom, endZoom); }) clusterLayer.changed(); } ol.map.once('rendercomplete', async () => { // vars.lastSelectTarget์ด ์—†์œผ๋ฉด ํด๋Ÿฌ์Šคํ„ฐ ์•„์ดํ…œ ๋ฆฌ์ŠคํŠธ ์ˆจ๊น€ // if (!vars.lastSelectTarget) clusterListWrap.style.display = 'none'; // ํด๋Ÿฌ์Šคํ„ฐ์— ํฌํ•จ๋œ ์˜ค๋ฒ„๋ ˆ์ด๋Š” ์ˆจ๊ธฐ๊ณ  ํฌํ•จ๋˜์ง€ ์•Š์€ ์˜ค๋ฒ„๋ ˆ์ด๋Š” ํ‘œ์‹œ // bufferPx - ์–‘์ˆ˜: ๋ทฐํฌํŠธ ๋ฒ”์œ„ ๋ฐ”๊นฅ๊นŒ์ง€ ์˜ค๋ฒ„๋ ˆ์ด ํ‘œ์‹œ ์˜์—ญ ํ™•์žฅ / ์Œ์ˆ˜: ๋ทฐํฌํŠธ ๋ฒ”์œ„ ์•ˆ์ชฝ์œผ๋กœ ์˜ค๋ฒ„๋ ˆ์ด ํ‘œ์‹œ ์˜์—ญ ์ถ•์†Œ let bufferPx = -50; await syncOverlaysByCluster(overlayArr, clusterSource, bufferPx); clusterLayer.changed(); await requestAnimationFrame(() => { // ์ง€๋„ ์ด๋™ ๋ฐ ์คŒ ๋ณ€๊ฒฝ ์ข…๋ฃŒํ•  ๋•Œ map-container์— overlay-suspend ํด๋ž˜์Šค ์ œ๊ฑฐํ•ด์„œ ์˜ค๋ฒ„๋ ˆ์ด ํ‘œ์‹œ document.querySelector('.map-container').classList.remove('overlay-suspend'); }) }); }); ol.map.on('click', (e) => { // ํด๋ฆญํ•œ ๋Œ€์ƒ์ด ์˜ค๋ฒ„๋ ˆ์ด์ธ ๊ฒฝ์šฐ ๋ฆฌํ„ด if (e.originalEvent?.target.classList.contains('list-item')) return; // ์œ„์น˜ ์ˆ˜์ • ๋ชจ๋“œ์ธ ๊ฒฝ์šฐ ๋ฆฌํ„ด if (document.querySelector('.list-container .list-body .map-container').classList.contains('edit-mode')) return; // ํด๋Ÿฌ์Šคํ„ฐ ๋ ˆ์ด์–ด๊ฐ€ ์ˆจ๊ฒจ์ง„ ์ƒํƒœ์ธ ๊ฒฝ์šฐ ๋ฆฌํ„ด if (clusterLayer.getVisible() == false) return; // ์ด ๋ ˆ์ด์–ด(clusteLayer)์—์„œ๋งŒ ํžˆํŠธ ๊ฒ€์‚ฌ clusterLayer.getFeatures(e.pixel).then(async (clickedFeatures) => { if (!clickedFeatures || !clickedFeatures.length) { // ์•„๋ฌด ๊ฒƒ๋„ ์•ˆ ๋ˆŒ๋ €์œผ๋ฉด ์ด์ „์— ์„ ํƒ๋œ ํด๋Ÿฌ์Šคํ„ฐ ์„ ํƒ ์ƒํƒœ ํ•ด์ œ if (vars.lastSelectCluster) { // vars.lastSelectCluster.set('selected', false); vars.lastSelectCluster.set('clicked', false); vars.lastSelectCluster = null; clusterLayer.changed(); } // ํด๋Ÿฌ์Šคํ„ฐ ์•„์ดํ…œ ๋ฆฌ์ŠคํŠธ ๋‹ซ๊ธฐ clusterListWrap.style.display = 'none'; return; } // ํด๋ฆญ๋œ ๊ฑด(๋ณดํ†ต 1๊ฐœ)์˜ ๋‚ด๋ถ€ ๋ฉค๋ฒ„(์›๋ณธ ํ”ผ์ฒ˜๋“ค) let clusterFeature = clickedFeatures[0]; let items = clusterFeature.get('features'); if (!items || items.length <= 1) { // ๋‹จ๊ฑด์ด๋ฉด ์ด์ „์— ์„ ํƒ๋œ ํด๋Ÿฌ์Šคํ„ฐ ์„ ํƒ ์ƒํƒœ ํ•ด์ œ if (vars.lastSelectCluster) { // vars.lastSelectCluster.set('selected', false); vars.lastSelectCluster.set('clicked', false); vars.lastSelectCluster = null; clusterLayer.changed(); } return; } // ๊ธฐ์กด ์„ ํƒ๋œ ํด๋Ÿฌ์Šคํ„ฐ ์„ ํƒ ์ƒํƒœ ํ•ด์ œ for (let i = 0; i < clusterSource.getFeatures().length; i++) { let feature = clusterSource.getFeatures()[i]; // feature.set('selected', false); feature.set('clicked', false); } // ์ƒˆ๋กœ ์„ ํƒํ•œ ํด๋Ÿฌ์Šคํ„ฐ์— ์„ ํƒ ์ƒํƒœ ์„ค์ • // clusterFeature.set('selected', true); // clusterFeature.set('clicked', true); vars.lastSelectCluster = clusterFeature; // ์Šคํƒ€์ผ ๊ฐฑ์‹  clusterLayer.changed(); // ๊ฐค๋Ÿฌ๋ฆฌ ํด๋”์—์„œ ์œ„์น˜ ์ˆ˜์ • ๋ชจ๋“œ๊ฐ€ ์‹คํ–‰์ค‘์ธ ๊ฒฝ์šฐ ๋ฆฌํ„ด if (vars.mapMode == 'edit') return; // ํด๋Ÿฌ์Šคํ„ฐ ๋ฆฌ์ŠคํŠธ ๋ Œ๋”๋ง await renderClusterList(items, clusterLayer); // ์ƒˆ๋กœ ์„ ํƒํ•œ ํด๋Ÿฌ์Šคํ„ฐ์— ์„ ํƒ ์ƒํƒœ ์„ค์ • // clusterFeature.set('selected', true); clusterFeature.set('clicked', true); vars.lastSelectCluster.set('clicked', true); // ์Šคํƒ€์ผ ๊ฐฑ์‹  clusterLayer.changed(); }); let option = { from: '์ง€๋„ ์˜์—ญ ํด๋ฆญ' } toggleArchiveMainRight(false, option); }); } async function initOlMap() { // ๊ฒฝ๋„/์œ„๋„ ์ž…๋ ฅ๋ž€ let lonInput = document.querySelector('.edit-mode-ui .coord-input.lon'); let latInput = document.querySelector('.edit-mode-ui .coord-input.lat'); // ๊ธฐ์กด ์ง€๋„ ์™„์ „ ์‚ญ์ œ if (ol.map) { ol.map.getOverlays()?.clear(); ol.map.getLayers()?.forEach(l => { const src = l.getSource?.(); // ๋ฒกํ„ฐ๋ผ๋ฉด ๋ฐ์ดํ„ฐ๊นŒ์ง€ ๋น„์šฐ๊ธฐ(ํ•˜๋“œ ํด๋ฆฌ์–ด) if (src && src instanceof ol.source.Vector) src.clear(true); }); ol.map.getLayers()?.clear(); // 3) ํƒ€๊นƒ ํ•ด์ œ(๋งต์ด DOM๊ณผ ์ด๋ฒคํŠธ ์—ฐ๊ฒฐ์„ ๋Š์Œ) ol.map.setTarget(null); // 4) ๊ฐ€๋Šฅํ•˜๋‹ค๋ฉด dispose()๋กœ ๋‚ด๋ถ€ ๋ Œ๋”๋Ÿฌ/๋ฆฌ์Šค๋„ˆ ์™„์ „ ์ •๋ฆฌ if (typeof ol.map.dispose === 'function') { ol.map.dispose(); } document.querySelector('.map-container .ol-viewport')?.remove(); ol.map = undefined; } ol.map = new ol.Map({ target: 'map-container', // ์ง€๋„ ์ƒ์„ฑ ์‹œ ์ผ๋ฐ˜ ์ง€๋„ 1๊ฐœ๋งŒ ๋“ฑ๋ก ํ›„ ์ง€๋„ url ๋ณ€๊ฒฝ ๋ฐฉ์‹ // layers: [vars.baseLayer], // ์ง€๋„ ์ƒ์„ฑ ์‹œ 3๊ฐ€์ง€ ์ง€๋„ ๋ชจ๋‘ ๋“ฑ๋ก ํ›„ ๊ต์ฒด ๋ฐฉ์‹ layers: [vars.roadLayer, vars.satelliteLayer, vars.hybridLayer], view: new ol.View({ projection: 'EPSG:3857', center: ol.proj.fromLonLat([127.8, 35.9]), zoom: 7, maxZoom: 22, constrainResolution: true, smoothResolutionConstraint: true }) }); let olZoom = document.querySelector('.ol-zoom'); let controlBtnWrap = document.querySelector('.list-container.grid .list-wrap.list-body .map-container .control-btn-wrap'); controlBtnWrap.appendChild(olZoom); proj4.defs([ ['EPSG:5185', '+proj=tmerc +lat_0=38 +lon_0=125 +k=1 +x_0=200000 +y_0=600000 +ellps=GRS80 +units=m +no_defs'], ['EPSG:5186', '+proj=tmerc +lat_0=38 +lon_0=127 +k=1 +x_0=200000 +y_0=600000 +ellps=GRS80 +units=m +no_defs'], ['EPSG:5187', '+proj=tmerc +lat_0=38 +lon_0=129 +k=1 +x_0=200000 +y_0=600000 +ellps=GRS80 +units=m +no_defs'], ['EPSG:5188', '+proj=tmerc +lat_0=38 +lon_0=131 +k=1 +x_0=200000 +y_0=600000 +ellps=GRS80 +units=m +no_defs'], ['EPSG:4978', '+proj=geocent +datum=WGS84 +units=m +no_defs'], ['EPSG:4326', '+proj=longlat +datum=WGS84 +no_defs'], ]) ol.proj.proj4.register(proj4); //// pmtiles ํ‘œ์‹œ์šฉ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ vars.layerManager = new OLMultiLayerManager(ol.map); await vars.layerManager.toggleLayer(vars.project_id, 'pmtiles'); let clusterListWrap = document.querySelector('.map-container .cluster-list-wrap'); clusterListWrap.style.display = 'none'; // ํด๋ฆญ ์ง€์  ๋งˆ์ปค ์ƒ์„ฑ let marker = document.createElement('div'); marker.classList.add('marker'); vars.markerOverlay = new ol.Overlay({ element: marker, positioning: 'center-center', stopEvent: false, zIndex: 9999 }); ol.map.addOverlay(vars.markerOverlay); // ์˜คํ”ˆ๋ ˆ์ด์–ด์Šค ์ง€๋„ ๋‹จ์ผ ํด๋ฆญ ์ด๋ฒคํŠธ - ์œ„์น˜ ์ˆ˜์ • ๋ชจ๋“œ์—์„œ ์ง€๋„ ํด๋ฆญ ์‹œ ๊ฒฝ๋„/์œ„๋„ ์ž…๋ ฅ๋ž€์— ํ•ด๋‹น ์œ„์น˜ ์ขŒํ‘œ ์ž…๋ ฅ ol.map.on('singleclick', function (e) { // ๊ฐค๋Ÿฌ๋ฆฌ ํด๋”์—์„œ ์œ„์น˜ ์ˆ˜์ • ๋ชจ๋“œ๊ฐ€ ์‹คํ–‰์ค‘์ธ ๊ฒฝ์šฐ ๋ฆฌํ„ด if (vars.mapMode == 'normal') return; // ํด๋ฆญ ์œ„์น˜ ๊ฒฝ๋„/์œ„๋„๋กœ ๋ณ€ํ™˜ let coord3857 = e.coordinate; let coord4326 = ol.proj.toLonLat(coord3857); let lon = coord4326[0]; let lat = coord4326[1]; lonInput.value = lon; latInput.value = lat; // ํด๋ฆญ ์ง€์  ๋งˆ์ปค ์œ„์น˜ ์—…๋ฐ์ดํŠธ ol.map.addOverlay(vars.markerOverlay); vars.markerOverlay.setPosition(coord3857); }) // js ์ง€๋„ ์˜์—ญ ํด๋ฆญ ์ด๋ฒคํŠธ - ์ง€๋„ ์˜์—ญ ํด๋ฆญ ์‹œ ์„ ํƒ๋œ ๋ฆฌ์ŠคํŠธ ์•„์ดํ…œ ๋ฐ ๋ทฐ์–ด ์ดˆ๊ธฐํ™” ol.map.addEventListener('click', function(e) { if (vars.mapMode == 'edit') return; vars.lastSelectTarget = undefined; vars.lastListItem = undefined; vars.multiSelectListItemArr = []; document.querySelectorAll('.archive-main .list-container .list-body .list-item').forEach((elem) => { elem.classList.remove('selected'); elem.classList.remove('group-style'); }); resetViewer(); toggleArchiveMainRight(false); }) // ์˜คํ”ˆ๋ ˆ์ด์–ด์Šค ์ง€๋„ viewport์—์„œ ํœ  ์ด๋ฒคํŠธ ๋ฐœ์ƒํ•  ๋•Œ let viewport = ol.map.getViewport(); viewport.addEventListener('wheel', function() { // ์„ ํƒ๋œ map-item์ด ์žˆ๋Š” ๊ฒฝ์šฐ ๋ฆฌํ„ด if (vars.lastListItem) return; // ์„ ํƒ๋œ map-item์ด ์—†๋Š” ๊ฒฝ์šฐ ํด๋Ÿฌ์Šคํ„ฐ ๋ฆฌ์ŠคํŠธ ์ˆจ๊น€ document.querySelector('.map-container .cluster-list-wrap').style.display = 'none'; }) // ๊ฒฝ๋„/์œ„๋„ ์ž…๋ ฅ๋ž€์— '์—†์Œ' ํ…์ŠคํŠธ๋กœ ํ‘œ์‹œ๋œ ๊ฒฝ์šฐ ์ž…๋ ฅ๋ž€ ํด๋ฆญํ•˜๋ฉด ์ดˆ๊ธฐํ™” lonInput.addEventListener('click', function(e) { if (e.target.value == '์—†์Œ') e.target.value = ''; }) latInput.addEventListener('click', function(e) { if (e.target.value == '์—†์Œ') e.target.value = ''; }) // ๊ฒฝ๋„/์œ„๋„ ์ž…๋ ฅ๋ž€ ์ˆ˜์ •ํ•˜๋ฉด ๋งˆ์ปค ์œ„์น˜ ์—…๋ฐ์ดํŠธ ๋ฐ ๋งˆ์ปค ์œ„์น˜๋กœ ํ™”๋ฉด ์ด๋™ lonInput.addEventListener('input', function(e) { let result = checkCoordInputValue(e.target.value, 'lon'); if (e.target.value !== result) e.target.value = result; if (result == '') e.target.value = '์—†์Œ'; ol.map.removeOverlay(vars.markerOverlay); updateMarker(); }) latInput.addEventListener('input', function(e) { let result = checkCoordInputValue(e.target.value, 'lat'); if (e.target.value !== result) e.target.value = result; if (result == '') e.target.value = '์—†์Œ'; ol.map.removeOverlay(vars.markerOverlay); updateMarker(); }) // ์œ„์น˜ ๋ณด๊ธฐ ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅผ ๋•Œ ๊ฒฝ๋„/์œ„๋„ ๊ฐ’์ด ์ œ๋Œ€๋กœ ์ž…๋ ฅ๋˜์–ด ์žˆ์œผ๋ฉด ๋งˆ์ปค ์œ„์น˜๋กœ ํ™”๋ฉด ์ด๋™ let focusBtn = document.querySelector('.edit-mode-ui .focus-btn'); focusBtn.addEventListener('click', function() { let validCoordResult = isValidCoord(); if (validCoordResult == true) { updateMarker(); } else { let toggleParams = { text: '๊ฒฝ๋„/์œ„๋„ ๊ฐ’์„ ํ™•์ธํ•ด์ฃผ์„ธ์š”.
๊ฒฝ๋„ ๋ฒ”์œ„: -180 ~ 180
์œ„๋„ ๋ฒ”์œ„: -90 ~ 90
', type: 'alertModal', }; toggleModal(true, toggleParams); } }) // ์ €์žฅ ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅผ ๋•Œ ๊ฒฝ๋„/์œ„๋„ ๊ฐ’์ด ์ œ๋Œ€๋กœ ์ž…๋ ฅ๋˜์–ด ์žˆ์œผ๋ฉด db์— ๊ฒฝ๋„/์œ„๋„ ๊ฐ’ ์ €์žฅ let saveBtn = document.querySelector('.edit-mode-ui .save-btn'); saveBtn.addEventListener('click', async function() { let validCoordResult = isValidCoord(); if (validCoordResult == true) { let dataId = document.querySelector('.edit-mode-ui .info-wrap .wrap').dataset.id; let editPositionParams = { dataId: dataId, lon: lonInput.value, lat: latInput.value, }; let editPositionResult = await axios.post(`${vars.path_name}/editPosition`, { params: editPositionParams }); if (editPositionResult.data.message == 'editPosition_success') { // TreeObject ์—…๋ฐ์ดํŠธ let resourcePath = document.querySelector(`.edit-mode-ui .info-wrap .wrap`).dataset.resourcePath; await preparePageRendering({ scope: 'updateTreeObject', resourcePath: resourcePath.substring(0, resourcePath.lastIndexOf('/')), pushState: false }); // ํŒŒ์ผ ์˜์—ญ ์žฌ๋ Œ๋”๋ง document.querySelector(`.control-box .file-area-mode-btn.${vars.lastFileAreaMode}`).click(); // ๋ทฐ์–ด ์žฌ๋ Œ๋”๋งํ•˜์—ฌ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ์—…๋ฐ์ดํŠธ setTimeout(async() => { if (vars.lastListItem) { let updateResourcePath = vars.lastListItem.dataset.resourcePath; let updatedDataId = vars.lastListItem.dataset.id; await renderViewer(updateResourcePath, updatedDataId, false); } }, 300); } else { // ๊ฒฝ๋„/์œ„๋„ ๊ฐ’์— '์—†์Œ'์ด ์ž…๋ ฅ๋˜์–ด ์žˆ์œผ๋ฉด db์— null๋กœ ์ €์žฅ if (lonInput.value == '์—†์Œ' && latInput.value == '์—†์Œ') { let editPositionParams = { dataId: document.querySelector('.edit-mode-ui .info-wrap .wrap').dataset.id, lon: null, lat: null, height: null, }; let editPositionResult = await axios.post(`${vars.path_name}/editPosition`, { params: editPositionParams }); if (editPositionResult.data.message == 'editPosition_success') { document.querySelector(`.control-box .file-area-mode-btn.${vars.lastFileAreaMode}`).click(); } } else { let toggleParams = { text: '๊ฒฝ๋„/์œ„๋„ ๊ฐ’์„ ํ™•์ธํ•ด์ฃผ์„ธ์š”.
๊ฒฝ๋„ ๋ฒ”์œ„: -180 ~ 180
์œ„๋„ ๋ฒ”์œ„: -90 ~ 90
', type: 'alertModal', }; toggleModal(true, toggleParams); } } } }) // ์œ„์น˜ ์‚ญ์ œ ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด ๋ชจ๋‹ฌ ํ‘œ์‹œ let deleteBtn = document.querySelector('.edit-mode-ui .delete-btn'); deleteBtn.addEventListener('click', function() { let toggleParams = { title: '์œ„์น˜ ์‚ญ์ œ', text: 'ํ™•์ธ ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด ์œ„์น˜๊ฐ€ ์‚ญ์ œ๋ฉ๋‹ˆ๋‹ค.', type: 'deletePosition', }; toggleModal(true, toggleParams); }) // ์ทจ์†Œ ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด ๊ทธ๋ฆฌ๋“œ ๋ชจ๋“œ๋กœ ์ „ํ™˜ let cancelBtn = document.querySelector('.edit-mode-ui .cancel-btn'); cancelBtn.addEventListener('click', function() { document.querySelector(`.control-box .file-area-mode-btn.${vars.lastFileAreaMode}`).click(); }) } /// 251104 ๋ฐ•์ง€์€ ol ์†Œ์ผ“์ฒ˜๋ฆฌ // // fileAreaMode๊ฐ€ map ์ผ๋•Œ๋Š” ์ƒˆ ํŒŒ์ผ๋งŒ ์ง€๋„์— ์ถ”๊ฐ€ // export async function createNewMapItems(newResourcePathArr) { // let videoExtArr = ['mp4', 'mov', 'webm']; // let currentTreeItem = vars.lastMainTreeItem; // // ์˜ค๋ฒ„๋ ˆ์ด ๋ฐ ํ”ผ์ณ๋ฅผ ๋‹ด์•„๋‘๋Š” ๋ฐฐ์—ด // let overlayArr = []; // let featureArr = []; // //// ๊ธฐ์กด ํฌ์ธํŠธ ๋ ˆ์ด์–ด ๊ฐ€์ ธ์˜ค๊ธฐ ๋˜๋Š” ์ƒ์„ฑ // let pointSource, pointLayer; // if (vars.olPointLayer) { // // ๊ธฐ์กด ๋ ˆ์ด์–ด ์žฌ์‚ฌ์šฉ // pointLayer = vars.olPointLayer; // pointSource = pointLayer.getSource(); // } else { // // ์ƒˆ๋กœ ์ƒ์„ฑ // pointSource = new ol.source.Vector(); // let pointStyle = new ol.style.Style({ // image: new ol.style.Circle({ // radius: 8, // ์  ํฌ๊ธฐ(px) // fill: new ol.style.Fill({ color: '#fff' }), // ๋‚ด๋ถ€์ƒ‰ // stroke: new ol.style.Stroke({ color: '#000', width: 4 }) // ํ…Œ๋‘๋ฆฌ // }) // }); // pointLayer = new ol.layer.Vector({ // source: pointSource, // style: pointStyle, // zIndex: 11, // ํด๋Ÿฌ์Šคํ„ฐ ๋ ˆ์ด์–ด zIndex๋ฅผ ๋” ํฌ๊ฒŒ ๋‘๋ฉด ์œ„์— ๋ณด์ž„ // }); // pointLayer.setVisible(false); // // ์ „์—ญ๋ณ€์ˆ˜์™€ ol ์ง€๋„์— ํฌ์ธํŠธ ๋ ˆ์ด์–ด ์ €์žฅ ๋ฐ ์ถ”๊ฐ€ // vars.olPointLayer = pointLayer; // ol.map.addLayer(pointLayer); // } // // ์ƒˆ๋กœ ์—…๋กœ๋“œ๋œ ํŒŒ์ผ ๋ฐ์ดํ„ฐ๋งŒ ๊ฐ€์ ธ์˜ค๊ธฐ // let newFiles = []; // if (newResourcePathArr) { // for (let path of newResourcePathArr) { // // let fileName = path.split('/').pop(); // let fileName; // if (typeof path === 'object') { // fileName = path.to.split('/').pop(); // } else { // fileName = path.split('/').pop(); // } // // ๋งˆ์ง€๋ง‰์ด ๋นˆ ๋ฌธ์ž์—ด์ด๋ฉด ์ œ๊ฑฐ // if (fileName === '') { // let pathSplit = path.split('/'); // pathSplit.pop(); // fileName = pathSplit.pop(); // } // // if (vars.currentTreeObject.file && vars.currentTreeObject.file[fileName]) { // // newFiles[fileName] = vars.currentTreeObject.file[fileName]; // // } // // newFiles[fileName] = vars.currentTreeObject.file[fileName]; // // let fileName; // // if (typeof path === 'object') { // // fileName = path.to.split('/').pop(); // // } else { // // fileName = path.split('/').pop(); // // } // // if (fileName === '') { // // let pathSplit = path.split('/'); // // pathSplit.pop(); // // fileName = pathSplit.pop(); // // } // // ํ˜„์žฌ ํด๋”์—์„œ ๋จผ์ € ์ฐพ๊ณ , ์—†์œผ๋ฉด ์ „์ฒด ํŠธ๋ฆฌ์—์„œ ์ฐพ๊ธฐ (ํŒŒ์ผ์—…๋กœ๋“œ/ํŒŒ์ผ์ด๋™) // let fileObject = vars.currentTreeObject.file?.[fileName] || findFileInTree(vars.currentTreeObject, fileName); // if (fileObject) newFiles[fileName] = fileObject; // } // } // // ์ƒˆ ํŒŒ์ผ์ด ์—†์œผ๋ฉด ๋ฆฌํ„ด // if (Object.keys(newFiles).length === 0) return; // // ์ƒˆ๋กœ ์ถ”๊ฐ€๋œ dataId ์ถ”์  // let newlyAddedIds = []; // // ์ƒˆ ํŒŒ์ผ์— ๋Œ€ํ•ด์„œ๋งŒ map item ์ƒ์„ฑ // let entries = sortData(newFiles); // for (let i = 0; i= 1073741824) sizeText.classList.add('large'); // size.appendChild(sizeText); // // ์ž‘์„ฑ์ž // let author = document.createElement('div'); // author.classList.add('author'); // author.classList.add('thumbnail-title'); // let authorText = document.createElement('div'); // authorText.classList.add('text'); // authorText.classList.add('ft-14'); // authorText.innerHTML = (value.authorNm) ? value.authorNm : value.userNm; // author.appendChild(authorText); // name.style.display = 'none'; // uploader.style.display = 'none'; // createDate.style.display = 'none'; // size.style.display = 'none'; // author.style.display = 'none'; // if (videoExtArr.includes(ext)) wrap.appendChild(play); // wrap.appendChild(gpsData); // wrap.appendChild(thumbnail); // wrap.appendChild(name); // wrap.appendChild(uploader); // wrap.appendChild(createDate); // wrap.appendChild(size); // wrap.appendChild(author); // mapItem.appendChild(wrap); // // mapItem ์ˆจ๊น€ ์ƒํƒœ๋กœ ์ƒ์„ฑ // mapItem.style.display = 'none'; // mapItem.addEventListener('click', async function(e) { // // ๊ฐค๋Ÿฌ๋ฆฌ ํด๋”์—์„œ ์œ„์น˜ ์ˆ˜์ • ๋ชจ๋“œ๊ฐ€ ์‹คํ–‰์ค‘์ธ ๊ฒฝ์šฐ ๋ฆฌํ„ด // if (vars.mapMode == 'edit') return; // // ์ด์ „์— ์„ ํƒ๋œ ํด๋Ÿฌ์Šคํ„ฐ ์„ ํƒ ์ƒํƒœ ํ•ด์ œ // if (vars.olClusterLayer && vars.lastSelectCluster) { // vars.lastSelectCluster.set('selected', false); // vars.lastSelectCluster.set('clicked', false); // vars.lastSelectCluster = null; // vars.olClusterLayer.changed(); // } // // clusterListWrap ์ˆจ๊น€ // let clusterListWrap = document.querySelector('.map-container .cluster-list-wrap'); // if (clusterListWrap) clusterListWrap.style.display = 'none'; // let option = { // from: '์˜ค๋ฒ„๋ ˆ์ด ํด๋ฆญ' // } // toggleArchiveMainRight(true, option); // let res = await axios.get(`${vars.path_name}/getMemoInfo`, { // params: { userInfoString: vars.userInfoString, resourcePath, dataId } // }); // let memo = res.data.result.memo; // setTimeout(() => { // renderMemo(memo, dataId); // }, 100); // vars.viewerConnectingTime = vars.viewerConnectingTimeValue; // if (value.isSupported == false || (value.needConvert == true && value.isConverted == false)) { // // ๋ฏธ์ง€์› ํŒŒ์ผ์ธ ๊ฒฝ์šฐ -> value.isSupported == false // // ๋ณ€ํ™˜ ํ•„์š” ํŒŒ์ผ์ธ ๊ฒฝ์šฐ -> value.needConvert == true && value.isConverted == false (๋ณ€ํ™˜ํ•ด์•ผ๋˜์ง€๋งŒ ์•„์ง ๋ณ€ํ™˜ ์•ˆํ•œ ์ƒํƒœ) // // ๋ทฐ์–ด ํ”„๋กœ๊ทธ๋ ˆ์Šค ํ‘œ์‹œ ์‹œ๊ฐ„ 0์œผ๋กœ ์„ค์ • // vars.viewerConnectingTime = 0; // } // renderViewer(resourcePath, dataId); // vars.lastSelectTarget = mapItem; // vars.multiSelectListItemArr = []; // changeListItemStyle(e.target); // }) // let zoom = ol.map.getView().getZoom(); // let scale = Math.max(0.5, Math.min(2, zoom / 10)); // mapItem.style.setProperty('--overlay-scale-transform', `scale(${scale})`); // let coord3857 = ol.proj.fromLonLat([lon, lat]); // // ์˜ค๋ฒ„๋ ˆ์ด ์ƒ์„ฑ // let overlay = new ol.Overlay({ // element: mapItem, // position: coord3857, // positioning: 'bottom-center', // stopEvent: false // }); // // ์ง€๋„์— ์˜ค๋ฒ„๋ ˆ์ด ์ถ”๊ฐ€ // ol.map.addOverlay(overlay); // // ํ”ผ์ณ ์ƒ์„ฑ // let feature = new ol.Feature({ // geometry: new ol.geom.Point(coord3857), // dataId: dataId // }); // // ํ”ผ์ณ์— ์˜ค๋ฒ„๋ ˆ์ด ์†์„ฑ ์ถ”๊ฐ€ // // -> ํด๋Ÿฌ์Šคํ„ฐ ํด๋ฆญ ์‹œ ํ•ด๋‹น ํด๋Ÿฌ์Šคํ„ฐ์— ํฌํ•จ๋œ ํ”ผ์ณ๋ฅผ ํƒ์ƒ‰ํ•˜๊ณ , // // ๊ฐ ํ”ผ์ณ์— ํฌํ•จ๋œ ์˜ค๋ฒ„๋ ˆ์ด ์†์„ฑ์„ ํด๋Ÿฌ์Šคํ„ฐ ๋ฆฌ์ŠคํŠธ ๋ Œ๋”์— ์‚ฌ์šฉ // feature.set('overlay', overlay); // // ํฌ์ธํŠธ ์†Œ์Šค์— ํ”ผ์ณ ์ถ”๊ฐ€ // pointSource.addFeature(feature); // // overlayArr/featureArr์— ๊ฐ๊ฐ ์˜ค๋ฒ„๋ ˆ์ด/ํ”ผ์ณ ์ถ”๊ฐ€ // overlayArr.push(overlay); // featureArr.push(feature); // newlyAddedIds.push(dataId); // ์ƒˆ๋กœ ์ถ”๊ฐ€๋œ ID ๊ธฐ๋ก // if (value.thumbnailKey) { // let objectKey = value.thumbnailKey; // let generateDownloadUrlParams = { // objectKey: objectKey, // resourcePath: resourcePath, // isThumbail: true // }; // let generateDownloadUrlRes = await axios.post(`${vars.path_name}/generateDownloadUrl`, generateDownloadUrlParams); // // map-item์ด ๋งŒ๋“ค์–ด์ง€๋Š” depth3 ํด๋”์™€ ํ˜„์žฌ ๋ณด๊ณ  ์žˆ๋Š” depth3 ํด๋”๊ฐ€ ๋‹ค๋ฅด๋ฉด continue // if (currentTreeItem != vars.lastMainTreeItem) continue; // if (generateDownloadUrlRes.data.message == 'generateDownloadUrl_success') { // let presigendUrl = generateDownloadUrlRes.data.url; // thumbnail.src = presigendUrl; // } else { // let src = '/main/img/archive/file_extension/file.svg'; // if (value.ext == 'pdf') src = '/main/img/archive/file_extension/pdf.svg'; // if (value.ext == 'hwp') src = '/main/img/archive/file_extension/hwp.svg'; // if (value.ext == 'hwpx') src = '/main/img/archive/file_extension/hwp.svg'; // if (value.ext == 'doc') src = '/main/img/archive/file_extension/doc.svg'; // if (value.ext == 'docx') src = '/main/img/archive/file_extension/doc.svg'; // if (value.ext == 'xls') src = '/main/img/archive/file_extension/xls.svg'; // if (value.ext == 'xlsx') src = '/main/img/archive/file_extension/xls.svg'; // if (value.ext == 'xlsm') src = '/main/img/archive/file_extension/xls.svg'; // if (value.ext == 'ppt') src = '/main/img/archive/file_extension/ppt.svg'; // if (value.ext == 'pptx') src = '/main/img/archive/file_extension/ppt.svg'; // if (value.ext == 'dwg') src = '/main/img/archive/file_extension/dwg.svg'; // if (value.ext == 'dxf') src = '/main/img/archive/file_extension/dwg.svg'; // if (value.ext == 'grm') src = '/main/img/archive/file_extension/dwg.svg'; // if (value.ext == 'mp3') src = '/main/img/archive/file_extension/audio.svg'; // if (value.ext == 'wav') src = '/main/img/archive/file_extension/audio.svg'; // if (value.ext == 'jpg') src = '/main/img/archive/file_extension/img.svg'; // if (value.ext == 'jpeg') src = '/main/img/archive/file_extension/img.svg'; // if (value.ext == 'png') src = '/main/img/archive/file_extension/img.svg'; // if (value.ext == 'mp4') src = '/main/img/archive/file_extension/video.svg'; // if (value.ext == 'webm') src = '/main/img/archive/file_extension/video.svg'; // if (value.ext == 'mov') src = '/main/img/archive/file_extension/video.svg'; // if (value.ext == 'avi') src = '/main/img/archive/file_extension/video.svg'; // if (value.ext == 'mkv') src = '/main/img/archive/file_extension/video.svg'; // if (value.ext == 'zip') src = '/main/img/archive/file_extension/zip.svg'; // if (value.ext == 'txt') src = '/main/img/archive/file_extension/text.svg'; // if (value.ext == 'gsim') src = '/main/img/archive/file_extension/gsim.svg'; // if (value.ext == 'ifc') src = '/main/img/archive/file_extension/3d.svg'; // thumbnail.src = src; // } // } else { // // thumbnailKey๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ ๊ธฐ๋ณธ ์•„์ด์ฝ˜ // let src = '/main/img/archive/file_extension/file.svg'; // if (value.ext == 'pdf') src = '/main/img/archive/file_extension/pdf.svg'; // if (value.ext == 'hwp' || value.ext == 'hwpx') src = '/main/img/archive/file_extension/hwp.svg'; // if (value.ext == 'doc' || value.ext == 'docx') src = '/main/img/archive/file_extension/doc.svg'; // if (value.ext == 'xls' || value.ext == 'xlsx' || value.ext == 'xlsm') src = '/main/img/archive/file_extension/xls.svg'; // if (value.ext == 'ppt' || value.ext == 'pptx') src = '/main/img/archive/file_extension/ppt.svg'; // if (value.ext == 'dwg' || value.ext == 'dxf' || value.ext == 'grm') src = '/main/img/archive/file_extension/dwg.svg'; // if (value.ext == 'mp3' || value.ext == 'wav') src = '/main/img/archive/file_extension/audio.svg'; // if (value.ext == 'jpg' || value.ext == 'jpeg' || value.ext == 'png') src = '/main/img/archive/file_extension/img.svg'; // if (value.ext == 'mp4' || value.ext == 'webm' || value.ext == 'mov' || value.ext == 'avi' || value.ext == 'mkv') src = '/main/img/archive/file_extension/video.svg'; // if (value.ext == 'zip') src = '/main/img/archive/file_extension/zip.svg'; // if (value.ext == 'txt') src = '/main/img/archive/file_extension/text.svg'; // if (value.ext == 'gsim') src = '/main/img/archive/file_extension/gsim.svg'; // if (value.ext == 'ifc') src = '/main/img/archive/file_extension/3d.svg'; // thumbnail.src = src; // } // } // } // //// ํด๋Ÿฌ์Šคํ„ฐ ๋ ˆ์ด์–ด ์žฌ์ƒ์„ฑ // let clusterListWrap = document.querySelector('.map-container .cluster-list-wrap'); // // 1. ๊ธฐ์กด ํด๋Ÿฌ์Šคํ„ฐ ๋ ˆ์ด์–ด ์ œ๊ฑฐ // if (vars.olClusterLayer) { // ol.map.removeLayer(vars.olClusterLayer); // } // // 2. ์ „์ฒด ํ”ผ์ฒ˜๋กœ ํด๋Ÿฌ์Šคํ„ฐ ์†Œ์Šค ์ƒ์„ฑ (๊ธฐ์กด + ์ƒˆ๋กœ์šด ํ”ผ์ฒ˜) // let allFeatures = pointSource.getFeatures(); // ํฌ์ธํŠธ ์†Œ์Šค์˜ ๋ชจ๋“  ํ”ผ์ฒ˜ ๊ฐ€์ ธ์˜ค๊ธฐ // let rawSource = new ol.source.Vector({ features: allFeatures }); // let clusterSource = new ol.source.Cluster({ // distance: vars.clusterDistance, // minDistance: 0, // source: rawSource // }); // // ์ตœ์†Œ ๊ฑฐ๋ฆฌ(minDistance) ๊ณ„์‚ฐ ํ›„ ์ ์šฉ // let radius = 20; // circle radius (์Šคํƒ€์ผ์—์„œ ์“ฐ๋Š” ๊ฐ’๊ณผ ๋™์ผ) // let strokeWidth = 4; // stroke width // let padding = 6; // ์—ฌ์œ  // let wantMin = 2 * radius + strokeWidth + padding; // ๋Œ€๋žต 50px // clusterSource.setDistance(Math.max(clusterSource.getDistance(), wantMin)); // if (clusterSource.setMinDistance) { // clusterSource.setMinDistance(wantMin); // } // // ํด๋Ÿฌ์Šคํ„ฐ ์†Œ์Šค ๊ฐ•์ œ ๊ฐฑ์‹  ๋ฐ ์™„๋ฃŒ ๋Œ€๊ธฐ // clusterSource.refresh(); // // ํด๋Ÿฌ์Šคํ„ฐ๋ง์ด ์™„๋ฃŒ๋  ๋•Œ๊นŒ์ง€ ๋ช…์‹œ์ ์œผ๋กœ ๋Œ€๊ธฐ // await new Promise(resolve => { // // ํด๋Ÿฌ์Šคํ„ฐ ์†Œ์Šค์˜ ๋ณ€๊ฒฝ ์ด๋ฒคํŠธ๋ฅผ ๊ฐ์ง€ // const onClusterChange = () => { // clusterSource.un('change', onClusterChange); // resolve(); // }; // clusterSource.on('change', onClusterChange); // // ํƒ€์ž„์•„์›ƒ ์„ค์ • (์ตœ๋Œ€ 100ms ๋Œ€๊ธฐ) // setTimeout(resolve, 100); // }); // let clusterStyleCache = { normal: {}, hover: {}, selected: {}, clicked: {} }; // let clusterLayer = new ol.layer.Vector({ // source: clusterSource, // declutter: false, // style: (clusterFeature) => { // const members = clusterFeature.get('features'); // const size = members?.length || 0; // if (size <= 1) return null; // let selectedId = vars.lastSelectTarget?.dataset?.id; // let isSelectedCluster = selectedId && members.some(f => String(f.get('dataId')) === String(selectedId)); // let state = 'normal'; // if (isSelectedCluster) state = 'selected'; // if (clusterFeature.get('hover')) state = 'hover'; // if (clusterFeature.get('clicked')) state = 'clicked'; // return clusterStyleFor(size, state, clusterStyleCache); // } // }); // // 3. ์ƒˆ ํด๋Ÿฌ์Šคํ„ฐ ๋ ˆ์ด์–ด ์ถ”๊ฐ€ // vars.olClusterLayer = clusterLayer; // ol.map.addLayer(clusterLayer); // let lastHoveredCluster = null; // ๋งˆ์ง€๋ง‰์œผ๋กœ hover๋œ ํด๋Ÿฌ์Šคํ„ฐ // let hoverSeq = 0; // ๋น„๋™๊ธฐ ์‘๋‹ต ์ˆœ์„œ ๋ณดํ˜ธ์šฉ // ol.map.on('pointermove', (evt) => { // // ๋“œ๋ž˜๊ทธ ์ค‘์ธ ๊ฒฝ์šฐ ๋ฆฌํ„ด (์„ฑ๋Šฅ/๊นœ๋นก์ž„ ๋ฐฉ์ง€) // if (evt.dragging) return; // // ์œ„์น˜ ์ˆ˜์ • ๋ชจ๋“œ์ธ ๊ฒฝ์šฐ ๋ฆฌํ„ด // if (document.querySelector('.list-container .list-body .map-container').classList.contains('edit-mode')) return; // // ํด๋Ÿฌ์Šคํ„ฐ ๋ ˆ์ด์–ด๊ฐ€ ์ˆจ๊ฒจ์ง„ ์ƒํƒœ์ธ ๊ฒฝ์šฐ ๋ฆฌํ„ด // if (clusterLayer.getVisible() == false) return; // const seq = ++hoverSeq; // // ํด๋Ÿฌ์Šคํ„ฐ ๋ ˆ์ด์–ด๋งŒ ํžˆํŠธ ๊ฒ€์‚ฌ (๋น„๋™๊ธฐ) // clusterLayer.getFeatures(evt.pixel).then((hits) => { // if (seq !== hoverSeq) return; // ์ด์ „ pointermove์˜ ์ง€์—ฐ ์‘๋‹ต ๋ฌด์‹œ // let cf = null; // if (hits && hits.length) { // const cand = hits[0]; // const members = cand.get('features'); // if (members && members.length > 1) cf = cand; // ์ง„์งœ ํด๋Ÿฌ์Šคํ„ฐ๋งŒ hover ๋Œ€์ƒ // } // // ๊ธฐ์กด hover ํ•ด์ œ // if (lastHoveredCluster && lastHoveredCluster !== cf) { // lastHoveredCluster.set('hover', false); // lastHoveredCluster = null; // clusterLayer.changed(); // ์žฌ๋ Œ๋” // } // // ์ƒˆ hover ์„ค์ • // if (cf) { // if (lastHoveredCluster !== cf) { // cf.set('hover', true); // lastHoveredCluster = cf; // clusterLayer.changed(); // } // ol.map.getTargetElement().style.cursor = 'pointer'; // } else { // ol.map.getTargetElement().style.cursor = 'default'; // } // }); // }); // // ๋งต ์˜์—ญ์„ ๋ฒ—์–ด๋‚ฌ์„ ๋•Œ hover ๋ฆฌ์…‹ // ol.map.getTargetElement().addEventListener('mouseleave', () => { // if (lastHoveredCluster) { // lastHoveredCluster.set('hover', false); // lastHoveredCluster = null; // clusterLayer.changed(); // } // ol.map.getTargetElement().style.cursor = 'default'; // }); // let startZoom, endZoom; // ol.map.on('movestart', () => { // startZoom = ol.map.getView().getZoom(); // // ์ง€๋„ ์ด๋™ ๋ฐ ์คŒ ๋ณ€๊ฒฝ ์‹œ์ž‘ํ•  ๋•Œ map-container์— overlay-suspend ํด๋ž˜์Šค ์ถ”๊ฐ€ํ•ด์„œ ์˜ค๋ฒ„๋ ˆ์ด ์ˆจ๊น€ // document.querySelector('.map-container').classList.add('overlay-suspend'); // }) // // ์ด๋™/์คŒ ์ข…๋ฃŒ ์‹œ ๋™๊ธฐํ™” - ๋ Œ๋”๊ฐ€ ๋๋‚œ ๋’ค์— ํ•œ ๋ฒˆ๋งŒ ์‹คํ–‰ // ol.map.on('moveend', async (e) => { // endZoom = ol.map.getView().getZoom(); // if (endZoom >= vars.allOverlayVisibleZoom) { // // ์คŒ ๋ณ€๊ฒฝ ์ข…๋ฃŒ ์‹œ์ ์˜ ์คŒ ๋ ˆ๋ฒจ์ด vars.allOverlayVisibleZoom ์ด์ƒ์ด๋ฉด ํด๋Ÿฌ์Šคํ„ฐ๋ ˆ์ด์–ด ์ˆจ๊ธฐ๊ณ  ํฌ์ธํŠธ ๋ ˆ์ด์–ด ํ‘œ์‹œ // vars.olClusterLayer.setVisible(false); // vars.olPointLayer.setVisible(true); // } else { // // ์คŒ ๋ณ€๊ฒฝ ์ข…๋ฃŒ ์‹œ์ ์˜ ์คŒ ๋ ˆ๋ฒจ์ด vars.allOverlayVisibleZoom ๋ณด๋‹ค ์ž‘์œผ๋ฉด ํด๋Ÿฌ์Šคํ„ฐ๋ ˆ์ด์–ด ํ‘œ์‹œํ•˜๊ณ  ํฌ์ธํŠธ ๋ ˆ์ด์–ด ์ˆจ๊น€ // vars.olClusterLayer.setVisible(true); // vars.olPointLayer.setVisible(false); // await requestAnimationFrame(() => { // reapplyClickedByLastOverlay(clusterSource, clusterLayer, startZoom, endZoom); // }) // clusterLayer.changed(); // } // ol.map.once('rendercomplete', async() => { // // ํด๋Ÿฌ์Šคํ„ฐ์— ํฌํ•จ๋œ ์˜ค๋ฒ„๋ ˆ์ด๋Š” ์ˆจ๊ธฐ๊ณ  ํฌํ•จ๋˜์ง€ ์•Š์€ ์˜ค๋ฒ„๋ ˆ์ด๋Š” ํ‘œ์‹œ // // bufferPx - ์–‘์ˆ˜: ๋ทฐํฌํŠธ ๋ฒ”์œ„ ๋ฐ”๊นฅ๊นŒ์ง€ ์˜ค๋ฒ„๋ ˆ์ด ํ‘œ์‹œ ์˜์—ญ ํ™•์žฅ / ์Œ์ˆ˜: ๋ทฐํฌํŠธ ๋ฒ”์œ„ ์•ˆ์ชฝ์œผ๋กœ ์˜ค๋ฒ„๋ ˆ์ด ํ‘œ์‹œ ์˜์—ญ ์ถ•์†Œ // let bufferPx = -50; // let allOverlays = ol.map.getOverlays().getArray(); // // moveend์—์„œ๋Š” newlyAddedIds๋ฅผ ๋นˆ ๋ฐฐ์—ด๋กœ ์ „๋‹ฌ (๋ชจ๋“  ์˜ค๋ฒ„๋ ˆ์ด๋ฅผ ์ผ๋ฐ˜์ ์œผ๋กœ ์ฒ˜๋ฆฌ) // await syncOverlaysByCluster(allOverlays, clusterSource, bufferPx, []); // clusterLayer.changed(); // await requestAnimationFrame(() => { // // ์ง€๋„ ์ด๋™ ๋ฐ ์คŒ ๋ณ€๊ฒฝ ์ข…๋ฃŒํ•  ๋•Œ map-container์— overlay-suspend ํด๋ž˜์Šค ์ œ๊ฑฐํ•ด์„œ ์˜ค๋ฒ„๋ ˆ์ด ํ‘œ์‹œ // document.querySelector('.map-container').classList.remove('overlay-suspend'); // }) // }) // }) // ol.map.on('click', (e) => { // // ํด๋ฆญํ•œ ๋Œ€์ƒ์ด ์˜ค๋ฒ„๋ ˆ์ด์ธ ๊ฒฝ์šฐ ๋ฆฌํ„ด // if (e.originalEvent?.target.classList.contains('list-item')) return; // // ์œ„์น˜ ์ˆ˜์ • ๋ชจ๋“œ์ธ ๊ฒฝ์šฐ ๋ฆฌํ„ด // if (document.querySelector('.list-container .list-body .map-container').classList.contains('edit-mode')) return; // // ํด๋Ÿฌ์Šคํ„ฐ ๋ ˆ์ด์–ด๊ฐ€ ์ˆจ๊ฒจ์ง„ ์ƒํƒœ์ธ ๊ฒฝ์šฐ ๋ฆฌํ„ด // if (clusterLayer.getVisible() == false) return; // // ์ด ๋ ˆ์ด์–ด(clusteLayer)์—์„œ๋งŒ ํžˆํŠธ ๊ฒ€์‚ฌ // clusterLayer.getFeatures(e.pixel).then(async (clickedFeatures) => { // if (!clickedFeatures || !clickedFeatures.length) { // // ์•„๋ฌด ๊ฒƒ๋„ ์•ˆ ๋ˆŒ๋ €์œผ๋ฉด ์ด์ „์— ์„ ํƒ๋œ ํด๋Ÿฌ์Šคํ„ฐ ์„ ํƒ ์ƒํƒœ ํ•ด์ œ // if (vars.lastSelectCluster) { // // vars.lastSelectCluster.set('selected', false); // vars.lastSelectCluster.set('clicked', false); // vars.lastSelectCluster = null; // clusterLayer.changed(); // } // // ํด๋Ÿฌ์Šคํ„ฐ ์•„์ดํ…œ ๋ฆฌ์ŠคํŠธ ๋‹ซ๊ธฐ // clusterListWrap.style.display = 'none'; // return; // } // // ํด๋ฆญ๋œ ๊ฑด(๋ณดํ†ต 1๊ฐœ)์˜ ๋‚ด๋ถ€ ๋ฉค๋ฒ„(์›๋ณธ ํ”ผ์ฒ˜๋“ค) // let clusterFeature = clickedFeatures[0]; // let items = clusterFeature.get('features'); // if (!items || items.length <= 1) { // // ๋‹จ๊ฑด์ด๋ฉด ์ด์ „์— ์„ ํƒ๋œ ํด๋Ÿฌ์Šคํ„ฐ ์„ ํƒ ์ƒํƒœ ํ•ด์ œ // if (vars.lastSelectCluster) { // // vars.lastSelectCluster.set('selected', false); // vars.lastSelectCluster.set('clicked', false); // vars.lastSelectCluster = null; // clusterLayer.changed(); // } // return; // } // // ๊ธฐ์กด ์„ ํƒ๋œ ํด๋Ÿฌ์Šคํ„ฐ ์„ ํƒ ์ƒํƒœ ํ•ด์ œ // for (let i = 0; i < clusterSource.getFeatures().length; i++) { // let feature = clusterSource.getFeatures()[i]; // feature.set('clicked', false); // } // // ์ƒˆ๋กœ ์„ ํƒํ•œ ํด๋Ÿฌ์Šคํ„ฐ์— ์„ ํƒ ์ƒํƒœ ์„ค์ • // vars.lastSelectCluster = clusterFeature; // // ์Šคํƒ€์ผ ๊ฐฑ์‹  // clusterLayer.changed(); // // ๊ฐค๋Ÿฌ๋ฆฌ ํด๋”์—์„œ ์œ„์น˜ ์ˆ˜์ • ๋ชจ๋“œ๊ฐ€ ์‹คํ–‰์ค‘์ธ ๊ฒฝ์šฐ ๋ฆฌํ„ด // if (vars.mapMode == 'edit') return; // // ํด๋Ÿฌ์Šคํ„ฐ ๋ฆฌ์ŠคํŠธ ๋ Œ๋”๋ง // await renderClusterList(items, clusterLayer); // // ์ƒˆ๋กœ ์„ ํƒํ•œ ํด๋Ÿฌ์Šคํ„ฐ์— ์„ ํƒ ์ƒํƒœ ์„ค์ • // clusterFeature.set('clicked', true); // vars.lastSelectCluster.set('clicked', true); // // ์Šคํƒ€์ผ ๊ฐฑ์‹  // clusterLayer.changed(); // }); // let option = { // from: '์ง€๋„ ์˜์—ญ ํด๋ฆญ' // } // toggleArchiveMainRight(false, option); // }); // // ์•„์นด์ด๋ธŒ ์šฐ์ธก ์˜์—ญ ํ‘œ์‹œ/์ˆจ๊น€ // if (vars.lastListItem && document.querySelector(`.map-item[data-id="${vars.lastListItem.dataset.id}"]`) && vars.mapMode == 'normal') { // let option = { // from: '์ง€๋„ ๋ Œ๋”๋ง -๋ฏธ๋ฆฌ๋ณด๊ธฐ ํ‘œ์‹œ', // } // toggleArchiveMainRight(true, option); // } else { // let option = { // from: '์ง€๋„ ๋ Œ๋”๋ง - ๋ฏธ๋ฆฌ๋ณด๊ธฐ ์ˆจ๊น€', // } // toggleArchiveMainRight(false, option); // } // if (vars.lastSelectTarget && vars.lastSelectTarget.classList.contains('list-item')) { // let dataId = vars.lastSelectTarget.dataset.id; // let item = document.querySelector(`.map-item[data-id="${dataId}"]`); // if (item) { // changeListItemStyle(item); // } // } // // ์ง€๋„ ๋ชจ๋“œ ์ „ํ™˜ ์‹œ ๋ชจ๋“  ์˜ค๋ฒ„๋ ˆ์ด์˜ ๋ฒ”์œ„์— ๋งž๊ฒŒ ์นด๋ฉ”๋ผ ์ด๋™ํ•˜๋„๋ก overlayPositionArr ๋ณ€์ˆ˜ ์ƒ์„ฑ // let overlayPositionArr = overlayArr.map(overlay => overlay.getPosition()); // if (vars.mapMode == 'edit') { // let validCoordResult = isValidCoord(); // if (validCoordResult == true) { // let lonInput = document.querySelector('.edit-mode-ui .coord-input.lon'); // let latInput = document.querySelector('.edit-mode-ui .coord-input.lat'); // let lon = lonInput.value; // let lat = latInput.value; // let overlayPosition = ol.proj.fromLonLat([lon, lat]); // // ์œ„์น˜ ์ˆ˜์ • ๋ชจ๋“œ ์‹คํ–‰ ์‹œ ๊ฒฝ๋„/์œ„๋„ ์ •๋ณด๊ฐ€ ์žˆ์œผ๋ฉด ํ•ด๋‹น ์œ„์น˜๋กœ ์นด๋ฉ”๋ผ ์ด๋™ํ•˜๋„๋ก overlayPositionArr ๋ณ€์ˆ˜ ๊ฐฑ์‹  // overlayPositionArr = [overlayPosition]; // // ๋งˆ์ปค ํ‘œ์‹œ // vars.markerOverlay.setPosition(overlayPosition); // } // } // // ์คŒ ๋ ˆ๋ฒจ์— ๋”ฐ๋ผ ์˜ค๋ฒ„๋ ˆ์ด ํฌ๊ธฐ ์กฐ์ ˆ // await scaleOverlaysByZoom(); // //// ์˜ค๋ฒ„๋ ˆ์ด ๋™๊ธฐํ™” ์‹œ ์ƒˆ๋กœ ์ถ”๊ฐ€๋œ ID ์ „๋‹ฌ // let bufferPx = -50; // // ๋ชจ๋“  ์˜ค๋ฒ„๋ ˆ์ด ๋ฐฐ์—ด ๊ฐ€์ ธ์˜ค๊ธฐ (๊ธฐ์กด + ์‹ ๊ทœ) // let allOverlays = ol.map.getOverlays().getArray(); // // ํด๋Ÿฌ์Šคํ„ฐ ์†Œ์Šค๊ฐ€ ์™„์ „ํžˆ ์ค€๋น„๋  ๋•Œ๊นŒ์ง€ ์ถ”๊ฐ€ ๋Œ€๊ธฐ // await new Promise(resolve => setTimeout(resolve, 50)); // // **์ฆ‰์‹œ ํด๋Ÿฌ์Šคํ„ฐ ์ƒํƒœ ๋ฐ˜์˜ํ•˜์—ฌ ์˜ค๋ฒ„๋ ˆ์ด ๋™๊ธฐํ™”** // await syncOverlaysByCluster(allOverlays, clusterSource, bufferPx, newlyAddedIds); // // ํด๋Ÿฌ์Šคํ„ฐ ๋ ˆ์ด์–ด ๊ฐ•์ œ ๊ฐฑ์‹  // clusterLayer.changed(); // // ํฌ์ธํŠธ ๋ ˆ์ด์–ด๋„ ๊ฐฑ์‹  // pointLayer.changed(); // // requestAnimationFrame์„ ์‚ฌ์šฉํ•˜์—ฌ DOM ์—…๋ฐ์ดํŠธ ๋ณด์žฅ // await new Promise(resolve => { // requestAnimationFrame(() => { // // ์ง€๋„ ๋ Œ๋”๋ง ๊ฐ•์ œ ํŠธ๋ฆฌ๊ฑฐ // ol.map.render(); // // ํ•œ ํ”„๋ ˆ์ž„ ๋” ๋Œ€๊ธฐ ํ›„ ์™„๋ฃŒ // requestAnimationFrame(() => { // document.querySelector('.map-container')?.classList.remove('overlay-suspend'); // resolve(); // }); // }); // }); // } // ์ „์ฒด ํŠธ๋ฆฌ์—์„œ ํŒŒ์ผ ์ฐพ๋Š” ํ•จ์ˆ˜ // function findFileInTree(obj, fileName) { // if (obj.file && obj.file[fileName]) { // return obj.file[fileName] // }; // if (obj.folder) { // for (let key in obj.folder) { // const result = findFileInTree(obj.folder[key], fileName); // if (result) return result; // } // }; // if (obj.child) { // const result = findFileInTree(obj.child, fileName); // if (result) return result; // } // return null; // } function isValidCoord() { let lonInput = document.querySelector('.edit-mode-ui .coord-input.lon'); let latInput = document.querySelector('.edit-mode-ui .coord-input.lat'); let lon = lonInput.value; let lat = latInput.value; let re = /^\s*[+-]?(?:\d+(?:\.\d+)?|\.\d+)\s*$/; let lonCheck = re.test(lon); let latCheck = re.test(lat); if (lonCheck == false || latCheck == false) { return false; } else { return true; } } function updateMarker() { let lonInput = document.querySelector('.edit-mode-ui .coord-input.lon'); let latInput = document.querySelector('.edit-mode-ui .coord-input.lat'); let lon = lonInput.value; let lat = latInput.value; if (lon == '์—†์Œ' || lat == '์—†์Œ') { ol.map.removeOverlay(vars.markerOverlay); return; } let validCoordResult = isValidCoord(); if (validCoordResult == false) return; let coord4326 = ol.proj.fromLonLat([lon, lat]); vars.markerOverlay.setPosition(coord4326); ol.map.addOverlay(vars.markerOverlay); let extent = new ol.extent.boundingExtent([coord4326]); let paddingValue = 100; ol.map.getView().fit(extent, { padding: [paddingValue, paddingValue, paddingValue, paddingValue], constrainResolution: true, // maxZoom: 15 maxZoom: ol.map.getView().getZoom() }); } function checkCoordInputValue(value, type) { // ๊ณต๋ฐฑ ์ œ๊ฑฐ let v = value.replace(/\s+/g, ''); // ํ—ˆ์šฉ ๋ฌธ์ž๋งŒ ๋‚จ๊ธฐ๊ธฐ (์ˆซ์ž/.-) v = v.replace(/[^\d\.\-]/g, ''); // ๋งจ ์•ž์˜ '-'๋งŒ ํ—ˆ์šฉ v = v.replace(/(?!^)-/g, ''); if (v.indexOf('-') > 0) v = v.replace(/-/g, ''); // ์  ํ•˜๋‚˜๋งŒ ํ—ˆ์šฉ const firstDot = v.indexOf('.'); if (firstDot !== -1) { v = v.slice(0, firstDot + 1) + v.slice(firstDot + 1).replace(/\./g, ''); } // ".12" โ†’ "0.12", "-.12" โ†’ "-0.12" if (v.startsWith('.')) v = '0' + v; if (v.startsWith('-.')) v = v.replace('-.', '-0.'); // ์ž…๋ ฅ ์ค‘ ๊ณผ๋„๊ธฐ ์ƒํƒœ๋Š” ๊ทธ๋Œ€๋กœ ํ—ˆ์šฉ (์‚ญ์ œ/์ถ”๊ฐ€ ํŽธ์˜) if (v === '' || v === '-' || v === '0.' || v === '-0.') return v; // ํƒ€์ž…๋ณ„ ๋ฒ”์œ„ ๊ณ„์‚ฐ const maxAbs = type === 'lon' ? 180 : type === 'lat' ? 90 : null; // ์ˆซ์ž๋กœ ํ•ด์„๋˜๋ฉด ๋ฒ”์œ„ ํด๋žจํ”„ const n = Number(v); if (Number.isFinite(n) && maxAbs != null) { const sign = n < 0 ? -1 : 1; const abs = Math.abs(n); if (abs > maxAbs) { v = (sign < 0 ? '-' : '') + String(maxAbs); // ๊ฒฝ๊ณ„๊ฐ’์œผ๋กœ ๊ณ ์ • // ํ•„์š”์‹œ ์†Œ์ˆ˜ 0์ฑ„์šฐ๊ธฐ ๋“ฑ ์ถ”๊ฐ€ ์ฒ˜๋ฆฌ ๊ฐ€๋Šฅ } } return v; } function fitToOverlayExtent(overlayPositionArr, onFitEnd) { let extent = new ol.extent.boundingExtent(overlayPositionArr); let paddingValue = 100; function handlePostRender() { ol.map.un('postrender', handlePostRender); // ํ•œ ๋ฒˆ๋งŒ ์‹คํ–‰๋˜๋„๋ก ์ œ๊ฑฐ if (typeof onFitEnd === 'function') { onFitEnd(); } } ol.map.on('postrender', handlePostRender); // maxZoom ๊ธฐ๋ณธ๊ฐ’์€ ๋ชจ๋“  ์˜ค๋ฒ„๋ ˆ์ด๋ฅผ ํ‘œ์‹œํ•˜๋Š” ์คŒ ๋ ˆ๋ฒจ(vars.allOverlayVisibleZoom)๋กœ ์„ค์ • let maxZoom = vars.allOverlayVisibleZoom; // overlayPositionArr์˜ length๊ฐ€ 1์ด ์•„๋‹ˆ๊ณ , ์„ ํƒ๋˜์–ด ์žˆ๋Š” ํŒŒ์ผ ์•„์ดํ…œ์ด ์—†๋Š” ๊ฒฝ์šฐ // ๋ชจ๋“  ์˜ค๋ฒ„๋ ˆ์ด๋ฅผ ํ‘œ์‹œํ•˜๋Š” ์คŒ ๋ ˆ๋ฒจ(vars.allOverlayVisibleZoom)๋ณด๋‹ค ํ•˜๋‚˜ ์•„๋ž˜ ๋ ˆ๋ฒจ๋กœ ์„ค์ •ํ•ด์„œ ํด๋Ÿฌ์Šคํ„ฐ ํ‘œ์‹œ if (overlayPositionArr.length != 1 && !vars.lastListItem) maxZoom = vars.allOverlayVisibleZoom - 1; ol.map.getView().fit(extent, { padding: [paddingValue, paddingValue, paddingValue, paddingValue], // duration: 500, // constrainResolution: true, maxZoom: maxZoom }); } function toggleMapProgress(state, progressData) { let mapProgress = document.querySelector('.map-progress'); let mapCountname = document.querySelector('.map-progress .count-progress .fileName span'); let mapCountIdx = document.querySelector('.map-progress .count-progress .count .index span'); let mapCountTotal = document.querySelector('.map-progress .count-progress .count .total span'); if (state == false) mapProgress.style.display = 'none'; if (state == true) { mapProgress.style.display = 'flex'; mapCountname.textContent = `${progressData.fileName}`; mapCountIdx.textContent = `${progressData.idx}`; mapCountTotal.textContent = `${progressData.count}`; } } function scaleOverlaysByZoom() { ol.map.getView().on('change:resolution', () => { const zoom = ol.map.getView().getZoom(); const scale = Math.max(0.5, Math.min(2, zoom / 10)); document.querySelectorAll('.map-item').forEach(overlay => { overlay.style.setProperty('--overlay-scale-transform', `scale(${scale})`); overlay.style.transformOrigin = 'bottom center'; }); }); } // size > 1 ํด๋Ÿฌ์Šคํ„ฐ์— ์†ํ•œ feature id ์ง‘ํ•ฉ ๋งŒ๋“ค๊ธฐ function getClusteredIds(clusterSource) { const ids = new Set(); clusterSource.getFeatures().forEach(cf => { const list = cf.get('features'); if (!list || list.length <= 1) return; list.forEach(f => { // ์œ„์—์„œ feature ์ƒ์„ฑ ์‹œ dataId๋ฅผ ๋„ฃ์—ˆ์œผ๋ฏ€๋กœ ๊ทธ ๊ฐ’์„ ์‚ฌ์šฉ const id = f.get('dataId'); if (id != null) ids.add(String(id)); }); }); return ids; } /// 251104 ๋ฐ•์ง€์€ ol ์†Œ์ผ“์ฒ˜๋ฆฌ // async function syncOverlaysByCluster(overlayArr, clusterSource, bufferPx = 0, newlyAddedIds = []) { // ID ๋งค์นญ์œผ๋กœ ์˜ค๋ฒ„๋ ˆ์ด ํ‘œ์‹œ/์ˆจ๊น€ ๋™๊ธฐํ™” async function syncOverlaysByCluster(overlayArr, clusterSource, bufferPx = 0) { // ๋ทฐํฌํŠธ(+๋ฒ„ํผ) extent const extent = getBufferedViewExtent(bufferPx); const inView = (coord) => !extent || (coord && ol.extent.containsCoordinate(extent, coord)); // ํ˜„์žฌ ํด๋Ÿฌ์Šคํ„ฐ ๋ฉค๋ฒ„์…‹ const clustered = getClusteredIds(clusterSource); // Set /// 251104 ๋ฐ•์ง€์€ ol ์†Œ์ผ“์ฒ˜๋ฆฌ // ์ƒˆ๋กœ ์ถ”๊ฐ€๋œ ID๋“ค์„ Set์œผ๋กœ ๋ณ€ํ™˜ (๋น ๋ฅธ ๊ฒ€์ƒ‰) // const newlyAddedSet = new Set(newlyAddedIds.map(id => String(id))); // ์คŒ ์ž„๊ณ„ const zoom = ol.map.getView().getZoom(); // ์˜ค๋ฒ„๋ ˆ์ด DOM ํ† ๊ธ€ for (let ov of overlayArr) { const el = ov.getElement(); if (!el) continue; // map-item์ด ์•„๋‹ˆ๋ฉด ์Šคํ‚ต if (!el.classList.contains('map-item')) continue; const id = el.dataset.id; const pos = ov.getPosition(); const inside = inView(pos); /// 251104 ๋ฐ•์ง€์€ ol ์†Œ์ผ“์ฒ˜๋ฆฌ // ์ƒˆ๋กœ ์ถ”๊ฐ€๋œ ์˜ค๋ฒ„๋ ˆ์ด์ธ์ง€ ํ™•์ธ // const isNewlyAdded = newlyAddedSet.has(String(id)); // ํด๋Ÿฌ์Šคํ„ฐ์— ํฌํ•จ๋˜์—ˆ๋Š”์ง€ ํ™•์ธ const isInCluster = clustered.has(String(id)); let show; if (zoom >= vars.allOverlayVisibleZoom) { // ๊ณ ๋ฐฐ์œจ: ํ•ญ์ƒ ๋ทฐํฌํŠธ(+๋ฒ„ํผ) ์•ˆ๋งŒ ํ‘œ์‹œ show = inside; } else { // ์ €๋ฐฐ์œจ: ํด๋Ÿฌ์Šคํ„ฐ ๋ฉค๋ฒ„๋ฉด ์ˆจ๊น€ + ๋ทฐํฌํŠธ ๋ฐ–์ด๋ฉด ์ˆจ๊น€ show = !clustered.has(String(id)) && inside; } /// 251104 ๋ฐ•์ง€์€ ol ์†Œ์ผ“์ฒ˜๋ฆฌ // if (zoom >= vars.allOverlayVisibleZoom) { // // ๊ณ ๋ฐฐ์œจ: ํด๋Ÿฌ์Šคํ„ฐ ์ƒ๊ด€์—†์ด ๋ทฐํฌํŠธ ์•ˆ๋งŒ ํ‘œ์‹œ // show = inside; // } else { // // ์ €๋ฐฐ์œจ: ํด๋Ÿฌ์Šคํ„ฐ์— ํฌํ•จ๋˜๋ฉด ๋ฌด์กฐ๊ฑด ์ˆจ๊น€ // if (isInCluster) { // show = false; // } else { // // ํด๋Ÿฌ์Šคํ„ฐ์— ์—†์œผ๋ฉด ๋ทฐํฌํŠธ ํ™•์ธ // // ์ƒˆ๋กœ ์ถ”๊ฐ€๋œ ๊ฒƒ์€ ๋ทฐํฌํŠธ ์ฒดํฌ ๋ฌด์‹œ // if (isNewlyAdded) { // show = true; // } else { // show = inside; // } // } // } const currentDisplay = el.style.display; const hidden = currentDisplay === 'none'; if (show && hidden) { el.style.display = 'flex'; } else if (!show && !hidden) { el.style.display = 'none'; } // ์‹ค์ œ ํ‘œ์‹œ ์ค‘์ผ ๋•Œ๋งŒ ๋ฆฌ์ŠคํŠธ ๋‹ซ๊ณ  ํ•˜์ด๋ผ์ดํŠธ if (show && vars.lastSelectTarget && vars.lastSelectTarget.dataset.id == id) { let clusterListWrap = document.querySelector('.map-container .cluster-list-wrap'); if (clusterListWrap) { clusterListWrap.innerHTML = ''; clusterListWrap.style.display = 'none'; } changeListItemStyle(el); } } } function getBufferedViewExtent(bufferPx = 0) { const map = ol.map; const view = map.getView(); const size = map.getSize(); if (!view || !size) return null; let extent = view.calculateExtent(size); if (bufferPx !== 0) { const res = view.getResolution(); // map-units/px if (!res) return extent; const b = bufferPx * res; // px โ†’ map-units const w = extent[2] - extent[0]; const h = extent[3] - extent[1]; // ์Œ์ˆ˜(์ถ•์†Œ)์ผ ๋•Œ ์˜์—ญ์ด ๋’ค์ง‘ํžˆ์ง€ ์•Š๋„๋ก ํด๋žจํ”„ const maxInset = Math.min(w, h) / 2 - 1e-6; // ๋‚จ๊ธฐ๋Š” ์ตœ์†Œ ์—ฌ์œ  const clamped = Math.max(-maxInset, b); // ๋„ˆ๋ฌด ํฐ ์Œ์ˆ˜ ๋ฐฉ์ง€ extent = ol.extent.buffer(extent, clamped); } return extent; } // function clusterStyleFor(size, state, clusterStyleCache) { // let cache = clusterStyleCache[state]; // if (!cache[size]) { // let scale = // state === 'selected' ? 1.2 : // state === 'hover' ? 1.2 : 1.1; // let strokeWidth = // state === 'selected' ? 4.5 : // state === 'hover' ? 4.5 : 4; // let radius = 20 * scale; // cache[size] = new ol.style.Style({ // image: new ol.style.Circle({ // radius, // fill: new ol.style.Fill({ color: '#fff' }), // stroke: new ol.style.Stroke({ color: state === 'selected' ? '#f9613b' : '#000', width: strokeWidth }) // }), // // image: new ol.style.RegularShape({ // // points: 4, // ๊ผญ์ง“์  4๊ฐœ // // radius: radius * Math.SQRT2, // ์›๊ณผ ๊ฐ™์€ ๊ฐ€๋กœํญ(์ง€๋ฆ„)์„ ๋งž์ถ”๊ณ  ์‹ถ์œผ๋ฉด โˆš2 ๋ฐฐ // // angle: Math.PI / 4, // 45๋„ ํšŒ์ „ (๊ฐ ๋ณ€์ด ์ˆ˜ํ‰/์ˆ˜์ง) // // fill: new ol.style.Fill({ color: '#fff' }), // // stroke: new ol.style.Stroke({ color: state === 'selected' ? '#f9613b' : '#000', width: strokeWidth }) // // }), // text: new ol.style.Text({ // font: // state === 'selected' ? '14px sans-serif' : // state === 'hover' ? '14px sans-serif' : '12px sans-serif', // text: String(size), // fill: new ol.style.Fill({ color: '#fff' }), // stroke: new ol.style.Stroke({ color: '#000', width: 6 }) // }) // }); // } // return cache[size]; // } function clusterStyleFor(size, state, clusterStyleCache) { let cache = clusterStyleCache[state]; if (!cache[size]) { let scale, strokeWidth, strokeColor, font; if (state == 'selected') { scale = 1.2; strokeWidth = 4.5; strokeColor = '#f9613b'; font = '14px sans-serif'; } if (state == 'hover') { scale = 1.2; strokeWidth = 4.5; strokeColor = '#000'; font = '14px sans-serif'; } if (state == 'clicked') { scale = 1.2; strokeWidth = 4.5; strokeColor = '#3bb5f9'; font = '14px sans-serif'; } if (state == 'normal') { scale = 1.1; strokeWidth = 4; strokeColor = '#000'; font = '12px sans-serif'; } let radius = 20 * scale; cache[size] = new ol.style.Style({ image: new ol.style.Circle({ radius, fill: new ol.style.Fill({ color: '#fff' }), stroke: new ol.style.Stroke({ color: strokeColor, width: strokeWidth }) }), text: new ol.style.Text({ font: font, text: String(size), fill: new ol.style.Fill({ color: '#fff' }), stroke: new ol.style.Stroke({ color: '#000', width: 6 }) }) }); } return cache[size]; } function reapplyClickedByLastOverlay(clusterSource, clusterLayer, startZoom, endZoom) { const el = vars.lastSelectTarget; if (!el) return; const id = el.dataset?.id; if (!id) return; // ํ˜„์žฌ ํ”„๋ ˆ์ž„์˜ ํด๋Ÿฌ์Šคํ„ฐ๋“ค ์ค‘์—์„œ ํ•ด๋‹น id๋ฅผ ํฌํ•จํ•˜๋Š” ํด๋Ÿฌ์Šคํ„ฐ ์ฐพ๊ธฐ const feats = clusterSource.getFeatures(); let target = null; for (const cf of feats) { const members = cf.get('features'); if (!members || members.length <= 1) continue; if (members.some(f => String(f.get('dataId')) === String(id))) { target = cf; break; } } // ์คŒ ๋ณ€๊ฒฝ ์‹œ์—๋งŒ(๊ทธ๋ฆฌ๊ณ  normal ๋ชจ๋“œ์ผ ๋•Œ๋งŒ) ๋ฆฌ์ŠคํŠธ ๋‹ค์‹œ ๊ทธ๋ฆผ if (startZoom && endZoom) { if (target && startZoom != endZoom && vars.mapMode == 'normal') { renderClusterList(target.get('features'), clusterLayer); } } // ์„ ํƒ๋œ id๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์Šคํƒ€์ผ์ด ๋‹ค์‹œ ํ‰๊ฐ€๋˜๋„๋ก ๊ฐ•์ œ ๋ฆฌ๋ Œ๋” clusterLayer.changed(); } function renderClusterList(items, clusterLayer) { let clusterListWrap = document.querySelector('.map-container .cluster-list-wrap'); clusterListWrap.innerHTML = ''; clusterListWrap.style.display = 'flex'; for(let i = 0; i < items.length; i++) { let item = items[i]; let element = item.values_.overlay.values_.element; let thumbnailWrapClone = element.querySelector('.wrap').cloneNode(true); thumbnailWrapClone.querySelector('.gps-data').remove(); thumbnailWrapClone.querySelector('.name').remove(); thumbnailWrapClone.querySelector('.uploader').remove(); thumbnailWrapClone.querySelector('.create-date').remove(); thumbnailWrapClone.querySelector('.size').remove(); let nameClone = element.querySelector('.name').cloneNode(true); // nameClone.querySelector('.name-text').classList.remove('ft-14') // nameClone.querySelector('.name-text').classList.add('ft-12') nameClone.style.display = 'flex'; let resourcePath = element.dataset.resourcePath; let dataId = element.dataset.id; let clusterList = document.createElement('div'); clusterList.classList.add('cluster-list'); clusterList.dataset.id = dataId; clusterList.dataset.resourcePath = resourcePath; clusterList.appendChild(thumbnailWrapClone); clusterList.appendChild(nameClone); // vars.lastSelectTarget์˜ dataId์™€ ๋™์ผํ•œ dataId๋ฅผ ๊ฐ€์ง„ clusterList์— selected ํด๋ž˜์Šค ์ถ”๊ฐ€ํ•ด์„œ ์„ ํƒ ์ƒํƒœ๋กœ ํ‘œ์‹œํ•˜๊ณ  ํฌ์ปค์Šค if (vars.lastSelectTarget && vars.lastSelectTarget.dataset.id == dataId) { clusterList.classList.add('selected'); // requestAnimationFrame(() => { requestAnimationFrame(() => { // clusterList.scrollIntoView({ behavior: 'instant', block: 'center', inline: 'nearest' }); targetFocus(clusterList, 'instant'); }); // }); } clusterListWrap.appendChild(clusterList); clusterList.addEventListener('click', async function(e) { let option = { from: 'ํด๋Ÿฌ์Šคํ„ฐ ๋ฆฌ์ŠคํŠธ ํด๋ฆญ' } toggleArchiveMainRight(true, option); let res = await axios.get(`${vars.path_name}/getMemoInfo`, { params: { userInfoString: vars.userInfoString, resourcePath, dataId } }); let memo = res.data.result.memo; setTimeout(() => { renderMemo(memo, dataId); }, 100); // ์ •๋ณด์˜์—ญ ์ˆจ๊น€ // document.querySelector('.archive-main .archive-main-right .viewer-container .info-wrap').classList.remove('open'); // document.querySelector('.archive-main .archive-main-right .viewer-container .info-wrap').classList.add('close'); vars.viewerConnectingTime = vars.viewerConnectingTimeValue; renderViewer(resourcePath, dataId); vars.lastSelectTarget = document.querySelector(`.map-container .list-item[data-resource-path="${resourcePath}"]`); changeListItemStyle(vars.lastSelectTarget); vars.lastListItem = vars.lastSelectTarget; vars.multiSelectListItemArr = []; document.querySelectorAll('.cluster-list-wrap .cluster-list').forEach(clusterList => { clusterList.classList.remove('selected'); }) e.target.classList.add('selected'); clusterLayer.changed(); // ํด๋Ÿฌ์Šคํ„ฐ ์•„์ดํ…œ ๋ฆฌ์ŠคํŠธ์—์„œ ํด๋ฆญํ•œ ๋Œ€์ƒ์˜ ์œ„์น˜๋กœ ์ง€๋„ ์ด๋™ let data = getDataFromTreeObject(resourcePath, 'file', vars.currentTreeObject).data; let overlayPosition = ol.proj.fromLonLat([data.lon, data.lat]); let overlayPositionArr = [overlayPosition]; await fitToOverlayExtent(overlayPositionArr, async () => {}); }) } } export async function initEditPositionMode() { document.querySelector('.control-box .file-area-mode-btn.map').click(); toggleArchiveMainRight(false); vars.mapMode = 'edit'; document.querySelector('.map-container').classList.add('edit-mode'); // ์œ„์น˜ ์ž…๋ ฅ ๋ถ€๋ถ„ ๋†’์ด๊ฐ’ let coordWrapHeightRem = pxToRem(document.querySelector('.coord-wrap').getBoundingClientRect().height); // ์ธ๋„ค์ผ wrap ๋ณต์ œ let thumbnailWrapClone = vars.lastListItem.querySelector('.wrap').cloneNode(true); thumbnailWrapClone.querySelector('.highlight')?.remove(); thumbnailWrapClone.querySelector('.gps-data')?.remove(); thumbnailWrapClone.querySelector('.name')?.remove(); thumbnailWrapClone.querySelector('.uploader')?.remove(); thumbnailWrapClone.querySelector('.create-date')?.remove(); thumbnailWrapClone.querySelector('.size')?.remove(); thumbnailWrapClone.style.width = `${coordWrapHeightRem}rem`; thumbnailWrapClone.style.minWidth = `${coordWrapHeightRem}rem`; thumbnailWrapClone.style.maxWidth = `${coordWrapHeightRem}rem`; thumbnailWrapClone.style.height = `${coordWrapHeightRem}rem`; thumbnailWrapClone.style.minHeight = `${coordWrapHeightRem}rem`; thumbnailWrapClone.style.maxHeight = `${coordWrapHeightRem}rem`; thumbnailWrapClone.dataset.id = vars.lastListItem.dataset.id; thumbnailWrapClone.dataset.resourcePath = vars.lastListItem.dataset.resourcePath; // ํŒŒ์ผ๋ช… ๋ณต์ œ let nameClone = vars.lastListItem.querySelector('.name').cloneNode(true); nameClone.style.display = 'flex'; // ํ˜„์žฌ ์œ„์น˜ ์ˆ˜์ •์ค‘์ธ ํŒŒ์ผ ์ •๋ณด wrap์— ๋ณต์ œํ•œ ์ธ๋„ค์ผ wrap, ํŒŒ์ผ๋ช… ์ถ”๊ฐ€ let editModeUi = document.querySelector('.edit-mode-ui'); let infoWrap = editModeUi.querySelector('.info-wrap'); infoWrap.style.height = `${coordWrapHeightRem}rem`; infoWrap.innerHTML = ''; infoWrap.appendChild(thumbnailWrapClone); infoWrap.appendChild(nameClone); // ์ธ๋„ค์ผ wrap์— ํ˜ธ๋ฒ„ ์ด๋ฒคํŠธ ์ถ”๊ฐ€ thumbnailWrapClone.addEventListener('pointerover', function() { if (document.querySelector('.popup-thumbnail')) document.querySelector('.popup-thumbnail').remove(); let popupThumbnailWrapClone = thumbnailWrapClone.cloneNode(true); popupThumbnailWrapClone.classList.add('popup-thumbnail'); document.querySelector('.map-container .edit-mode-ui').appendChild(popupThumbnailWrapClone); let editModeUiWidth = editModeUi.getBoundingClientRect().width; let editModeUiHeight = editModeUi.getBoundingClientRect().height; let rem; if (editModeUiWidth >= editModeUiHeight) rem = pxToRem(editModeUiHeight); if (editModeUiWidth < editModeUiHeight) rem = pxToRem(editModeUiWidth); popupThumbnailWrapClone.style.width = `${rem*0.5}rem`; popupThumbnailWrapClone.style.minWidth = `${rem*0.5}rem`; popupThumbnailWrapClone.style.maxWidth = `${rem*0.5}rem`; popupThumbnailWrapClone.style.height = `${rem*0.5}rem`; popupThumbnailWrapClone.style.minHeight = `${rem*0.5}rem`; popupThumbnailWrapClone.style.maxHeight = `${rem*0.5}rem`; popupThumbnailWrapClone.style.background = '#aaa'; popupThumbnailWrapClone.style.border = '0.0625rem solid #ccc'; popupThumbnailWrapClone.style.borderRadius = '0.25rem'; popupThumbnailWrapClone.style.position = 'absolute'; popupThumbnailWrapClone.style.bottom = `${coordWrapHeightRem + 4}rem`; popupThumbnailWrapClone.style.left = '50%'; popupThumbnailWrapClone.style.transform = 'translate(-50%, 0)'; popupThumbnailWrapClone.style.pointerEvents = 'none'; popupThumbnailWrapClone.style.zIndex = '9999'; }) thumbnailWrapClone.addEventListener('pointerleave', function() { if (document.querySelector('.popup-thumbnail')) document.querySelector('.popup-thumbnail').remove(); }) let resourcePath = vars.lastListItem.dataset.resourcePath; let data = getDataFromTreeObject(resourcePath, 'file', vars.currentTreeObject).data; let lon = (data.lon) ? data.lon : '์—†์Œ'; let lat = (data.lat) ? data.lat : '์—†์Œ'; let lonInput = document.querySelector('.edit-mode-ui .coord-input.lon'); let latInput = document.querySelector('.edit-mode-ui .coord-input.lat'); lonInput.value = lon; latInput.value = lat; } export function deletePosition() { let lonInput = document.querySelector('.edit-mode-ui .coord-input.lon'); let latInput = document.querySelector('.edit-mode-ui .coord-input.lat'); lonInput.value = '์—†์Œ'; latInput.value = '์—†์Œ'; updateMarker(); document.querySelector('.edit-mode-ui .save-btn').click(); } export function renderMemo(fileData, dataId) { // let infoWrap = document.querySelector('.archive-main-right .viewer-container .info-wrap'); const container = dataId ? document.querySelector(`.archive-main-right .viewer-container[data-data-id="${dataId}"]`) : document.querySelector('.archive-main-right .viewer-container'); if (!container) return let infoWrap = container.querySelector('.info-wrap'); // โ˜… scope ํ•œ์ • if (!infoWrap) return; let editBtn = infoWrap.querySelector('.memo .header .wrap .edit-btn'); let editMessage = infoWrap.querySelector('.memo .header .wrap .message'); let bodyWrap = infoWrap.querySelector('.memo .body .wrap'); let bodyTextarea = infoWrap.querySelector('.memo .body .wrap .textarea'); let bodyMessage = infoWrap.querySelector('.memo .body .wrap .message'); // editBtn ํด๋ž˜์Šค์— edit ์—†์œผ๋ฉด ์ถ”๊ฐ€, save ์žˆ์œผ๋ฉด ์‚ญ์ œ // if (!editBtn.matches('.edit')) editBtn.classList.add('edit'); // if (editBtn.matches('.save')) editBtn.classList.remove('save'); // editBtn ํ…์ŠคํŠธ '์ˆ˜์ •'์œผ๋กœ ๋ณ€๊ฒฝ // if (editBtn) editBtn.querySelector('.text').innerText = '์ˆ˜์ •'; // ์ˆ˜์ • ์ƒํƒœ ๊ฐ•์ œ ์ดˆ๊ธฐํ™” if (editBtn?.classList.contains('save')) { editBtn.classList.remove('save'); } if (editBtn) editBtn.querySelector('.text').innerText = '์ˆ˜์ •'; // haederMessage ํ‘œ์‹œ ์ƒํƒœ์ธ ๊ฒฝ์šฐ ๋ฐ”๋กœ ์ˆจ๊น€ editMessage.style.transition = '0s'; editMessage.style.opacity = '0'; // bodyWrap ํ…Œ๋‘๋ฆฌ ๊ฐ•์กฐ ํ•ด์ œ bodyWrap.style.border = '1px solid #ddd'; bodyTextarea.disabled = true; // bodyTextarea disabled ์ƒํƒœ๋กœ ์„ค์ • bodyTextarea.disabled = true; if(fileData == undefined || fileData == '') { bodyTextarea.value = ''; }else{ bodyTextarea.value = fileData; } // ์ƒํƒœ ์ดˆ๊ธฐํ™” // ** ๊ถŒํ•œ ๊ด€๋ จ let permission = JSON.parse(vars.userInfoString).permission; if (!vars.permission.checkPermission('memo-text')) { bodyMessage.innerText = '์ฐธ๊ด€์ž ๊ถŒํ•œ์€ ์—ด๋žŒ๋งŒ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.'; } else { if(editBtn?.querySelector('.text').innerText == '์ˆ˜์ •') { if (!editBtn.matches('.edit')) editBtn.classList.add ('edit'); bodyWrap.style.border = '1px solid #ddd'; bodyTextarea.disabled = true; bodyMessage.innerText = '์ˆ˜์ • ๋ฒ„ํŠผ์„ ๋ˆŒ๋Ÿฌ ๋‚ด์šฉ์„ ์ž‘์„ฑ/์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.'; if (bodyTextarea.value == '') bodyMessage.style.color = '#777'; else bodyMessage.style.color = '#ddd'; }else { if (editBtn?.matches('.save')) editBtn.classList.remove('save'); if (editBtn) editBtn.querySelector('.text').innerText = '์ €์žฅ'; bodyWrap.style.border = '1px solid #000' bodyTextarea.disabled = false; bodyMessage.innerText = '๋‚ด์šฉ์„ ์ž‘์„ฑํ•œ ํ›„ ์ €์žฅ ๋ฒ„ํŠผ์„ ๋ˆŒ๋Ÿฌ์ฃผ์„ธ์š”.'; } } } let renderTimer = null; let progressFrame = null; let progressStart = null; export async function renderViewer(resourcePath, dataId, shouldAddClickLog = true) { viewerContainer.style.display = 'flex'; viewerNotice.style.display = 'none'; infoWrap.style.height = '15%'; viewerToolbar.style.display = 'none'; metadata.style.display = 'none'; viewerContainer.dataset.resourcePath = resourcePath; viewerContainer.dataset.dataId = dataId; // let memo = infoWrap.querySelector('.memo'); // memo.style.height = '100%'; let toggleBtnText = infoWrap.querySelector('.separator .toggle-btn .text'); //// ๋ฆฌ์ŠคํŠธ ๋ชจ๋“œ์™€ ์ง€๋„ ํ‘œ์‹œ ๋ชจ๋“œ์—์„œ ๋ฏธ๋ฆฌ๋ณด๊ธฐ ํ•˜๋‹จ ์˜์—ญ ๋‹ค๋ฅด๊ฒŒ ํ‘œ์‹œ --- ์‹œ์ž‘ // if (listContainer.classList.contains('grid')) { // infoWrap.style.height = '30%'; // // // ๊ทธ๋ฆฌ๋“œ ํŒŒ์ผ ๋ชฉ๋ก์—์„œ ๋ทฐ์–ด ์‹คํ–‰ํ•  ๋•Œ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ์˜์—ญ, ๋ทฐ์–ดํˆด๋ฐ” ํ‘œ์‹œ // // viewerWrap.style.display = 'flex'; // // metadata.style.display = 'flex'; // // viewerToolbar.style.display = 'flex'; // // ๊ทธ๋ฆฌ๋“œ ํŒŒ์ผ ๋ชฉ๋ก์—์„œ ๋ทฐ์–ด ์‹คํ–‰ํ•  ๋•Œ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ์˜์—ญ ํ‘œ์‹œ // metadata.style.display = 'flex'; // // memo.style.height = 'auto'; // // ๊ทธ๋ฆฌ๋“œ ์•„์ดํ…œ์˜ ํ•˜์œ„ dom์— ๋‹ด๊ฒจ์žˆ๋Š” ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์™€์„œ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ์˜์—ญ ๋‚ด์šฉ ์ถ”๊ฐ€ // let currentItem = listContainer.querySelector(`.list-body .list-item[data-resource-path="${resourcePath}"]`); // let arr = ['name', 'uploader', 'create-date', 'author', 'size', 'gps-data']; // arr.map(a => { // metadata.querySelector(`.${a} .value`).innerHTML = currentItem.querySelector(`.${a} .text`).innerHTML; // }) // if (listContainer.querySelector('.list-body .list-item-wrap').style.display == 'flex') { // // ๊ทธ๋ฆฌ๋“œ ํŒŒ์ผ ๋ชฉ๋ก์—์„œ ๋ทฐ์–ด ์‹คํ–‰ํ•  ๋•Œ ๋ทฐ์–ดํˆด๋ฐ” ํ‘œ์‹œ // viewerToolbar.style.display = 'flex'; // // ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ์˜์—ญ ์œ„(๋ทฐ์–ด ํ•˜๋‹จ)๋กœ ๋ทฐ์–ดํˆด๋ฐ” ์œ„์น˜ ์กฐ์ • // // viewerToolbar.style.bottom = `${pxToRem(infoWrap.offsetHeight + 16)}rem`; // // ๋ทฐ์–ดํˆด๋ฐ” ์ด์ „/๋‹ค์Œ ๋ฒ„ํŠผ์— disabled ํด๋ž˜์Šค ์‚ญ์ œ // let prevBtn = viewerToolbar.querySelector('.prev-btn'); // let nextBtn = viewerToolbar.querySelector('.next-btn'); // prevBtn.classList.remove('disabled'); // nextBtn.classList.remove('disabled'); // // ํ˜„์žฌ ์„ ํƒ๋œ ์•„์ดํ…œ์ด ์ฒซ๋ฒˆ์งธ ์•„์ดํ…œ์ด๋ฉด ์ด์ „๋ฒ„ํŠผ์—, ๋งˆ์ง€๋ง‰ ์•„์ดํ…œ์ด๋ฉด ๋‹ค์Œ๋ฒ„ํŠผ์— disabled ํด๋ž˜์Šค ์ถ”๊ฐ€ // let listItemArr = [...listContainer.querySelector('.list-body .list-item-wrap').children]; // let currentIdx = listItemArr.indexOf(vars.lastListItem); // if (currentIdx == 0) viewerToolbar.querySelector('.prev-btn').classList.add('disabled'); // if (currentIdx == listItemArr.length-1) viewerToolbar.querySelector('.next-btn').classList.add('disabled'); // } // toggleBtnText.textContent = '๋ฉ”ํƒ€๋ฐ์ดํ„ฐ'; // } else { // toggleBtnText.textContent = '๋ฉ”๋ชจ (AI ์š”์•ฝ)'; // } //// ๋ฆฌ์ŠคํŠธ ๋ชจ๋“œ์™€ ์ง€๋„ ํ‘œ์‹œ ๋ชจ๋“œ์—์„œ ๋ฏธ๋ฆฌ๋ณด๊ธฐ ํ•˜๋‹จ ์˜์—ญ ๋‹ค๋ฅด๊ฒŒ ํ‘œ์‹œ --- ๋ //// ๋ฆฌ์ŠคํŠธ ๋ชจ๋“œ์™€ ์ง€๋„ ํ‘œ์‹œ ๋ชจ๋“œ์—์„œ ๋ฏธ๋ฆฌ๋ณด๊ธฐ ํ•˜๋‹จ ์˜์—ญ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ํ˜•ํƒœ๋กœ ๋™์ผํ•˜๊ฒŒ ํ‘œ์‹œ --- ์‹œ์ž‘ infoWrap.style.height = '30%'; // // ๊ทธ๋ฆฌ๋“œ ํŒŒ์ผ ๋ชฉ๋ก์—์„œ ๋ทฐ์–ด ์‹คํ–‰ํ•  ๋•Œ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ์˜์—ญ, ๋ทฐ์–ดํˆด๋ฐ” ํ‘œ์‹œ // viewerWrap.style.display = 'flex'; // metadata.style.display = 'flex'; // viewerToolbar.style.display = 'flex'; // ๊ทธ๋ฆฌ๋“œ ํŒŒ์ผ ๋ชฉ๋ก์—์„œ ๋ทฐ์–ด ์‹คํ–‰ํ•  ๋•Œ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ์˜์—ญ ํ‘œ์‹œ metadata.style.display = 'flex'; // memo.style.height = 'auto'; // ๊ทธ๋ฆฌ๋“œ ์•„์ดํ…œ์˜ ํ•˜์œ„ dom์— ๋‹ด๊ฒจ์žˆ๋Š” ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์™€์„œ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ์˜์—ญ ๋‚ด์šฉ ์ถ”๊ฐ€ let parts = resourcePath.split('/').filter(Boolean); let fileType = parts[3] ?? ""; let currentItem; // ๋ฒ„์ „/์ฒจ๋ถ€ํŒŒ์ผ์ด ์•„๋‹ ๊ฒฝ์šฐ (ํ˜„์žฌ ๋ฒ„์ „/์ฒจ๋ถ€ํŒŒ์ผ์€ ์ง€๋„ํ‘œ์‹œ์— ํ‘œ์‹œ์•ˆ๋จ) if(!fileType.includes('_version') && !fileType.includes('__attachment')) { currentItem = listContainer.querySelector(`.list-body .list-item[data-resource-path="${resourcePath}"]`); } else { currentItem = vars.lastSelectTarget; } let arr = ['name', 'uploader', 'create-date', 'author', 'size', 'gps-data']; arr.map(a => { metadata.querySelector(`.${a} .value`).innerHTML = currentItem.querySelector(`.${a} .text`).innerHTML; }) // if (listContainer.querySelector('.list-body .list-item-wrap').style.display == 'flex') { // // ๊ทธ๋ฆฌ๋“œ ํŒŒ์ผ ๋ชฉ๋ก์—์„œ ๋ทฐ์–ด ์‹คํ–‰ํ•  ๋•Œ ๋ทฐ์–ดํˆด๋ฐ” ํ‘œ์‹œ // viewerToolbar.style.display = 'flex'; // // ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ์˜์—ญ ์œ„(๋ทฐ์–ด ํ•˜๋‹จ)๋กœ ๋ทฐ์–ดํˆด๋ฐ” ์œ„์น˜ ์กฐ์ • // // viewerToolbar.style.bottom = `${pxToRem(infoWrap.offsetHeight + 16)}rem`; // // ๋ทฐ์–ดํˆด๋ฐ” ์ด์ „/๋‹ค์Œ ๋ฒ„ํŠผ์— disabled ํด๋ž˜์Šค ์‚ญ์ œ // let prevBtn = viewerToolbar.querySelector('.prev-btn'); // let nextBtn = viewerToolbar.querySelector('.next-btn'); // prevBtn.classList.remove('disabled'); // nextBtn.classList.remove('disabled'); // // ํ˜„์žฌ ์„ ํƒ๋œ ์•„์ดํ…œ์ด ์ฒซ๋ฒˆ์งธ ์•„์ดํ…œ์ด๋ฉด ์ด์ „๋ฒ„ํŠผ์—, ๋งˆ์ง€๋ง‰ ์•„์ดํ…œ์ด๋ฉด ๋‹ค์Œ๋ฒ„ํŠผ์— disabled ํด๋ž˜์Šค ์ถ”๊ฐ€ // let listItemArr = [...listContainer.querySelector('.list-body .list-item-wrap').children]; // let currentIdx = listItemArr.indexOf(vars.lastListItem); // if (currentIdx == 0) viewerToolbar.querySelector('.prev-btn').classList.add('disabled'); // if (currentIdx == listItemArr.length-1) viewerToolbar.querySelector('.next-btn').classList.add('disabled'); // } toggleBtnText.textContent = '๋ฉ”ํƒ€๋ฐ์ดํ„ฐ'; //// ๋ฆฌ์ŠคํŠธ ๋ชจ๋“œ์™€ ์ง€๋„ ํ‘œ์‹œ ๋ชจ๋“œ์—์„œ ๋ฏธ๋ฆฌ๋ณด๊ธฐ ํ•˜๋‹จ ์˜์—ญ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ํ˜•ํƒœ๋กœ ๋™์ผํ•˜๊ฒŒ ํ‘œ์‹œ --- ๋ // console.log('========= renderViewer'); // console.log(resourcePath); // console.log(dataId); let pdfArr = ['hwp', 'hwpx', 'doc', 'docx', 'xls', 'xlsx', 'xlsm', 'ppt', 'pptx', 'dwg', 'dxf', 'grm', 'pdf']; let gsimArr = ['gsim']; let ifcArr = ['ifc']; let imageArr = ['png', 'jpg', 'jpeg', 'webp', 'gif']; let videoArr = ['mp4', 'mov', 'webm']; let textArr = ['txt', 'log', 'md']; let urlArr = ['url']; let zipArr = ['zip']; let threeArr = ['glb', 'gltf', 'obj', 'stl', 'fbx', '3dm']; let htmlArr = ['html']; let allArr = [...pdfArr, ...videoArr, ...imageArr, ...ifcArr, ...gsimArr, ...textArr, ...urlArr, ...zipArr, ...threeArr, ...htmlArr]; let isLowerExt = true; let ext = splitBaseAndExt(resourcePath, isLowerExt).ext; let excelDirectArr = ['xls', 'xlsx', 'xlsm']; let hwpDirectArr = ['hwp', 'hwpx']; let wordDirectArr = ['docx']; let isDirectView = excelDirectArr.includes(ext) || hwpDirectArr.includes(ext) || wordDirectArr.includes(ext); let treeData = getDataFromTreeObject(resourcePath, 'file', vars.currentTreeObject)?.data || {}; let previewKey = treeData.previewKey; let objectKey = treeData.objectKey || treeData.object_key; // ๋ฌธ์„œ ๋ทฐ์–ด ์‹คํ–‰ ์‹œ ๋ฏธ๋ฆฌ๋ณด๊ธฐ 10์žฅ ์ œํ•œ ๋ฌธ๊ตฌ ํ‘œ์‹œ let thumbAlert = document.querySelector('.archive-main-right .viewer-container .viewer-header .thumb-alert'); if (pdfArr.includes(ext)) { thumbAlert.style.display = 'flex'; } else { thumbAlert.style.display = 'none'; } // fallback-pdf-btn ์ˆจ๊น€ const mainFallbackPdfBtn = document.getElementById('main-fallback-pdf-btn'); if (mainFallbackPdfBtn) { mainFallbackPdfBtn.style.display = 'none'; } // ์ง€์› ํŒŒ์ผ์ธ ๊ฒฝ์šฐ ๋ทฐ์–ด ํ”„๋กœ๊ทธ๋ ˆ์Šค ํ‘œ์‹œ, ๋Œ€๊ธฐ ์‹œ๊ฐ„ 700ms๋กœ ์„ค์ •, ์ „์ฒด๋ณด๊ธฐ ๋ฒ„ํŠผ ํ‘œ์‹œ let originViewBtn = document.querySelector('.archive-main-right .viewer-container .viewer-header .btn'); if (allArr.includes(ext) && (previewKey || isDirectView)) { toggleViewerProgress(true); vars.viewerConnectingTime = 700; originViewBtn.style.display = 'flex'; } else { toggleViewerProgress(false); vars.viewerConnectingTime = 0; originViewBtn.style.display = 'none'; } if (!shouldAddClickLog) vars.viewerConnectingTime = 0; clearTimeout(renderTimer); renderTimer = setTimeout(async () => { toggleViewerProgress(false); // ๋ทฐ์–ด ์ดˆ๊ธฐํ™” vars.viewer = viewerWrap.querySelector('.viewer'); vars.viewer.innerHTML = ''; vars.viewer.style.display = 'flex'; // Presigned URL let PresignedUrl = undefined; let openFileViewer = true; if (!previewKey || !objectKey) { let getDataInfoParams = { userInfoString: vars.userInfoString, storageType: vars.storageType, dataIdArr: [dataId], isRemoved: false, debug: "'renderViewer'์—์„œ ์‹คํ–‰" } let getDataInfoRes = await axios.post(`${vars.path_name}/getDataInfo`, { params: getDataInfoParams } ); if (getDataInfoRes.data.message == 'getDataInfo_success') { let result = getDataInfoRes.data.result; if (result) { previewKey = result.preview_key; objectKey = result.object_key; } } } let targetKey = isDirectView ? objectKey : previewKey; if (allArr.includes(ext)) { if (targetKey == undefined || targetKey == `` || targetKey == null) { viewerConvert(); openFileViewer = false; shouldAddClickLog = false; } else { let generateDownloadUrlParams = { objectKey: targetKey, resourcePath: resourcePath } let generateDownloadUrlRes = await axios.post(`${vars.path_name}/generateDownloadUrl`, generateDownloadUrlParams); if (generateDownloadUrlRes.data.message == 'generateDownloadUrl_success') { PresignedUrl = generateDownloadUrlRes.data.url; } } } else { viewerUnsupport(ext); openFileViewer = false; shouldAddClickLog = false; } if (openFileViewer) { let ext = (splitBaseAndExt(resourcePath).ext).toLowerCase(); let pdfArrFiltered = pdfArr.filter(e => !excelDirectArr.includes(e) && !hwpDirectArr.includes(e) && !wordDirectArr.includes(e)); // 3D๋ทฐ์–ด ์ธ๋„ค์ผ ๋ณ€์ˆ˜ const thumbnail_key = getDataFromTreeObject(resourcePath, 'file', vars.currentTreeObject).data?.thumbnailKey; if (allArr.includes(ext)) { if (pdfArrFiltered.includes(ext)) viewerPdf(PresignedUrl); if (excelDirectArr.includes(ext)) viewerExcel(PresignedUrl); if (hwpDirectArr.includes(ext)) viewerHwp(PresignedUrl); if (wordDirectArr.includes(ext)) viewerWord(PresignedUrl); if (gsimArr.includes(ext)) viewerGsim(PresignedUrl); if (ifcArr.includes(ext)) viewerIfc(PresignedUrl, thumbnail_key, resourcePath, dataId, vars.path_name); if (threeArr.includes(ext)) viewer3d(PresignedUrl, thumbnail_key, resourcePath, dataId, vars.path_name); if (imageArr.includes(ext)) viewerImage(PresignedUrl); if (videoArr.includes(ext)) viewerVideo(PresignedUrl); if (textArr.includes(ext)) viewerText(PresignedUrl, ext); if (urlArr.includes(ext)) viewerURL(PresignedUrl); if (zipArr.includes(ext)) viewerZIP(PresignedUrl); if (htmlArr.includes(ext)) viewerHTML(PresignedUrl); } else { viewerUnsupport(ext); shouldAddClickLog = false; } } renderTimer = null; // ํด๋ฆญ ๋กœ๊ทธ ์ถ”๊ฐ€ (renderViewer) if (shouldAddClickLog) { // console.log('ํด๋ฆญ ๋กœ๊ทธ ์ถ”๊ฐ€ (renderViewer)'); let params = { userInfoString: vars.userInfoString, dataIdArr: [String(dataId)], resourcePathArr: [resourcePath], activity: 'click_file' } mgmtFunc_addClickLog(params); } // AI ๋ฒ„ํŠผ ์ƒํƒœ ๋ณต์› (๋ทฐ์–ด ๋ Œ๋”๋ง ์™„๋ฃŒ ํ›„ ์‹คํ–‰) // restoreAiButtonState(resourcePath, viewerContainer.dataset.dataId); }, vars.viewerConnectingTime); function toggleViewerProgress(state) { let viewerProgress = document.querySelector('.viewer-progress'); let viewerProgressFill = viewerProgress.querySelector('.wrap .bar .fill'); if (state == false) { viewerProgress.style.display = 'none'; if (progressFrame) { cancelAnimationFrame(progressFrame); progressFrame = null; } if (viewerProgressFill) viewerProgressFill.style.transform = 'scaleX(0)'; return; } if (state == true) { viewerProgress.style.display = 'flex'; if (progressFrame) cancelAnimationFrame(progressFrame); progressStart = performance.now(); function animate(now) { let elapsed = now - progressStart; let t = Math.min(elapsed / vars.viewerConnectingTime, 1); let eased = 1 - (1 - t) ** 5; if (viewerProgressFill) viewerProgressFill.style.transform = `scaleX(${eased})`; if (elapsed < vars.viewerConnectingTime) progressFrame = requestAnimationFrame(animate); } progressFrame = requestAnimationFrame(animate); } } function viewerUnsupport(ext) { let viewerUnsupportWrap = document.createElement('div'); viewerUnsupportWrap.classList.add('viewer-unsupport-wrap'); let text = document.createElement('div'); text.classList.add('text'); if (isValidExt(ext)) { // ํ™•์žฅ์ž๊ฐ€ ์œ ํšจํ•œ ๊ฒฝ์šฐ text.innerText = `${ext} ํŒŒ์ผ ํ˜•์‹์€ ํ˜„์žฌ ์ง€์›๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.`; } else { // ํ™•์žฅ์ž๊ฐ€ ์œ ํšจํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ text.innerText = `ํ™•์žฅ์ž๊ฐ€ ์œ ํšจํ•˜์ง€ ์•Š์€ ํŒŒ์ผ์€ ์ง€์›๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.`; } viewerUnsupportWrap.appendChild(text); vars.viewer.appendChild(viewerUnsupportWrap); vars.viewer.dataset.viewerType = 'unsupport'; } function viewerConvert() { let viewerConvertWrap = document.createElement('div'); viewerConvertWrap.classList.add('viewer-convert-wrap'); let text = document.createElement('div'); text.classList.add('text'); text.innerText = `ํ•ด๋‹น ํŒŒ์ผ์€ ๋ณ€ํ™˜ ํ›„ ์—ด๋žŒ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.`; // let convertBtn = document.createElement('div'); // convertBtn.textContent = '๋ณ€ํ™˜'; // convertBtn.classList.add('convert-btn'); // convertBtn.addEventListener('click', () => { // convertPdf(resourcePath); // }) viewerConvertWrap.appendChild(text); // viewerConvertWrap.appendChild(convertBtn); vars.viewer.appendChild(viewerConvertWrap); vars.viewer.dataset.viewerType = 'convert'; } // ----------------------------------------------------------------- // ์˜คํ”ˆ์†Œ์Šค ๋ฌธ์„œ ์ง์ ‘ ๋ทฐ์ž‰ ๋ฐ PDF ํด๋ฐฑ ํ•จ์ˆ˜ ์ •์˜ (Main Viewer) // ----------------------------------------------------------------- function initMainFallbackPdfButton(dataId, resourcePath, objectKey, previewKey) { const btn = document.getElementById('main-fallback-pdf-btn'); if (!btn) return; // ์ด์ „ ๋“ฑ๋ก๋œ ๋ฆฌ์Šค๋„ˆ ์ œ๊ฑฐ๋ฅผ ์œ„ํ•ด ๋ณต์‚ฌ ๋Œ€์ฒด const newBtn = btn.cloneNode(true); btn.parentNode.replaceChild(newBtn, btn); newBtn.style.display = 'flex'; newBtn.querySelector('.text').textContent = 'PDF๋กœ ๋ณด๊ธฐ'; newBtn.style.pointerEvents = 'auto'; newBtn.addEventListener('click', async () => { newBtn.querySelector('.text').textContent = '๋กœ๋”ฉ ์ค‘...'; newBtn.style.pointerEvents = 'none'; try { // 1. ์ตœ์‹  ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ (preview_key) ์กฐํšŒ if (!previewKey) { let getDataInfoParams = { userInfoString: vars.userInfoString, storageType: vars.storageType, dataIdArr: [dataId], isRemoved: false, debug: "main fallback" } let getDataInfoRes = await axios.post(`${vars.path_name}/getDataInfo`, { params: getDataInfoParams } ); if (getDataInfoRes.data.message == 'getDataInfo_success') { let result = getDataInfoRes.data.result; if (result) { previewKey = result.preview_key; objectKey = result.object_key; } } } // 2. ๋งŒ์•ฝ PDF ๋ณ€ํ™˜๋ณธ์ด ์•„์ง ์—†๋‹ค๋ฉด ๋ฐฑ์—”๋“œ ๋ณ€ํ™˜ ์š”์ฒญ if (!previewKey) { newBtn.querySelector('.text').textContent = 'PDF ๋ณ€ํ™˜ ์š”์ฒญ ์ค‘...'; await convertPdf(resourcePath, dataId); alert('์„œ๋ฒ„ ์ธก PDF ๋ณ€ํ™˜์ด ์‹œ์ž‘๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ž ์‹œ ํ›„ ๋‹ค์‹œ ํด๋ฆญํ•ด ์ฃผ์„ธ์š”.'); newBtn.querySelector('.text').textContent = 'PDF๋กœ ๋ณด๊ธฐ'; newBtn.style.pointerEvents = 'auto'; return; } // 3. PDF์šฉ Presigned URL ์ƒ์„ฑ let generateDownloadUrlParams = { objectKey: previewKey, resourcePath: resourcePath } let generateDownloadUrlRes = await axios.post(`${vars.path_name}/generateDownloadUrl`, generateDownloadUrlParams); if (generateDownloadUrlRes.data.message == 'generateDownloadUrl_success') { let pdfUrl = generateDownloadUrlRes.data.url; // ํ™”๋ฉด ์ดˆ๊ธฐํ™” ๋ฐ PDF ๋ทฐ์–ด ๋กœ๋“œ vars.viewer = viewerWrap.querySelector('.viewer'); vars.viewer.innerHTML = ''; newBtn.style.display = 'none'; viewerPdf(pdfUrl); } else { alert('PDF ๋ฏธ๋ฆฌ๋ณด๊ธฐ ์ฃผ์†Œ ํš๋“์— ์‹คํŒจํ–ˆ์Šต๋‹ˆ๋‹ค.'); newBtn.querySelector('.text').textContent = 'PDF๋กœ ๋ณด๊ธฐ'; newBtn.style.pointerEvents = 'auto'; } } catch (err) { console.error(err); alert('PDF ๋ณ€ํ™˜ ๋ฐ ์กฐํšŒ ์ค‘ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.'); newBtn.querySelector('.text').textContent = 'PDF๋กœ ๋ณด๊ธฐ'; newBtn.style.pointerEvents = 'auto'; } }); } function viewerExcel(presignedUrl) { vars.viewer.innerHTML = '
์—‘์…€ ๋ฐ์ดํ„ฐ๋ฅผ ๋ถˆ๋Ÿฌ์˜ค๋Š” ์ค‘...
'; initMainFallbackPdfButton(dataId, resourcePath, objectKey, previewKey); fetch(presignedUrl) .then(res => { if (!res.ok) throw new Error(`HTTP ${res.status} ${res.statusText}`); return res.arrayBuffer(); }) .then(arrayBuffer => { vars.viewer.innerHTML = ''; LuckyExcel.transformExcelToLucky(arrayBuffer, function(exportJson, luckysheetfile) { if(exportJson.sheets == null || exportJson.sheets.length == 0) { vars.viewer.innerHTML = '
์—‘์…€ ๋ฐ์ดํ„ฐ๋ฅผ ํŒŒ์‹ฑํ•˜์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค. (xls ํ™•์žฅ์ž๋Š” ์ง€์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.)
'; initMainFallbackPdfButton(dataId, resourcePath, objectKey, previewKey); return; } if (window.luckysheet) { window.luckysheet.destroy(); } vars.viewer.style.position = 'relative'; const container = document.createElement('div'); container.id = 'luckysheet_inner'; container.style.margin = '0px'; container.style.padding = '0px'; container.style.position = 'absolute'; container.style.width = '100%'; container.style.height = '100%'; container.style.left = '0px'; container.style.top = '0px'; vars.viewer.appendChild(container); try { window.luckysheet.create({ container: 'luckysheet_inner', data: exportJson.sheets, title: exportJson.info.name || 'Excel Viewer', lang: 'en', showinfobar: false, myFolderUrl: 'javascript:void(0)' }); } catch (createErr) { console.error("Luckysheet create error: ", createErr); vars.viewer.innerHTML = `
์—‘์…€ ์‹œํŠธ ์ƒ์„ฑ ์ค‘ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.
์—๋Ÿฌ: ${createErr.message}
`; } }, function(err) { console.error("Luckysheet transform error: ", err); vars.viewer.innerHTML = `
์—‘์…€ ํŒŒ์ผ์„ ์ฝ๋Š” ์ค‘ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.
์ƒ์„ธ: ${err.message || err}
`; initMainFallbackPdfButton(dataId, resourcePath, objectKey, previewKey); }); }) .catch(err => { console.error(err); vars.viewer.innerHTML = `
์—‘์…€ ํŒŒ์ผ์„ ๋ถˆ๋Ÿฌ์˜ค๋Š”๋ฐ ์‹คํŒจํ–ˆ์Šต๋‹ˆ๋‹ค.
์—๋Ÿฌ: ${err.message}
`; initMainFallbackPdfButton(dataId, resourcePath, objectKey, previewKey); }); vars.viewer.dataset.viewerType = 'excel'; } function viewerWord(presignedUrl) { vars.viewer.innerHTML = '
์›Œ๋“œ ๋ฌธ์„œ๋ฅผ ๋ถˆ๋Ÿฌ์˜ค๋Š” ์ค‘...
'; initMainFallbackPdfButton(dataId, resourcePath, objectKey, previewKey); fetch(presignedUrl) .then(res => { if (!res.ok) throw new Error('Word fetch failed'); return res.arrayBuffer(); }) .then(arrayBuffer => { vars.viewer.innerHTML = ''; const container = document.createElement('div'); container.style.width = '100%'; container.style.height = '100%'; container.style.overflow = 'auto'; container.style.padding = '20px'; container.style.boxSizing = 'border-box'; container.style.background = '#f5f5f5'; const docxInner = document.createElement('div'); docxInner.style.background = '#ffffff'; docxInner.style.margin = '0 auto'; docxInner.style.maxWidth = '800px'; docxInner.style.boxShadow = '0 4px 10px rgba(0,0,0,0.1)'; docxInner.style.padding = '40px'; container.appendChild(docxInner); vars.viewer.appendChild(container); docx.renderAsync(arrayBuffer, docxInner) .then(() => console.log("docx rendered")) .catch(err => { console.error(err); docxInner.innerHTML = '
์›Œ๋“œ ๋ฌธ์„œ ํŒŒ์‹ฑ ์ค‘ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค. ์ƒ๋‹จ์˜ "PDF๋กœ ๋ณด๊ธฐ" ๋ฒ„ํŠผ์„ ์ด์šฉํ•ด ์ฃผ์„ธ์š”.
'; }); }) .catch(err => { console.error(err); vars.viewer.innerHTML = '
์›Œ๋“œ ๋ฌธ์„œ๋ฅผ ๋ถˆ๋Ÿฌ์˜ค๋Š”๋ฐ ์‹คํŒจํ–ˆ์Šต๋‹ˆ๋‹ค.
'; }); vars.viewer.dataset.viewerType = 'word'; } function viewerHwp(presignedUrl) { vars.viewer.innerHTML = '
ํ•œ๊ธ€ ๋ฌธ์„œ๋ฅผ ๋ถˆ๋Ÿฌ์˜ค๋Š” ์ค‘...
'; initMainFallbackPdfButton(dataId, resourcePath, objectKey, previewKey); fetch(presignedUrl) .then(res => { if (!res.ok) throw new Error('HWP fetch failed'); return res.blob(); }) .then(blob => { vars.viewer.innerHTML = ''; const container = document.createElement('div'); container.style.width = '100%'; container.style.height = '100%'; container.style.overflowX = 'auto'; container.style.overflowY = 'auto'; container.style.padding = '20px'; container.style.boxSizing = 'border-box'; container.style.background = '#f5f5f5'; const styleEl = document.createElement('style'); styleEl.textContent = ` .hwp-inner-container { background: #ffffff; margin: 0 auto; width: max-content; min-width: 800px; box-shadow: 0 4px 10px rgba(0,0,0,0.1); padding: 0 !important; box-sizing: border-box !important; min-height: 100%; } .hwp-inner-container img { max-width: 100% !important; height: auto !important; } `; container.appendChild(styleEl); const hwpInner = document.createElement('div'); hwpInner.classList.add('hwp-inner-container'); container.appendChild(hwpInner); vars.viewer.appendChild(container); const reader = new FileReader(); reader.onload = (e) => { const bstr = e.target.result; try { new hwp.Viewer(hwpInner, bstr); } catch (err) { console.error("hwp.js error: ", err); hwpInner.innerHTML = '
ํ•œ๊ธ€ ๋ฌธ์„œ ํŒŒ์‹ฑ ์ค‘ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค. ์ƒ๋‹จ์˜ "PDF๋กœ ๋ณด๊ธฐ" ๋ฒ„ํŠผ์„ ์ด์šฉํ•ด ์ฃผ์„ธ์š”.
'; } }; reader.readAsBinaryString(blob); }) .catch(err => { console.error(err); vars.viewer.innerHTML = '
ํ•œ๊ธ€ ๋ฌธ์„œ๋ฅผ ๋ถˆ๋Ÿฌ์˜ค๋Š”๋ฐ ์‹คํŒจํ–ˆ์Šต๋‹ˆ๋‹ค.
'; }); vars.viewer.dataset.viewerType = 'hwp'; } //// ์›๋ณธ viewer async function viewerPdf(presignedUrl) { if(presignedUrl == undefined || presignedUrl == ``){ viewerConvert(); return; } let pdfOptions = { url : presignedUrl, initialPage: 1, } let iframe = document.createElement('iframe'); iframe.src = `/libs/pdfViewer/web/viewer.html`; iframe.addEventListener('load', async () => { // pdf ์‹คํ–‰ ์‹œ ๋ฌด์กฐ๊ฑด 1ํŽ˜์ด์ง€๋ถ€ํ„ฐ ๋ณด์ด๋„๋ก ๊ธฐ์กด pdf ํžˆ์Šคํ† ๋ฆฌ ์‚ญ์ œ try { let appWin = iframe.contentWindow; // PDF.js์˜ ๊ธฐ๋ณธ ํžˆ์Šคํ† ๋ฆฌ ํ‚ค appWin.localStorage.removeItem('pdfjs.history'); // ๋˜๋Š” ์—ฌ๋Ÿฌ ํ‚ค ์‚ญ์ œ Object.keys(appWin.localStorage).forEach(k => { if (k.startsWith('pdfjs.history') || k.startsWith('pdfjs.preferences')) { appWin.localStorage.removeItem(k); } }); } catch (e) { /* ignore */ } let app = document.querySelector('.viewer-container .viewer-wrap .viewer iframe').contentWindow.PDFViewerApplication; app.pdfCursorTools._handTool.activate(); app.open(pdfOptions); // ๋ฏธ๋ฆฌ๋ณด๊ธฐ 10ํŽ˜์ด์ง€ ํ‘œ์‹œ ์ œํ•œ app.appConfig.mainContainer.classList.add('scrollbar'); app.appConfig.mainContainer.style.marginLeft = '4px'; iframe.contentWindow.document.querySelector('body').style.backgroundColor = '#383838'; // ๋ฏธ๋ฆฌ๋ณด๊ธฐ 10ํŽ˜์ด์ง€ ํ‘œ์‹œ ์ œํ•œ app.eventBus.on('pagesloaded', async function onPagesLoaded() { // PDF๊ฐ€ ์™„์ „ํžˆ ๋กœ๋“œ๋œ ํ›„์— ์‹คํ–‰ // ๋ฏธ๋ฆฌ๋ณด๊ธฐ PDF ํŽ˜์ด์ง€ ์ˆ˜๊ฐ€ 10์žฅ ์ดํ•˜๋ฉด ๋ฆฌํ„ด if (app.pagesCount <= 10) return; let mainContainer = iframe.contentWindow.document.querySelector('#mainContainer'); let viewerContainer = mainContainer.querySelector('#viewerContainer'); let viewer = viewerContainer.querySelector('#viewer'); let pages = viewer.querySelectorAll('.page'); let numPages = mainContainer.querySelector('#toolbarContainer #numPages'); // ํŽ˜์ด์ง€๊ฐ€ 10์žฅ ์ดˆ๊ณผ์ธ ๊ฒฝ์šฐ ํˆด๋ฐ”์— ์ตœ๋Œ€ ํŽ˜์ด์ง€ ์ˆ˜ 10ํŽ˜์ด์ง€๋กœ ๊ณ ์ • if (app.pagesCount > 10) numPages.innerText = '/ 10'; // ์ตœ๋Œ€ ํŽ˜์ด์ง€ ์ˆ˜ ํ‘œ์‹œ numPages.style.display = 'flex'; // ํŽ˜์ด์ง€ ์ˆซ์ž ์ž…๋ ฅ input disabled ์ฒ˜๋ฆฌ let pageNumberInput = mainContainer.querySelector('#toolbarContainer #pageNumber'); pageNumberInput.disabled = true; pageNumberInput.style.background = '#ddd'; pageNumberInput.style.color = '#999'; // ๋‹ค์Œ ํŽ˜์ด์ง€ ๋ฒ„ํŠผ ํด๋ฆญ ์‹œ 10ํŽ˜์ด์ง€ ๋„˜์–ด๊ฐ€๋ฉด 10 ํŽ˜์ด์ง€๋กœ ๊ณ ์ • let nextBtn = mainContainer.querySelector('#toolbarContainer #next.toolbarButton'); nextBtn.addEventListener('click', function() { if (pageNumberInput.value > 10) { pageNumberInput.value = 10; app.page = 10; } }) // 10ํŽ˜์ด์ง€ ๋†’์ด๊ฐ’ ์„ค์ • // -> ํ•œ ํŽ˜์ด์ง€ ๋†’์ด์— 10์„ ๊ณฑํ•œ ๊ฐ’์— iframe ๋†’์ด๋ฅผ ๋นผ์•ผ ์Šคํฌ๋กค์ด ์ œ์ผ ์•„๋ž˜๋กœ ๋‚ด๋ ค๊ฐ”์„ ๋•Œ ๋งˆ์ง€๋ง‰ ํŽ˜์ด์ง€ ๋์— ๋งž์Œ let pageHeightLimit = (pages[0].offsetHeight * 10) - iframe.offsetHeight; // pdf๋ทฐ์–ด ์‹คํ–‰ ์‹œ ํ•ญ์ƒ ์Šคํฌ๋กค ์ฒ˜์Œ์œผ๋กœ ๊ณ ์ • // viewerContainer.scrollTop = 0; viewerContainer.addEventListener('scroll', function() { if (viewerContainer.scrollTop >= pageHeightLimit) { // ์Šคํฌ๋กค์ด 10ํŽ˜์ด์ง€ ๋†’์ด๊ฐ’์— ๋„๋‹ฌํ•˜๋ฉด ์Šคํฌ๋กค์œ„์น˜๋ฅผ 10ํŽ˜์ด์ง€ ๋(๋†’์ด๊ฐ’)์œผ๋กœ ๊ณ ์ • viewerContainer.scrollTop = pageHeightLimit; // ์Šคํฌ๋กค์ด 10ํŽ˜์ด์ง€ ๋†’์ด๊ฐ’์— ๋„๋‹ฌํ•˜๋ฉด 11ํŽ˜์ด์ง€๋ถ€ํ„ฐ ์ˆจ๊น€์ฒ˜๋ฆฌ for (let i = 0; i < pages.length; i++) { let page = pages[i]; if (i >= 10) { if (page.querySelector('.canvasWrapper')) page.querySelector('.canvasWrapper').remove(); // ๋˜๋Š” ์ˆจ๊น€ page.style.backgroundColor = '#383838'; } } } }); // ๊ฐ€์ƒ ์Šคํฌ๋กค๋ฐ” ์ƒ์„ฑ // ๋งˆ์šฐ์Šค ๋‹ค์šด ์ƒํƒœ์—์„œ ๊ฐ€์ƒ ์Šคํฌ๋กค๋ฐ” ์˜์—ญ ๋ฒ—์–ด๋‚ฌ์„ ๋•Œ ์ด๋ฒคํŠธ ์ฒ˜๋ฆฌ ํ•„์š” await setupFakeScrollbar(iframe, 10); // ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ ์ œ๊ฑฐ (์ค‘๋ณต๋ฐฉ์ง€) app.eventBus.off('pagesloaded', onPagesLoaded); }); }) vars.viewer.appendChild(iframe); vars.viewer.dataset.viewerType = 'pdf'; // ๋ฏธ๋ฆฌ๋ณด๊ธฐ 10ํŽ˜์ด์ง€ ํ‘œ์‹œ ์ œํ•œ function setupFakeScrollbar(iframe, visiblePages) { const doc = iframe.contentWindow.document; const container = doc.querySelector('#viewerContainer'); if (!container) return; // fakeScrollbar div ์ƒ์„ฑ let fakeScrollbar = document.createElement('div'); fakeScrollbar.className = 'fake-scrollbar'; // thumb ์ƒ์„ฑ let fakeThumb = document.createElement('div'); fakeThumb.className = 'fake-thumb'; fakeScrollbar.appendChild(fakeThumb); // iframe ์œ„์— fakeScrollbar ์ถ”๊ฐ€ iframe.parentNode.appendChild(fakeScrollbar); // 10ํŽ˜์ด์ง€ ๋†’์ด ํ•ฉ์‚ฐ let pageDivs = doc.querySelectorAll('.page'); let totalHeight = 0; for (let i = 0; i < visiblePages && i < pageDivs.length; i++) { totalHeight += pageDivs[i].offsetHeight; } // ์‹ค์ œ ์ปจํ…Œ์ด๋„ˆ ์ „์ฒด ๋†’์ด let contentHeight = doc.querySelector('#viewer').offsetHeight; let viewportHeight = container.clientHeight; // fakeThumb์˜ ๋†’์ด์™€ ์ด๋™๊ฐ€๋Šฅ ๋ฒ”์œ„ ๊ณ„์‚ฐ let thumbHeight = Math.max( (viewportHeight / totalHeight) * viewportHeight, 40 ); fakeThumb.style.height = thumbHeight + 'px'; // fakeThumb ์œ„์น˜ ์—…๋ฐ์ดํŠธ ํ•จ์ˆ˜ function updateFakeThumb() { let maxScroll = totalHeight - viewportHeight; let scroll = Math.min(container.scrollTop, maxScroll); let top = (scroll / maxScroll) * (viewportHeight - thumbHeight); fakeThumb.style.top = (isNaN(top) ? 0 : top) + 'px'; } // ์Šคํฌ๋กค ์ด๋ฒคํŠธ ์—ฐ๊ฒฐ container.addEventListener('scroll', (e) => { updateFakeThumb(); }); // container.addEventListener('wheel', (e) => { // console.log(e); // updateFakeThumb(); // }); // fakeThumb ๋“œ๋ž˜๊ทธ๋กœ ์‹ค์ œ ์Šคํฌ๋กค ์กฐ์ • let dragging = false, dragStartY = 0, startScroll = 0; fakeThumb.addEventListener('mousedown', (e) => { dragging = true; dragStartY = e.clientY; startScroll = container.scrollTop; document.body.style.userSelect = 'none'; }); window.addEventListener('mousemove', (e) => { if (!dragging) return; let delta = e.clientY - dragStartY; let maxScroll = totalHeight - viewportHeight; let trackLen = viewportHeight - thumbHeight; let scroll = startScroll + (delta / trackLen) * maxScroll; scroll = Math.max(0, Math.min(maxScroll, scroll)); container.scrollTop = scroll; }); window.addEventListener('mouseup', () => { dragging = false; document.body.style.userSelect = ''; }); // fakeThumb์™€ ์ปจํ…Œ์ด๋„ˆ ์œ„์น˜ ์ดˆ๊ธฐ ๋™๊ธฐํ™” updateFakeThumb(); fakeScrollbar.style.pointerEvents = 'auto'; } } function viewerImage(presignedUrl) { let viewerImageWrap = document.createElement('div'); viewerImageWrap.classList.add('viewer-image-wrap'); let viewerImage = document.createElement('img'); viewerImage.classList.add('viewer-image'); viewerImage.src = presignedUrl; viewerImageWrap.appendChild(viewerImage); vars.viewer.appendChild(viewerImageWrap); vars.viewer.dataset.viewerType = 'image'; } function viewerVideo(presignedUrl) { let viewerVideoWrap = document.createElement('div'); viewerVideoWrap.classList.add('viewer-video-wrap'); let viewerVideo = document.createElement('video'); viewerVideo.classList.add('viewer-video'); viewerVideo.autoplay = true; viewerVideo.muted = true; viewerVideo.playsInline = true; viewerVideo.controls = true; viewerVideo.crossOrigin = 'anonymous'; let sourceElement = document.createElement('source'); sourceElement.src = presignedUrl; sourceElement.type = 'video/mp4; codecs="avc1.42E01E, mp4a.40.2"'; viewerVideo.appendChild(sourceElement); viewerVideoWrap.appendChild(viewerVideo); vars.viewer.appendChild(viewerVideoWrap); vars.viewer.dataset.viewerType = 'video'; } function viewerText(presignedUrl, ext) { let viewerTextWrap = document.createElement('div'); viewerTextWrap.classList.add('viewer-text-wrap'); viewerTextWrap.classList.add('scrollbar'); fetch(presignedUrl).then(res => res.text()).then(data => { let viewerText = document.createElement('div'); viewerText.classList.add('viewer-text'); if(ext === 'md'){ viewerText.style.whiteSpace = 'normal'; viewerText.classList.add('markdown-body'); // mermaid ์‹œํ€€์Šค ๋‹ค์ด์–ด๊ทธ๋žจ ๋ณ€ํ™˜ const renderer = new marked.Renderer(); const originalCode = renderer.code.bind(renderer); // ๋จธ๋ฉ”์ด๋“œ๋งŒ ๋ณ€ํ™˜ํ•˜๊ณ  ๋‚˜๋จธ์ง€๋Š” ๊ธฐ์กด ๋ Œ๋”๋Ÿฌ ์‚ฌ์šฉ renderer.code = (code) => { if(code.lang === 'mermaid') return `
${code.text}
`; return originalCode(code); } //mdํŒŒ์ผ ํŒŒ์‹ฑ ํ›„ ์‚ฝ์ž… marked.setOptions({ gfm: true, breaks: true, renderer}); viewerText.innerHTML = marked.parse(data); // mermaid ์ดˆ๊ธฐํ™” ๋ฐ ์ƒ์„ฑ const mermaidEls = viewerText.querySelectorAll('.mermaid') if(mermaidEls.length > 0){ mermaid.initialize({ startOnLoad: false }); mermaid.init(undefined, mermaidEls); } } else { viewerText.textContent = data; } viewerTextWrap.appendChild(viewerText); vars.viewer.appendChild(viewerTextWrap); if(ext === 'md')hljs.highlightAll(); vars.viewer.dataset.viewerType = 'text'; }) } function viewerGsim(presignedUrl) { let viewerGsim = document.createElement('div'); viewerGsim.classList.add('viewer-gsim'); let iframe = document.createElement('iframe'); iframe.onload = () => { iframe.contentWindow.postMessage({ path: presignedUrl }, '*'); // path ๊ฐ’์„ iframe์— ์ „๋‹ฌ }; iframe.src = `/libs/gsimViewer/gsimViewer.html?path=${encodeURIComponent(presignedUrl)}`; viewerGsim.appendChild(iframe); vars.viewer.appendChild(viewerGsim); vars.viewer.dataset.viewerType = 'gsim'; } function viewerIfc(presignedUrl, thumbnail_key, resourcePath, dataId, path_name) { let viewerIfc = document.createElement('div'); viewerIfc.classList.add('viewer-ifc'); let iframe = document.createElement('iframe'); iframe.onload = () => { iframe.contentWindow.postMessage({ path: presignedUrl, thumbnail_key, resourcePath, dataId, path_name }, '*'); // presignedUrl์„ iframe์— ์ „๋‹ฌ }; iframe.src = `/libs/ifcViewer/index.html`; iframe.width = '100%'; iframe.height = '100%'; iframe.style.border = 'none'; viewerIfc.appendChild(iframe); vars.viewer.appendChild(viewerIfc); vars.viewer.dataset.viewerType = 'ifc'; } function viewer3d(presignedUrl, thumbnail_key, resourcePath, dataId, path_name) { let viewer3d = document.createElement('div'); viewer3d.classList.add('viewer-3d'); let iframe = document.createElement('iframe'); // ๋ฐ์ดํ„ฐ(payload)๋ฅผ ๋ณด๋ƒ„ iframe.onload = () => { iframe.contentWindow.postMessage({ path: presignedUrl, thumbnail_key, resourcePath, dataId, path_name}, '*'); }; iframe.src = `/libs/3dViewer/index.html`; iframe.width = '100%'; iframe.height = '100%'; iframe.style.border = 'none'; viewer3d.appendChild(iframe); vars.viewer.appendChild(viewer3d); vars.viewer.dataset.viewerType = '3d'; } function viewerURL(presignedUrl) { let viewerURLWrap = document.createElement('div'); viewerURLWrap.classList.add('viewer-text-wrap'); fetch(presignedUrl).then(res => res.text()).then(data => { let url = data.split('URL=')[1]; let iframe = document.createElement('iframe'); iframe.src = url; iframe.style.width = '100%'; // ์ปจํ…Œ์ด๋„ˆ์— ๋งž๊ฒŒ ๋„ˆ๋น„ ์„ค์ • iframe.style.height = '100%'; // ์ปจํ…Œ์ด๋„ˆ์— ๋งž๊ฒŒ ๋†’์ด ์„ค์ • iframe.style.border = 'none'; // ํ…Œ๋‘๋ฆฌ ์ œ๊ฑฐ (์„ ํƒ ์‚ฌํ•ญ) viewerURLWrap.appendChild(iframe); vars.viewer.appendChild(viewerURLWrap); vars.viewer.dataset.viewerType = 'url'; }) } function viewerHTML(presignedUrl){ let viewerHTMLWrap = document.createElement('div'); viewerHTMLWrap.classList.add('viewer-text-wrap'); fetch(presignedUrl).then(res => res.text()).then(data => { let iframe = document.createElement('iframe'); iframe.srcdoc = data; iframe.style.width = '100%'; // ์ปจํ…Œ์ด๋„ˆ์— ๋งž๊ฒŒ ๋„ˆ๋น„ ์„ค์ • iframe.style.height = '100%'; // ์ปจํ…Œ์ด๋„ˆ์— ๋งž๊ฒŒ ๋†’์ด ์„ค์ • iframe.style.border = 'none'; // ํ…Œ๋‘๋ฆฌ ์ œ๊ฑฐ (์„ ํƒ ์‚ฌํ•ญ) viewerHTMLWrap.appendChild(iframe); vars.viewer.appendChild(viewerHTMLWrap); vars.viewer.dataset.viewerType = 'url'; }) } function viewerZIP(presignedUrl) { let viewerTextWrap = document.createElement('div'); viewerTextWrap.classList.add('viewer-text-wrap'); viewerTextWrap.classList.add('scrollbar'); let selectItem = vars.lastListItem.dataset.resourcePath; fetch(presignedUrl).then(async data => { let zblob = await data.blob(); const zip = new JSZip(); await zip.loadAsync(zblob); let folderText = ``; let fileText = ``; zip.forEach((relativePath, zipEntry) => { let slashIdx = relativePath.indexOf('/'); if(slashIdx == -1 || slashIdx == relativePath.length -1){ if(zipEntry.dir){ folderText += `(ํด๋”) ${zipEntry.name.split('/')[0]} \n`; }else{ fileText += `(ํŒŒ์ผ) ${zipEntry.name} \n` } } }); if(!vars.lastListItem.dataset.resourcePath || vars.lastListItem.dataset.resourcePath != selectItem) return; let viewerText = document.createElement('div'); viewerText.classList.add('viewer-text'); viewerText.textContent = `${folderText}${(folderText == ``)?'':'\n'}${fileText}`; viewerTextWrap.appendChild(viewerText); vars.viewer.appendChild(viewerTextWrap); vars.viewer.dataset.viewerType = 'text'; }) } // ๋ทฐ ๋ Œ๋” ํ›„, ์„œ๋ฒ„ ์ƒํƒœ๋ฅผ ํ•œ๋ฒˆ ๋™๊ธฐํ™” await syncAiStateRestore(resourcePath, dataId); async function syncAiStateRestore(resourcePath, dataId) { if (!dataId) return; try { const res = await axios.get(`${vars.path_name}/summarizeState`, { params: { resourcePath, dataId } }); if (res.data.message === 'summarizeState_success') { const dataInfo = res.data.dataInfo; if (dataInfo) { updateAiButtonState(dataId, 'loading'); } else { updateAiButtonState(dataId, 'initial'); } } } catch(e) { console.warn(`์„œ๋ฒ„ ์ƒํƒœ ๋™๊ธฐํ™” ์‹คํŒจ (dataId: ${dataId}):`, e); updateAiButtonState(dataId, 'initial'); } } } export function resetViewer() { viewerContainer.style.display = 'none'; viewerContainer.dataset.resourcePath = ''; viewerContainer.dataset.dataId = ''; viewerNotice.style.display = 'flex'; if (!vars.viewer) return; if (vars.viewer.dataset.viewerType == 'pdf') { const iframe = vars.viewer.querySelector('.viewer iframe'); if (iframe) { const app = iframe.contentWindow?.PDFViewerApplication; app?.close?.(); iframe.remove(); } } if (vars.viewer.dataset.viewerType == 'image') { const imageWrap = vars.viewer.querySelector('.viewer-image-wrap'); if (imageWrap) { const image = imageWrap.querySelector('.viewer-image'); image.src = ''; image.remove(); imageWrap.remove(); } } if (vars.viewer.dataset.viewerType == 'video') { const videoWrap = vars.viewer.querySelector('.viewer-video-wrap'); if (videoWrap) { const video = vars.viewer.querySelector('.viewer-video'); video.pause(); video.src = ''; video.load(); video.remove(); videoWrap.remove(); } } if (vars.viewer.dataset.viewerType == 'text') { const textWrap = vars.viewer.querySelector('.viewer-text-wrap'); if (textWrap) { textWrap.remove(); } } if (vars.viewer.dataset.viewerType == '3d') { const viewer3d = vars.viewer.querySelector('.viewer-3d'); if (viewer3d) { viewer3d.remove(); } } if (vars.viewer.dataset.viewerType == 'excel') { if (window.luckysheet) { try { window.luckysheet.destroy(); } catch (e) { console.error("Luckysheet destroy error: ", e); } } } vars.viewer.dataset.viewerType = ''; } export function renderContextmenu(event, scope) { /* depth1 ํด๋” ์šฐํด๋ฆญ ๋ฉ”๋‰ด ํŠธ๋ฆฌ ์šฐํด๋ฆญ ๋ฉ”๋‰ด ๋ฆฌ์ŠคํŠธ ์šฐํด๋ฆญ ๋ฉ”๋‰ด - ์ƒˆ ํด๋” - ํŒŒ์ผ ์—…๋กœ๋“œ - ์ด๋ฆ„ ๋ณ€๊ฒฝ - ์ด๋ฆ„ ๋ณ€๊ฒฝ - ์ด๋ฆ„ ๋ณ€๊ฒฝ - ๋‹ค์šด๋กœ๋“œ - ๋‹ค์šด๋กœ๋“œ - ๋‹ค์šด๋กœ๋“œ - ์ด๋™ - ์‚ญ์ œ - ์‚ญ์ œ - ์‚ญ์ œ - ๊ถŒํ•œ์„ค์ •(?) - ๊ถŒํ•œ์„ค์ • - ๋‹ด๋‹น์ž ๋ณ€๊ฒฝ * ํŠธ๋ฆฌ ์ด๋™ : depth3 ํด๋”๋Š” depth2 ํด๋” ์„ ํƒํ•ด์„œ ์ด๋™, depth2 ํด๋”๋Š” depth1 ํด๋” ์„ ํƒํ•ด์„œ ์ด๋™ * ๋ฆฌ์ŠคํŠธ ์ด๋™ : depth3 ํด๋” ์„ ํƒํ•ด์„œ ์ด๋™ * ๋‹ค๋ฅธ depth1 ํด๋” ๋‚ด์˜ ํด๋”๋กœ๋„ ์ด๋™ํ•˜๋„๋ก ํ•ด์•ผ๋ ๊นŒ? * depth1 ํด๋” ํด๋” ์—…๋กœ๋“œ : depth1 - depth2 - depth3 - files ์ˆœ์„œ๋กœ ๊ตฌ์„ฑ๋œ ํด๋” ์—…๋กœ๋“œ ํ•˜๋„๋ก ๊ฐ€์ด๋“œ ํ‘œ์‹œ ๊ฐ€์ด๋“œ ์ง€์ผœ์ง€์ง€ ์•Š๋Š” ๊ฒฝ์šฐ depth1, depth2์— ํฌํ•จ๋œ ํŒŒ์ผ ๋ฐ depth3์— ํฌํ•จ๋œ ํด๋” ๋ฌด์‹œ * ํŠธ๋ฆฌ ํด๋” ์—…๋กœ๋“œ (depth2) : depth2 - depth3 - files ์ˆœ์„œ๋กœ ๊ตฌ์„ฑ๋œ ํด๋” ์—…๋กœ๋“œ ํ•˜๋„๋ก ๊ฐ€์ด๋“œ ํ‘œ์‹œ ๊ฐ€์ด๋“œ ์ง€์ผœ์ง€์ง€ ์•Š๋Š” ๊ฒฝ์šฐ depth2์— ํฌํ•จ๋œ ํŒŒ์ผ ๋ฐ depth3์— ํฌํ•จ๋œ ํด๋” ๋ฌด์‹œ * ํŠธ๋ฆฌ ํด๋” ์—…๋กœ๋“œ (depth3) : depth3 - files ์ˆœ์„œ๋กœ ๊ตฌ์„ฑ๋œ ํด๋” ์—…๋กœ๋“œ ํ•˜๋„๋ก ๊ฐ€์ด๋“œ ํ‘œ์‹œ ๊ฐ€์ด๋“œ ์ง€์ผœ์ง€์ง€ ์•Š๋Š” ๊ฒฝ์šฐ depth3์— ํฌํ•จ๋œ ํด๋” ๋ฌด์‹œ */ // addContextmenuItem('createFolder'); // addContextmenuItem('uploadFolder', true); // addContextmenuItem('uploadFile', true); // addContextmenuItem('renameTarget'); // addContextmenuItem('downloadTarget'); // addContextmenuItem('deleteTarget'); // addContextmenuItem('relocateTarget'); // addContextmenuItem('setPermission'); // addContextmenuItem('editAuthor'); // addContextmenuItem('lev_1'); // addContextmenuItem('lev_2'); // addContextmenuItem('lev_4'); // addContextmenuItem('lev_8'); // addContextmenuItem('lev_0'); let contextmenu = document.querySelector('.contextmenu.main-menu'); contextmenu.style.display = "none"; let contextmenuContainer = contextmenu.querySelector('.contextmenu-container'); contextmenuContainer.innerHTML = ''; let userInfo = JSON.parse(vars.userInfoString); let isRecycleBinModal = document.querySelector('.recycle-bin-modal').style.display == 'flex'; // ** ๊ถŒํ•œ ๊ด€๋ จ if (!vars.permission.checkPermission('context-menu-viewer')) { addContextmenuWarn('viewer'); } else { if (scope == 'headerBtn') { // ** ๊ถŒํ•œ ๊ด€๋ จ if (!vars.permission.checkPermission('context-menu-sub-master')) { addContextmenuWarn('min-sub-master'); } else { // addContextmenuItem('createFolder'); addContextmenuItem('renameTarget'); // addContextmenuItem('deleteTarget'); addContextmenuItem('removeTarget'); addContextmenuItem('setPermission'); if(vars.permission.checkPermission('download-folder')) addContextmenuItem('downloadTarget-folder'); } } if (scope == 'tree') { addContextmenuItem('createFolder'); } if (scope == 'tree-item-wrap-depth2') { addContextmenuItem('createFolder'); // addContextmenuItem('createFolder-drawing'); // addContextmenuItem('createFolder-gallery'); addContextmenuItem('renameTarget'); // addContextmenuItem('deleteTarget'); addContextmenuItem('removeTarget'); // ** ๊ถŒํ•œ ๊ด€๋ จ if (vars.permission.checkPermission('context-menu-sub-master')) addContextmenuItem('setPermission'); if(vars.permission.checkPermission('download-folder')) addContextmenuItem('downloadTarget-folder'); } if (scope == 'tree-item-wrap-depth3') { addContextmenuItem('renameTarget'); // addContextmenuItem('deleteTarget'); addContextmenuItem('removeTarget'); // ** ๊ถŒํ•œ ๊ด€๋ จ if (vars.permission.checkPermission('context-menu-sub-master')) addContextmenuItem('setPermission'); if(vars.permission.checkPermission('download-folder')) addContextmenuItem('downloadTarget-folder'); } if (scope == 'list') { // ๊ฐค๋Ÿฌ๋ฆฌ ํด๋” ์ง€๋„๋ชจ๋“œ์ผ ๋•Œ ์•ˆ๋‚ด ํ‘œ์‹œ ๋ฐ ๋ฆฌํ„ด let mapContainer = listContainer?.querySelector('.map-container'); if (mapContainer.style.display == 'flex') { let notificatitonParams = { text: '์ง€๋„๋ชจ๋“œ์—์„œ๋Š” ์šฐํด๋ฆญ ๊ธฐ๋Šฅ์ด ์ œํ•œ๋ฉ๋‹ˆ๋‹ค.' } showNotification(notificatitonParams); return; } addContextmenuItem('uploadFile', true, event); } if (scope == 'list-item') { // ํŒŒ์ผ ์ด๋™ ๋ชจ๋“œ์ธ ๊ฒฝ์šฐ ๋ฆฌํ„ด if (document.querySelector('.list-viewer-cover').style.display == 'flex') return; if (isRecycleBinModal) { addContextmenuItem('downloadTarget'); addContextmenuItem('deleteTarget'); } else { let listItem = event.target.closest('.list-item'); let state = listItem.getElementsByClassName('state')[0]; if (state && state.classList.contains('working')) { // ์šฐํด๋ฆญํ•œ ํŒŒ์ผ์ด ์ž‘์—…์ค‘์ธ ๊ฒฝ์šฐ ๊ฒฝ๊ณ  ํ‘œ์‹œ addContextmenuItem('uploadFile', true); addContextmenuWarn('working'); } else { let existsWorkingListItem; Array.from(listItem.getElementsByClassName('state')).forEach(state => { if (state.classList.contains('working')) existsWorkingListItem = true; }) if (existsWorkingListItem) { // ์šฐํด๋ฆญํ•œ ํŒŒ์ผ์˜ ์ถ”๊ฐ€ ํŒŒ์ผ์ค‘์— ์ž‘์—…์ค‘์ธ ํŒŒ์ผ์ด ์žˆ๋Š” ๊ฒฝ์šฐ ๊ฒฝ๊ณ  ํ‘œ์‹œ addContextmenuItem('uploadFile', true); addContextmenuWarn('includesWorking'); } else { addContextmenuItem('uploadFile', true); addContextmenuItem('addOn_version', true); addContextmenuItem('addOn_attachment', true); if (listItem.classList.contains('dwg') || listItem.classList.contains('dxf')) { //// ๋„๋ฉด ctb xref ๊ด€๋ จ ์ฝ”๋“œ // addContextmenuItem('addOn_ctb', true); // addContextmenuItem('addOn_xref', true); } addContextmenuItem('renameTarget'); addContextmenuItem('editAuthor'); addContextmenuItem('downloadTarget'); addContextmenuItem('relocateTarget'); // ํŒŒ์ผ์ด๋™ addContextmenuItem('removeTarget'); } } } if (!isRecycleBinModal && userInfo.group == 'dev') { addContextmenuItem('mgmtFunc_resetConvert'); } // ๋‹ค์ค‘์‚ญ์ œ, ๋‹ค์ค‘์ด๋™ ์‹œ ์ปจํ…์ŠคํŠธ๋ฉ”๋‰ด ์ถ”๊ฐ€ } if (scope == 'grid-item') { let gridItem = event.target.closest('.grid-item'); // ํŒŒ์ผ ์ด๋™ ๋ชจ๋“œ์ธ ๊ฒฝ์šฐ ๋ฆฌํ„ด if (document.querySelector('.list-viewer-cover').style.display == 'flex') return; addContextmenuItem('uploadFile', true, event); if (gridItem.classList.contains('dwg') || gridItem.classList.contains('dxf')) { //// ๋„๋ฉด ctb xref ๊ด€๋ จ ์ฝ”๋“œ // addContextmenuItem('addOn_ctb', true); // addContextmenuItem('addOn_xref', true); } addContextmenuItem('renameTarget'); addContextmenuItem('editAuthor'); addContextmenuItem('downloadTarget'); addContextmenuItem('relocateTarget'); // ํŒŒ์ผ์ด๋™ addContextmenuItem('removeTarget'); } if (scope == 'map-item') { // ๊ฐค๋Ÿฌ๋ฆฌ ํด๋” ์ง€๋„๋ชจ๋“œ์ผ ๋•Œ ์•ˆ๋‚ด ํ‘œ์‹œ ๋ฐ ๋ฆฌํ„ด let mapContainer = listContainer?.querySelector('.map-container'); if (mapContainer.style.display == 'flex') { let notificatitonParams = { text: '์ง€๋„๋ชจ๋“œ์—์„œ๋Š” ์šฐํด๋ฆญ ๊ธฐ๋Šฅ์ด ์ œํ•œ๋ฉ๋‹ˆ๋‹ค.' } showNotification(notificatitonParams); return; } // addContextmenuItem('uploadFile', true, event); // addContextmenuItem('renameTarget'); // addContextmenuItem('downloadTarget'); // addContextmenuItem('relocateTarget'); // ํŒŒ์ผ์ด๋™ // addContextmenuItem('removeTarget'); } if (scope == 'sub-list-item') { let listItem = event.target.closest('.list-item'); // ์ถ”๊ฐ€ ํŒŒ์ผ์— disabled ํด๋ž˜์Šค๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์œผ๋ฉด ๋ฆฌํ„ด (ํŒŒ์ผ ์ด๋™ ๋ชจ๋“œ) if (listItem.classList.contains('disabled')) return; let state = listItem.getElementsByClassName('state')[0]; if (state && state.classList.contains('working')) { // ์šฐํด๋ฆญํ•œ ์ถ”๊ฐ€ ํŒŒ์ผ์ด ์ž‘์—…์ค‘์ธ ๊ฒฝ์šฐ ๊ฒฝ๊ณ  ํ‘œ์‹œ addContextmenuWarn('working'); } else { addContextmenuItem('renameTarget'); addContextmenuItem('editAuthor'); addContextmenuItem('downloadTarget'); addContextmenuItem('relocateTarget'); addContextmenuItem('removeTarget'); // addContextmenuItem('deleteTarget'); } if (userInfo.group == 'dev') addContextmenuItem('mgmtFunc_resetConvert'); // ๋‹ค์ค‘์‚ญ์ œ, ๋‹ค์ค‘์ด๋™ ์‹œ ์ปจํ…์ŠคํŠธ๋ฉ”๋‰ด ์ถ”๊ฐ€ } if (scope == 'multi-select-list') { if (isRecycleBinModal) { addContextmenuItem('downloadTarget'); addContextmenuItem('deleteTarget'); } else { let existsWorkingListItem; let existsMainListItem; let extArr = []; vars.multiSelectListItemArr.map(listItem => { if (listItem.classList.contains('main-list-item')) { existsMainListItem = true; Array.from(listItem.getElementsByClassName('state')).forEach(state => { if (state.classList.contains('working')) existsWorkingListItem = true; }) let resourcePath = listItem.dataset.resourcePath; let isLowerExt = true; let ext = splitBaseAndExt(resourcePath, isLowerExt).ext; extArr.push(ext); } else { let state = listItem.getElementsByClassName('state')[0]; if (state && state.classList.contains('working')) existsWorkingListItem = true; } }) // ํ™•์žฅ์ž ๋ฐฐ์—ด ๋‚ด์—์„œ ์ค‘๋ณต์š”์†Œ ์ œ๊ฑฐ extArr = extArr.filter((element, index) => { return extArr.indexOf(element) === index; }); if (existsWorkingListItem) { // vars.multiSelectListItemArr์— ํฌํ•จ๋œ ํŒŒ์ผ ํ˜น์€ ํŒŒ์ผ์˜ ์ถ”๊ฐ€ ํŒŒ์ผ์ค‘์— ์ž‘์—…์ค‘์ธ ํŒŒ์ผ์ด ์žˆ๋Š” ๊ฒฝ์šฐ ๊ฒฝ๊ณ  ํ‘œ์‹œ addContextmenuWarn('includesWorking'); } else { // ๋„๋ฉด ํ™•์žฅ์ž let drawingExtArr = ['dwg', 'dxf']; // ํ™•์žฅ์ž ๋ฐฐ์—ด์— ๋„๋ฉด ํ™•์žฅ์ž๋“ค๋งŒ ๋“ค์–ด์žˆ๋Š”์ง€ ํ™•์ธ let isDrawingExtMatch = (extArr, drawingExtArr) => { let extArrSet = new Set(extArr); // ์ตœ์†Œ 1๊ฐœ ์ด์ƒ ์žˆ์–ด์•ผ ํ•จ if (extArrSet.size === 0) return false; // extArrSet์ด drawingExtArr์˜ ๋ถ€๋ถ„์ง‘ํ•ฉ์ธ์ง€ ํ™•์ธ for (let ext of extArrSet) { if (!drawingExtArr.includes(ext)) return false; } return true; }; // ์šฐํด๋ฆญ ํ•œ ๋Œ€์ƒ์ด main-list-item์ด๊ณ , ํ™•์žฅ์ž ๋ฐฐ์—ด์— ๋„๋ฉด ํ™•์žฅ์ž๋“ค๋งŒ ๋“ค์–ด์žˆ์œผ๋ฉด 'CTBํŒŒ์ผ ์ผ๊ด„ ์ถ”๊ฐ€', 'XREFํŒŒ์ผ ์ผ๊ด„ ์ถ”๊ฐ€' ๋ฉ”๋‰ด ์ถ”๊ฐ€ let listItem = event.target.closest('.list-item'); if (listItem.classList.contains('main-list-item') && isDrawingExtMatch(extArr, drawingExtArr)) { //// ๋„๋ฉด ctb xref ๊ด€๋ จ ์ฝ”๋“œ // addContextmenuItem('addOn_ctb_bulk', true); // addContextmenuItem('addOn_xref_bulk', true); } addContextmenuItem('editAuthor'); addContextmenuItem('downloadTarget'); addContextmenuItem('removeTarget'); addContextmenuItem('relocateTarget'); } // addContextmenuItem('deleteTarget'); } } } contextmenu.style.display = "flex"; contextmenu.style.left = event.clientX + 5 + "px"; contextmenu.style.top = event.clientY + 10 + "px"; // ํŽธ์˜์„ฑ - contextmenu๊ฐ€ ํ™”๋ฉด ์˜์—ญ ์•„๋ž˜/์˜†์œผ๋กœ ๋“ค์–ด๊ฐ€์ง€ ์•Š๋„๋ก ์œ„์น˜ ์กฐ์ • if (contextmenu.offsetHeight + event.clientY > window.innerHeight) { contextmenu.style.top = (event.clientY - contextmenu.offsetHeight) + "px"; } if (contextmenu.offsetWidth + event.clientX > window.innerWidth) { contextmenu.style.left = (event.clientX - contextmenu.offsetWidth) + "px"; } function addContextmenuWarn(target) { // target : min-sub-master (๋ถ€๊ด€๋ฆฌ์ž ๋ฏธ๋งŒ) / viewer (์ฐธ๊ด€์ž) let html; if (target == 'min-sub-master') html = `์ƒ๋‹จ ๋ฉ”๋‰ด์˜ ์ƒ์„ฑ/ํŽธ์ง‘/์‚ญ์ œ๋Š” ๋ถ€๊ด€๋ฆฌ์ž ๊ถŒํ•œ ์ด์ƒ์—์„œ๋งŒ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.`; if (target == 'viewer') html = `์ฐธ๊ด€์ž ๊ถŒํ•œ์€ ์—ด๋žŒ๋งŒ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.`; if (target == 'working') html = `๋ณ€ํ™˜์ค‘์ธ ํŒŒ์ผ์€ ํŽธ์ง‘/์‚ญ์ œ๊ฐ€ ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.`; if (target == 'includesWorking') html = `์„ ํƒํ•œ ํŒŒ์ผ ๋˜๋Š” ๊ด€๋ จ๋œ ๋ฒ„์ „/์ฒจ๋ถ€ ํŒŒ์ผ ์ค‘ ๋ณ€ํ™˜์ค‘์ธ ํ•ญ๋ชฉ์ด ์žˆ์–ด ํŽธ์ง‘/์‚ญ์ œ๊ฐ€ ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.`; let contextmenuWarn = document.createElement('div'); contextmenuWarn.classList.add('contextmenu-warn'); contextmenuWarn.classList.add('contextmenu-padding'); contextmenuContainer.appendChild(contextmenuWarn); let wrap = document.createElement('div'); wrap.classList.add('wrap'); let text = document.createElement('div'); text.classList.add('text'); text.innerHTML = html; wrap.appendChild(text); contextmenuWarn.appendChild(wrap); } function addContextmenuItem(id, useInputFile, event) { let menuData = getMenuData(id); let contextmenuItem = document.createElement('div'); contextmenuItem.id = id; contextmenuItem.classList.add('contextmenu-item'); let img = document.createElement('img'); let imgFileName = id.replace('_bulk', ''); img.src = `/main/img/archive/contextmenu/${imgFileName}.svg`; img.alt = `${imgFileName}_icon`; let wrap = document.createElement('div'); wrap.classList.add('wrap'); let name = document.createElement('div'); name.classList.add('name'); name.innerText = menuData.menuNameKor; wrap.appendChild(name); // let shortcut; // if (menuData.shortcut) { // shortcut = document.createElement('div'); // shortcut.classList.add('shortcut'); // shortcut.innerText = menuData.shortcut; // wrap.appendChild(shortcut); // } if (id == 'removeTarget' && vars.lastContextTarget.matches('.folder')) { img.src = `/main/img/archive/contextmenu/deleteTarget.svg`; img.alt = `deleteTarget_icon`; name.innerText = '์‚ญ์ œ'; } if (useInputFile) { let isGalleryFolder = false, isDrawingFolder = false; if (vars.lastFolderType == 'gallery') isGalleryFolder = true; if (vars.lastFolderType == 'drawing') isDrawingFolder = true; let form = document.createElement('form'); form.classList.add('btn'); form.enctype = 'multipart/form-data'; let input = document.createElement('input'); input.type = 'file'; input.id = `${id}Input`; if (id.includes('File') || id.includes('addOn')) { input.setAttribute('multiple', ''); input.setAttribute('onclick', 'this.value=null;'); } if (id.includes('Folder')) { input.setAttribute('webkitdirectory', ''); input.setAttribute('directory', ''); input.setAttribute('onclick', 'this.value=null;'); } let label = document.createElement('label'); label.id = `${id}Label`; label.classList.add('contextmenu-padding'); label.setAttribute('for', `${id}Input`); label.appendChild(img); label.appendChild(wrap); form.appendChild(input); form.appendChild(label); contextmenuItem.appendChild(form); } else { contextmenuItem.classList.add('contextmenu-padding'); contextmenuItem.appendChild(img); contextmenuItem.appendChild(wrap); if (id == 'createFolder') { // ์ƒˆ ํด๋” ๋ฉ”๋‰ด์— ๋งˆ์šฐ์Šค์˜ค๋ฒ„ ์‹œ ํด๋” ๋งŒ๋“ค์–ด์ง€๋Š” ๊ฒฝ๋กœ ํˆดํŒ ํ‘œ์‹œ? contextmenuItem.addEventListener('mouseover', (e) => { // console.log(e.target); // console.log('์ƒˆ ํด๋”'); }) } if (id == 'relocateTarget') { } if (id == 'setPermission') { contextmenuItem.classList.add('mouseover'); let toggle = document.createElement('div'); toggle.classList.add('image'); toggle.classList.add('toggle'); wrap.appendChild(toggle); let subContextmenu = document.createElement('div'); subContextmenu.classList.add('contextmenu'); subContextmenu.classList.add('sub-menu'); let subContextmenuContainer = document.createElement('div'); subContextmenuContainer.classList.add('contextmenu-container'); let resourcePath = vars.lastContextTarget.dataset.resourcePath; let data = getDataFromTreeObject(resourcePath, 'folder').data; let dataPermission = data.permission; let lev1 = getSubContextmenuItem('lev_1', dataPermission); // let lev2 = getSubContextmenuItem('lev_2', dataPermission); let lev4 = getSubContextmenuItem('lev_4', dataPermission); let lev8 = getSubContextmenuItem('lev_8', dataPermission); let lev0 = getSubContextmenuItem('lev_0', dataPermission); subContextmenuContainer.appendChild(lev1); // subContextmenuContainer.appendChild(lev2); subContextmenuContainer.appendChild(lev4); subContextmenuContainer.appendChild(lev8); subContextmenuContainer.appendChild(lev0); subContextmenu.appendChild(subContextmenuContainer); contextmenuItem.appendChild(subContextmenu); // ๊ถŒํ•œ ์„ค์ • ๋ฉ”๋‰ด ๋งˆ์šฐ์Šค์˜ค๋ฒ„ ์‹œ ํ•˜์œ„ ๋ฉ”๋‰ด ํ‘œ์‹œ document.addEventListener('mousemove', throttle((e) => { if (document.querySelector('.contextmenu.main-menu').style.display == 'flex') { let subMenu = document.querySelector('.contextmenu.sub-menu'); if (!subMenu) return; if (e.target.id == 'setPermission' || subMenu.contains(e.target)) { subMenu.style.display = 'flex'; let parentHeight = subMenu.parentElement.offsetHeight; //ํŽธ์˜์„ฑ - subMenu๊ฐ€ ํ™”๋ฉด ์˜์—ญ ์•„๋ž˜๋กœ ๋“ค์–ด๊ฐ€์ง€ ์•Š๋„๋ก ์œ„์น˜ ์กฐ์ • if (subMenu.offsetHeight + e.clientY > window.innerHeight) { subMenu.style.top = `-${subMenu.offsetHeight - parentHeight - 4}px`; } } else { subMenu.style.display = 'none'; } } }, 100)) } } contextmenuContainer.appendChild(contextmenuItem); contextmenuItem.addEventListener('click', (e) => { let targetId = e.target.id; let resourcePath, dataId; let lastContextTarget; let isRecycleBinModal = document.querySelector('.recycle-bin-modal').style.display == 'flex'; if (isRecycleBinModal) { lastContextTarget = vars.lastContextTarget_bin; } else { lastContextTarget = vars.lastContextTarget; } if (lastContextTarget) resourcePath = lastContextTarget.dataset.resourcePath; if (lastContextTarget) dataId = lastContextTarget.dataset.id; if (targetId == 'createFolder') openCreateFolderModal(resourcePath); if (targetId == 'renameTarget') openRenameModal(resourcePath); // if (targetId == 'downloadTarget') downloadTarget(); if (targetId == 'downloadTarget') openDownloadModal(resourcePath); if (targetId == 'downloadTarget-folder') openDownloadModal(resourcePath); if (targetId == 'relocateTarget') toggleRelocateCover(true, resourcePath); if (targetId == 'removeTarget') openRemoveModal(resourcePath); if (targetId == 'deleteTarget') openDeleteModal(resourcePath); // if (targetId == 'setPermission') if (targetId == 'editAuthor') openEditAuthorModal(resourcePath); if (targetId == 'lev_1') setDataPermission(resourcePath, targetId); // if (targetId == 'lev_2') if (targetId == 'lev_4') setDataPermission(resourcePath, targetId); if (targetId == 'lev_8') setDataPermission(resourcePath, targetId); if (targetId == 'lev_0') setDataPermission(resourcePath, targetId); if (targetId == 'mgmtFunc_resetConvert') mgmtFunc_resetConvert(resourcePath, dataId); }) contextmenuItem.addEventListener('change', (e) => { let uploadDataOption = { functionId: id, dataType: 'file', } if (id == 'uploadFile') { // console.log(111); let files = e.target.files; uploadData(files, uploadDataOption); // ์ปจํ…์ŠคํŠธ๋ฉ”๋‰ด ์ดˆ๊ธฐํ™” contextmenu.querySelector('.contextmenu-container').innerHTML = ''; } if (id == 'addOn_version' || id == 'addOn_attachment') { // console.log(222); let files = e.target.files; let uploadDataOption = { functionId: id, dataType: 'file', addOnTarget: vars.lastContextTarget.dataset.resourcePath } uploadData(files, uploadDataOption); // ์ปจํ…์ŠคํŠธ๋ฉ”๋‰ด ์ดˆ๊ธฐํ™” contextmenu.querySelector('.contextmenu-container').innerHTML = ''; } //// ๋„๋ฉด ctb xref ๊ด€๋ จ ์ฝ”๋“œ if (id.includes('addOn_ctb') || id.includes('addOn_xref')) { // console.log(333); // vars.multiSelectListItemArr ์œผ๋กœ ๋ฐฐ์—ด ๋Œ๋ ค์„œ ์•„๋ž˜ uploadData๋ฅผ ์—ฌ๋Ÿฌ๋ฒˆ ์‹คํ–‰? // let files = e.target.files // let uploadDataOption = { // functionId: id, // dataType: 'file', // addOnTarget: vars.lastContextTarget.dataset.resourcePath // } // uploadData(files, uploadDataOption); // // ์ปจํ…์ŠคํŠธ๋ฉ”๋‰ด ์ดˆ๊ธฐํ™” // contextmenu.querySelector('.contextmenu-container').innerHTML = ''; } }) } function getSubContextmenuItem(id, dataPermission) { let menuData = getMenuData(id); let subContextmenuItem = document.createElement('div'); subContextmenuItem.id = id; subContextmenuItem.classList.add('contextmenu-item'); subContextmenuItem.classList.add('contextmenu-padding'); subContextmenuItem.classList.add('set-permission-item'); // ** ๊ถŒํ•œ ๊ด€๋ จ (ํด๋ž˜์Šค์—๋Š” ํฌํ•จ ์•ˆ๋  ์˜ˆ์ •) // id : lev_1, lev_2, lev_4, lev_8, lev_0 if (id.split('_')[1] == dataPermission) subContextmenuItem.classList.add('check'); let img = document.createElement('img'); img.src = `/main/img/permission/${menuData.menuNameEng}.svg`; img.alt = `${id}_icon`; let wrap = document.createElement('div'); wrap.classList.add('wrap'); let name = document.createElement('div'); name.classList.add('name'); name.innerText = menuData.menuNameKor; let image = document.createElement('div'); image.classList.add('image'); wrap.appendChild(name); wrap.appendChild(image); subContextmenuItem.appendChild(img); subContextmenuItem.appendChild(wrap); return subContextmenuItem; } function getMenuData(id) { let result = { menuNameKor: undefined, shortcut: undefined }; if (id == 'createFolder') result.menuNameKor = '์ƒˆ ํด๋”', result.shortcut = 'Ctrl '; if (id == 'uploadFolder') result.menuNameKor = 'ํด๋” ์—…๋กœ๋“œ', result.shortcut = 'Ctrl '; if (id == 'uploadFile') result.menuNameKor = 'ํŒŒ์ผ ์—…๋กœ๋“œ', result.shortcut = 'Ctrl '; // if (id == 'uploadFile') result.menuNameKor = 'ํ˜„์žฌ ํด๋”์— ํŒŒ์ผ ์—…๋กœ๋“œ', result.shortcut = 'Ctrl '; if (id == 'addOn_version') result.menuNameKor = '๋ฒ„์ „ํŒŒ์ผ ์ถ”๊ฐ€', result.shortcut = 'Ctrl '; if (id == 'addOn_attachment') result.menuNameKor = '์ฒจ๋ถ€ํŒŒ์ผ ์ถ”๊ฐ€', result.shortcut = 'Ctrl '; if (id == 'addOn_ctb') result.menuNameKor = 'CTBํŒŒ์ผ ์ถ”๊ฐ€', result.shortcut = 'Ctrl '; if (id == 'addOn_xref') result.menuNameKor = 'XREFํŒŒ์ผ ์ถ”๊ฐ€', result.shortcut = 'Ctrl '; if (id == 'addOn_ctb_bulk') result.menuNameKor = 'CTBํŒŒ์ผ ์ผ๊ด„ ์ถ”๊ฐ€', result.shortcut = 'Ctrl '; if (id == 'addOn_xref_bulk') result.menuNameKor = 'XREFํŒŒ์ผ ์ผ๊ด„ ์ถ”๊ฐ€', result.shortcut = 'Ctrl '; if (id == 'renameTarget') result.menuNameKor = '์ด๋ฆ„ ๋ณ€๊ฒฝ', result.shortcut = 'F2'; if (id == 'relocateTarget') result.menuNameKor = '์œ„์น˜ ์ด๋™', result.shortcut = 'Ctrl '; if (id == 'downloadTarget') result.menuNameKor = '๋‹ค์šด๋กœ๋“œ', result.shortcut = 'Ctrl '; if (id == 'downloadTarget-folder') result.menuNameKor = 'ํด๋”๋‹ค์šด๋กœ๋“œ(๊ด€๋ฆฌ์ž)', result.shortcut = 'Ctrl '; if (id == 'removeTarget') result.menuNameKor = 'ํœด์ง€ํ†ต์œผ๋กœ ์ด๋™', result.shortcut = 'Del'; if (id == 'deleteTarget') result.menuNameKor = '์‚ญ์ œ', result.shortcut = 'Del'; if (id == 'editAuthor') result.menuNameKor = '์ž‘์„ฑ์ž ๋ณ€๊ฒฝ', result.shortcut = 'Ctrl '; if (id == 'setPermission') result.menuNameKor = '๊ถŒํ•œ ์„ค์ •'; if (id == 'lev_1') result.menuNameKor = '์ฐธ๊ด€์ž', result.menuNameEng = 'viewer'; // if (id == 'lev_2') result.menuNameKor = '์—…๋กœ๋”'; if (id == 'lev_4') result.menuNameKor = '์ผ๋ฐ˜์ฐธ์—ฌ์ž', result.menuNameEng = 'worker'; if (id == 'lev_8') result.menuNameKor = '๋ณด์•ˆ์ฐธ์—ฌ์ž', result.menuNameEng = 'security-worker'; if (id == 'lev_0') result.menuNameKor = '๋ถ€๊ด€๋ฆฌ์ž', result.menuNameEng = 'sub-master'; if (id == 'mgmtFunc_resetConvert') result.menuNameKor = '(๊ฐœ๋ฐœ์ž) ๋ณ€ํ™˜ ์ดˆ๊ธฐํ™”'; return result; } } export async function renderSizeBar() { if (checkProjectInactive()) return; // return; let getFolderSizeParams = { storageType: vars.storageType }; let getFolderSizeRes = await axios.get(`${vars.path_name}/getFolderSize`, { params: { params: getFolderSizeParams } }); if (getFolderSizeRes.data.message == 'getFolderSize_success') { let result = getFolderSizeRes.data.result; let totalSize = 0, totalCount = 0; for(let i = 0; i < result.length; i++) { let item = result[i]; let key = item.key; let size = Number(item.size); let count = Number(item.count); item.text = getSizeText(key); totalSize += size, totalCount += count; } vars.bucketSize = totalSize; vars.remainingSize = vars.bucketMaxSize - vars.bucketSize; vars.foldersSize = result; //// ์šฉ๋Ÿ‰ / ์ตœ๋Œ€์šฉ๋Ÿ‰, ์šฉ๋Ÿ‰ ๋ง‰๋Œ€, ํผ์„ผํŠธ ์ ์šฉ ๋ฒ„์ „ // let footerSizeWrap = document.querySelector('body > .footer .left .size-wrap'); // let sizeTextNumerator = footerSizeWrap.querySelector('.size-text .numerator'); // let sizeTextDenominator = footerSizeWrap.querySelector('.size-text .denominator'); // let sizeBarBase = footerSizeWrap.querySelector('.size-bar .base'); // let sizeBarValue = footerSizeWrap.querySelector('.size-bar .value'); // let sizePercent = footerSizeWrap.querySelector('.size-percent'); // // ์‚ฌ์šฉ์ค‘์ธ ์šฉ๋Ÿ‰ / ์ตœ๋Œ€ ์šฉ๋Ÿ‰ ํ…์ŠคํŠธ // sizeTextNumerator.innerHTML = formatBytes(vars.bucketSize); // sizeTextDenominator.innerHTML = formatBytes(vars.bucketMaxSize); // // ์ตœ๋Œ€ ์šฉ๋Ÿ‰ ๋Œ€๋น„ ์‚ฌ์šฉ์ค‘์ธ ์šฉ๋Ÿ‰ ๋น„์œจ // let usageRatio = (vars.project) ? vars.bucketSize / vars.bucketMaxSize : 0; // // ์ตœ๋Œ€ ์šฉ๋Ÿ‰ ๋ง‰๋Œ€ ๊ธธ์ด // let sizeBarBaseLength = sizeBarBase.offsetWidth; // // ์‚ฌ์šฉ์ค‘์ธ ์šฉ๋Ÿ‰ ๋ง‰๋Œ€ ๊ธธ์ด // let sizeBarValueLength = sizeBarBaseLength * usageRatio; // if (sizeBarValueLength > sizeBarBaseLength) sizeBarValueLength = sizeBarBaseLength; // sizeBarValue.style.width = `${sizeBarValueLength}px`; // // ์ตœ๋Œ€ ์šฉ๋Ÿ‰ ๋Œ€๋น„ ์‚ฌ์šฉ์ค‘์ธ ์šฉ๋Ÿ‰ ํผ์„ผํŠธ // let usagePercent = usageRatio * 100; // sizePercent.innerText = `${formatPercent(usagePercent)} %`; // if (usagePercent > 90) { // sizeTextNumerator.classList.add('over'); // sizeBarValue.classList.add('over'); // sizePercent.classList.add('over'); // } else { // sizeTextNumerator.classList.remove('over'); // sizeBarValue.classList.remove('over'); // sizePercent.classList.remove('over'); // } //// ํผ์„ผํŠธ ์ ์šฉ ๋ฒ„์ „ let footerSizeWrap = document.querySelector('body > .footer .left .size-wrap'); let sizePercent = footerSizeWrap.querySelector('.size-percent'); // ์ตœ๋Œ€ ์šฉ๋Ÿ‰ ๋Œ€๋น„ ์‚ฌ์šฉ์ค‘์ธ ์šฉ๋Ÿ‰ ๋น„์œจ let usageRatio = (vars.project) ? vars.bucketSize / vars.bucketMaxSize : 0; // ์ตœ๋Œ€ ์šฉ๋Ÿ‰ ๋Œ€๋น„ ์‚ฌ์šฉ์ค‘์ธ ์šฉ๋Ÿ‰ ํผ์„ผํŠธ let usagePercent = usageRatio * 100; sizePercent.innerText = `${formatPercent(usagePercent)} %`; if (usagePercent > 90) { sizePercent.classList.add('over'); } else { sizePercent.classList.remove('over'); } //// ๋ชจ๋‹ฌ ์ €์žฅ๊ณต๊ฐ„ ํŒŒ์ด๊ทธ๋ž˜ํ”„ let dom = document.querySelector('.archive-modal .modal-body .size-wrap .chart'); let chart = echarts.init(dom, null, { renderer: 'canvas', useDirtyRect: false }); let chartColor = { '์—ฌ์œ ๊ณต๊ฐ„': '#ccc', 'ํœด์ง€ํ†ต': '#777', '์•„์นด์ด๋ธŒ ์›๋ณธ': '#03AEFC', '์•„์นด์ด๋ธŒ ๋ณ€ํ™˜PDF': '#4DB251', '์•„์นด์ด๋ธŒ ๋ฏธ๋ฆฌ๋ณด๊ธฐPDF': '#FF3D00', '๊ณต๋ฌธ ์›๋ณธ': '#FFBF00', '๊ณต๋ฌธ ๋ณ€ํ™˜PDF': '#B92ED1', '๊ณผ์—…๊ฐœ์š”': '#4255BD' }; // rawData ๋ฐฐ์—ด์„ ์ƒ์„ฑํ•˜๊ณ , rowData๋ฅผ ๋‹ค์‹œ ์šฉ๋„๋ณ„ ๋ฐ์ดํ„ฐ ๋ฐฐ์—ด๋กœ ๊ฐ€๊ณต let rawData = [ { value: (vars.remainingSize < 0) ? 0 : vars.remainingSize, // ์—ฌ์œ ๊ณต๊ฐ„์ด 0๋ณด๋‹ค ์ž‘์œผ๋ฉด 0์œผ๋กœ ํ‘œ์‹œ name: `์—ฌ์œ ๊ณต๊ฐ„ (${formatBytes(vars.remainingSize)})`, itemStyle: { color: chartColor['์—ฌ์œ ๊ณต๊ฐ„'] } } ]; for (let i = 0; i < vars.foldersSize.length; i++) { let item = vars.foldersSize[i]; let obj = {}; if (item.size == 0) continue; obj.value = item.size; obj.name = `${item.text} (${formatBytes(item.size)} / ${item.count} ๊ฐœ)`; obj.itemStyle = { color: chartColor[item.text] }; rawData.push(obj); } // ํŒŒ์ด๊ทธ๋ž˜ํ”„์šฉ ์‹ค์ œ ๋ฐ์ดํ„ฐ let mainData = rawData.filter(d => d.value > 0); // ํŒŒ์ด๊ทธ๋ž˜ํ”„์šฉ ๋”๋ฏธ ๋ฐ์ดํ„ฐ let dummyData = rawData.filter(d => d.value <= 0).map(d => ({ ...d, name: `{over|${d.name}}`, value: 1 })); // ๋ฒ”๋ก€์šฉ ๋ฐ์ดํ„ฐ (์—ฌ์œ ๊ณต๊ฐ„์ด 0 ์ดํ•˜์ธ ๊ฒฝ์šฐ rich ์˜ต์…˜ ์‚ฌ์šฉ์„ ์œ„ํ•ด {style_name|} ์ถ”๊ฐ€) let legendData = rawData.map(d => ({ name: (d.value <= 0) ? `{over|${d.name}}` : d.name, icon: 'circle', })); // ํƒ€์ดํ‹€์šฉ ํ…์ŠคํŠธ (์—ฌ์œ ๊ณต๊ฐ„์ด 0 ์ดํ•˜์ธ ๊ฒฝ์šฐ rich ์˜ต์…˜ ์‚ฌ์šฉ์„ ์œ„ํ•ด {style_name|} ์ถ”๊ฐ€) // let titleText = (vars.remainingSize <= 0) // ? `{normal|์ „์ฒด๊ณต๊ฐ„ (${formatBytes(vars.bucketMaxSize)})} โ”‚ {normal|์‚ฌ์šฉ๊ณต๊ฐ„ (${formatBytes(vars.bucketSize)})} โ”‚ {over|์—ฌ์œ ๊ณต๊ฐ„ (${formatBytes(vars.remainingSize)})}` // : `์ „์ฒด๊ณต๊ฐ„ (${formatBytes(vars.bucketMaxSize)}) โ”‚ ์‚ฌ์šฉ๊ณต๊ฐ„ (${formatBytes(vars.bucketSize)}) โ”‚ ์—ฌ์œ ๊ณต๊ฐ„ (${formatBytes(vars.remainingSize)})` let titleText = (usagePercent > 90) ? `{normal|์ „์ฒด๊ณต๊ฐ„} {bold|${formatBytes(vars.bucketMaxSize)}}\n{normal|์‚ฌ์šฉ๊ณต๊ฐ„} {bold|${formatBytes(vars.bucketSize)}}\n{normal_over|์—ฌ์œ ๊ณต๊ฐ„} {bold_over|${formatBytes(vars.remainingSize)} (${formatPercent(usagePercent)} %)}` : `{normal|์ „์ฒด๊ณต๊ฐ„} {bold|${formatBytes(vars.bucketMaxSize)}}\n{normal|์‚ฌ์šฉ๊ณต๊ฐ„} {bold|${formatBytes(vars.bucketSize)}}\n{normal|์—ฌ์œ ๊ณต๊ฐ„} {bold|${formatBytes(vars.remainingSize)} (${formatPercent(usagePercent)} %)}` let option; let fontFamily = 'Pretendard Variable, Pretendard'; let fontSize = 12; let fontWeight = 600; option = { title: { text: titleText, // left: 'center', // top: 10, left: 20, top: 12, textStyle: { lineHeight: 30, rich: { // rich ์˜ต์…˜ normal: { fontFamily: fontFamily, fontSize: fontSize, color: '#000000' }, normal_over: { fontFamily: fontFamily, fontSize: fontSize, color: '#ff0000' }, bold: { fontFamily: fontFamily, fontSize: fontSize, color: '#000000', fontWeight: fontWeight }, bold_over: { fontFamily: fontFamily, fontSize: fontSize, color: '#ff0000', fontWeight: fontWeight }, } }, }, textStyle: { fontFamily: 'Pretendard Variable, Pretendard', fontSize: 12, }, tooltip: { trigger: 'item', formatter: function (params) { return `${params.marker} ${params.name}`; } }, legend: { orient: 'vertical', left: 20, bottom: 20, // top: 'middle', itemWidth: 16, itemHeight: 16, data: legendData, textStyle: { fontFamily: 'Pretendard Variable, Pretendard', fontSize: 12, rich: { // rich ์˜ต์…˜ over: { color: '#ccc' } } } }, series: [ { // ์‹ค์ œ ํŒŒ์ด ๊ทธ๋ž˜ํ”„ type: 'pie', radius: '60%', center: ['65%', '50%'], data: mainData, label: { formatter: function (params) { return `${params.name.split(' (')[0]}`; }, minMargin: 5, position: 'outer', alignTo: 'labelLine', bleedMargin: 20, }, labelLine: { show: true, length: 80, length2: 0, }, minAngle: 2, // ์ตœ์†Œ ๊ฐ๋„ ์„ค์ • itemStyle: { borderRadius: 4, borderColor: '#ffffff', borderWidth: 1 }, emphasis: { // ๋งˆ์šฐ์Šค hover ๊ฐ•์กฐ ์‹œ ์ƒ‰์ƒ ์œ ์ง€ itemStyle: { color: 'inherit', shadowBlur: 10, shadowOffsetX: 0, shadowColor: 'rgba(0, 0, 0, 0.5)' } } }, { // ๋”๋ฏธ ํŒŒ์ด๊ทธ๋ž˜ํ”„ (ํŒŒ์ด๊ทธ๋ž˜ํ”„๋Š” ํ‘œ์‹œํ•˜์ง€ ์•Š๊ณ  ๋ฒ”๋ก€๋งŒ ํ‘œ์‹œ) type: 'pie', radius: ['0%', '0%'], // ๋ณด์ด์ง€ ์•Š๋„๋ก ๋ฐ˜์ง€๋ฆ„ 0% center: ['70%', '50%'], label: { show: false }, // ํŒŒ์ด๊ทธ๋ž˜ํ”„ ์ฃผ๋ณ€ ๋ผ๋ฒจ ํ‘œ์‹œ ์•ˆํ•จ labelLine: { show: false }, // ํŒŒ์ด๊ทธ๋ž˜ํ”„์™€ ํŒŒ์ด๊ทธ๋ž˜ํ”„ ์ฃผ๋ณ€ ๋ผ๋ฒจ์„ ์—ฐ๊ฒฐํ•˜๋Š” ์„  ํ‘œ์‹œ ์•ˆํ•จ data: dummyData.map(d => ({ ...d, value: 1 // ๋ฒ”๋ก€ ํ‘œ์‹œ๋ฅผ ์œ„ํ•ด value ์„ค์ • })), emphasis: { disabled: true // ๋งˆ์šฐ์Šค hover ๊ฐ•์กฐ ๋น„ํ™œ์„ฑํ™” } } ] }; if (option && typeof option === 'object') { chart.setOption(option); } chart.resize(); function formatPercent(percent) { let result = percent.toFixed(2); let decimalPointNum = result.split('.')[1]; // ์†Œ์ˆ˜์  ์•„๋ž˜ ์ˆซ์ž๊ฐ€ 00์ธ ๊ฒฝ์šฐ if (decimalPointNum == '00') result = result.split('.')[0]; // ์†Œ์ˆ˜์  ์•„๋ž˜ ๋‘๋ฒˆ์งธ ์ˆซ์ž๊ฐ€ 0์ธ ๊ฒฝ์šฐ else if (decimalPointNum[1] == '0') result = `${result.split('.')[0]}.${decimalPointNum[0]}`; return result; } function getSizeText(key) { let result; let keySplit = key.split('/'); if (keySplit[1]) { let prefix, suffix; if (keySplit[0] == 'archive') prefix = '์•„์นด์ด๋ธŒ'; if (keySplit[0] == 'official_doc') prefix = '๊ณต๋ฌธ'; if (keySplit[1] == 'origin') suffix = '์›๋ณธ'; if (keySplit[1] == 'pdf') suffix = '๋ณ€ํ™˜PDF'; if (keySplit[1] == 'pdf_thumb') suffix = '๋ฏธ๋ฆฌ๋ณด๊ธฐPDF'; result = `${prefix} ${suffix}`; } else { if (keySplit[0] == 'recycle_bin') result = 'ํœด์ง€ํ†ต'; if (keySplit[0] == 'overview') result = '๊ณผ์—…๊ฐœ์š”'; } return result; } } } export async function renderLog(isInit, addFooterLog, filterValues) { if (checkProjectInactive()) return; // addFooterLog : ํ‘ธํ„ฐ ๋กœ๊ทธ ์ถ”๊ฐ€ ์—ฌ๋ถ€ // ๊ธฐ๋ณธ์€ true, ํ™œ๋™ ๋กœ๊ทธ ๋ชจ๋‹ฌ ์—ด ๋•Œ ์‹คํ–‰ํ•˜๋Š” renderLog์—์„œ๋Š” false if (addFooterLog == undefined) addFooterLog = true; let footerLatestLog = document.querySelector('body > .footer .left .log-wrap .latest-log'); let modalLogItemWrap = document.querySelector('.archive-modal .modal-body .log-wrap .log-item-wrap.log-body'); // ๋กœ๊ทธ ๋ฐ์ดํ„ฐ ๊ฐ€์ ธ์™€์„œ ์ „์—ญ ๋ณ€์ˆ˜์— ์ €์žฅ if (filterValues != undefined) { vars.logData = filterValues; }else { let logRes = await axios.get(`${vars.path_name}/getLog`); vars.logData = logRes.data.logData; } modalLogItemWrap.innerHTML = ''; // ์ƒˆ๋กœ ๋กœ๊ทธ ๋ Œ๋”ํ•˜๊ธฐ ์ „์— ๋งˆ์ง€๋ง‰์œผ๋กœ ์ถ”๊ฐ€๋œ log-item ์• ๋‹ˆ๋ฉ”์ด์…˜ ์ดˆ๊ธฐํ™” vars.newLogItemArr.forEach(newLogItem => { newLogItem.style.setProperty('--log-highlight', 'none'); }) vars.newLogItemArr = []; Object.values(vars.logData).forEach((data, idx) => { // ๋กœ๊ทธ id (์‹œํ€€์Šค ๋ฒˆํ˜ธ) let logId = data.log_id; // let existingLogItem = document.querySelector(`.log-${logId}`); // if (existingLogItem) { // // ์• ๋‹ˆ๋ฉ”์ด์…˜ ์ดˆ๊ธฐํ™” // // existingLogItem.style.setProperty('--log-highlight', 'none'); // } else { // ๋กœ๊ทธ ์‹œ๊ฐ„ (yy. MM. dd. hh:mm:ss) let logDate = new Date(data.log_date); logDate = `${changeDateFormat(logDate.toLocaleDateString('ko-KR'))} ${logDate.toLocaleTimeString('en-US', {hour12: false})}`; // ์˜์–ด๋กœ ๋œ ํ™œ๋™ id๋ฅผ ํ•œ๊ธ€๋กœ ๋ฒˆ์—ญ let activity = data.activity; let activityKor = translateActivity(activity); let activityType = activity.split('_')[0]; // data์—์„œ ์œ ์ € ๊ด€๋ จ ๋ณ€์ˆ˜๋“ค ์ €์žฅ ํ›„ ์กฐํ•ฉํ•ด์„œ ์œ ์ € ์ •๋ณด ๋ณ€์ˆ˜ ์ƒ์„ฑ // let userId = data.user_id; // let userCompany = data.user_company; // let userDept = data.user_dept; let userNm = data.user_nm; let userPosition = ''; if (data.user_position) userPosition = data.user_position; // let user = `${userCompany} ${userDept} ${userNm} ${userPosition}`; let user = (`${userNm} ${userPosition}`).trim(); if (activity == 'removeTarget_folder_expired') user = '-'; // ํ™œ๋™ ๋ณ„ log ๋ฐ id ์ƒ์„ฑํ•ด์„œ ๊ฐ๊ฐ ๋ฐฐ์—ด์— ์ถ”๊ฐ€ let pathArr; try { pathArr = typeof data.path_arr === 'string' ? JSON.parse(data.path_arr) : data.path_arr; } catch (e) { pathArr = Array.isArray(data.path_arr) ? data.path_arr : [data.path_arr]; } let idArr = [], dateArr = [], userArr = [], activityArr = [], logArr = []; if (activity == 'uploadData_file') { // ํŒŒ์ผ ์—…๋กœ๋“œ ๊ฒฝ์šฐ ๋‹ค์ค‘ ์—…๋กœ๋“œ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋ฏ€๋กœ ์—…๋กœ๋“œ ๋œ ํŒŒ์ผ๋งˆ๋‹ค ๋กœ๊ทธ ์ƒ์„ฑ for (let i = 0; i < pathArr.length; i++) { let id = `${logId}_${logDate}_${user}_${activityKor}_${pathArr[i]}`; let log = document.createElement('div'); log.classList.add('log'); log.classList.add(activityType); let logText = document.createElement('div'); logText.classList.add('text'); logText.innerHTML = `${pathArr[i]}`; log.appendChild(logText); idArr.push(id); dateArr.push(logDate); userArr.push(user); activityArr.push(activityKor); logArr.push(log); } } else if (activity.startsWith('renameTarget')) { let id = `${logId}_${logDate}_${user}_${activityKor}_${pathArr[0]}`; if (pathArr[1]) id += `_${pathArr[1]}`; let log = document.createElement('div'); log.classList.add('log'); log.classList.add(activityType); let logText1 = document.createElement('div'); logText1.classList.add('text'); logText1.innerHTML = `๋ณ€๊ฒฝ ์ „ : ${pathArr[0]}`; let logText2 = document.createElement('div'); logText2.classList.add('text'); logText2.innerHTML = `๋ณ€๊ฒฝ ํ›„ : ${pathArr[1]}`; log.appendChild(logText1); log.appendChild(logText2); let width1 = getTextPixelWidth(`๋ณ€๊ฒฝ ์ „ : `); logText1.style.textIndent = `-${pxToRem(width1-2)}rem`; logText1.style.paddingLeft = `${pxToRem(width1-2)}rem`; let width2 = getTextPixelWidth(`๋ณ€๊ฒฝ ํ›„ : `); logText2.style.textIndent = `-${pxToRem(width2-2)}rem`; logText2.style.paddingLeft = `${pxToRem(width2-2)}rem`; idArr.push(id); dateArr.push(logDate); userArr.push(user); activityArr.push(activityKor); logArr.push(log); } else if (activity.startsWith('relocateTarget')) { for (let i = 0; i < pathArr.length; i++) { let id = `${logId}_${logDate}_${user}_${activityKor}_${pathArr[i].from}_${pathArr[i].to}`; let log = document.createElement('div'); log.classList.add('log'); log.classList.add(activityType); let logText1 = document.createElement('div'); logText1.classList.add('text'); logText1.innerHTML = `์ด๋™ ์ „ : ${pathArr[i].from}`; let logText2 = document.createElement('div'); logText2.classList.add('text'); logText2.innerHTML = `์ด๋™ ํ›„ : ${pathArr[i].to}`; log.appendChild(logText1); log.appendChild(logText2); let width1 = getTextPixelWidth(`๋ณ€๊ฒฝ ์ „ : `); logText1.style.textIndent = `-${pxToRem(width1-2)}rem`; logText1.style.paddingLeft = `${pxToRem(width1-2)}rem`; let width2 = getTextPixelWidth(`๋ณ€๊ฒฝ ํ›„ : `); logText2.style.textIndent = `-${pxToRem(width2-2)}rem`; logText2.style.paddingLeft = `${pxToRem(width2-2)}rem`; idArr.push(id); dateArr.push(logDate); userArr.push(user); activityArr.push(activityKor); logArr.push(log); } } else if (activity.startsWith('setDataPermission')) { let path = pathArr[0].resourcePath; let beforePermission = pathArr[0].beforePermission; let newPermission = pathArr[0].newPermission; let id = `${logId}_${logDate}_${user}_${activityKor}_${path}_${beforePermission}_${newPermission}`; let log = document.createElement('div'); log.classList.add('log'); log.classList.add(activityType); let logText1 = document.createElement('div'); logText1.classList.add('text'); logText1.innerHTML = `${path}`; let logText2 = document.createElement('div'); logText2.classList.add('text'); logText2.innerHTML = `๊ธฐ์กด ๊ถŒํ•œ : ${beforePermission} โ†’ ์‹ ๊ทœ ๊ถŒํ•œ : ${newPermission}`; log.appendChild(logText1); log.appendChild(logText2); idArr.push(id); dateArr.push(logDate); userArr.push(user); activityArr.push(activityKor); logArr.push(log); } else if (activity.startsWith('addPermission') || activity.startsWith('deletePermission')){ let id = `${logId}_${logDate}_${user}_${activityKor}_${pathArr[0]}`; if (pathArr[1]) id += `_${pathArr[1]}`; let log = document.createElement('div'); log.classList.add('log'); log.classList.add(activityType); let logText = document.createElement('div'); logText.classList.add('text'); // ์œ ์ €๊ถŒํ•œ ๋กœ๊ทธ๋Š” ํ•œ๋ช… ์ดˆ๊ณผ์‹œ ๋ˆ„๊ตฌ ์™ธ O๋ช…์œผ๋กœ ํ‘œํ˜„ logText.innerHTML = pathArr.length === 1 ? pathArr[0] : `${pathArr[0]} ์™ธ ${pathArr.length - 1}๋ช…`; log.appendChild(logText); idArr.push(id); dateArr.push(logDate); userArr.push(user); activityArr.push(activityKor); logArr.push(log); } else if (activity == 'editAuthor') { for (let i = 0; i < pathArr.length; i++) { let path = pathArr[i].resourcePath; let prevAuthorNm = pathArr[i].prevAuthorNm; let newAuthorNm = pathArr[i].newAuthorNm; let id = `${logId}_${logDate}_${user}_${activityKor}_${path}_${prevAuthorNm}_${newAuthorNm}`; let log = document.createElement('div'); log.classList.add('log'); log.classList.add(activityType); let logText1 = document.createElement('div'); logText1.classList.add('text'); logText1.innerHTML = `${path}`; let logText2 = document.createElement('div'); logText2.classList.add('text'); logText2.innerHTML = `๊ธฐ์กด ์ž‘์„ฑ์ž : ${prevAuthorNm} โ†’ ์‹ ๊ทœ ์ž‘์„ฑ์ž : ${newAuthorNm}`; log.appendChild(logText1); log.appendChild(logText2); idArr.push(id); dateArr.push(logDate); userArr.push(user); activityArr.push(activityKor); logArr.push(log); } } else { for (let i = 0; i < pathArr.length; i++) { let id = `${logId}_${logDate}_${user}_${activityKor}_${pathArr[0]}`; if (pathArr[1]) id += `_${pathArr[1]}`; let log = document.createElement('div'); log.classList.add('log'); log.classList.add(activityType); let logText = document.createElement('div'); logText.classList.add('text'); logText.innerHTML = `${pathArr[i]}`; log.appendChild(logText); idArr.push(id); dateArr.push(logDate); userArr.push(user); activityArr.push(activityKor); logArr.push(log); } } for (let i = 0; i < logArr.length; i++) { let id = idArr[i]; let date = dateArr[i]; let user = userArr[i]; let activity = activityArr[i]; let log = logArr[i]; let dateDiv = document.createElement('div'); dateDiv.classList.add('date'); let dateText = document.createElement('div'); dateText.classList.add('text'); dateText.innerHTML = date; dateDiv.appendChild(dateText); let userDiv = document.createElement('div'); userDiv.classList.add('user'); let userText = document.createElement('div'); userText.classList.add('text'); userText.innerHTML = user; userDiv.appendChild(userText); let activityDiv = document.createElement('div'); activityDiv.classList.add('activity'); let activityText = document.createElement('div'); activityText.classList.add('text'); activityText.innerHTML = activity; activityDiv.appendChild(activityText); let logItem = document.createElement('div'); logItem.id = id; logItem.classList.add('log-item'); logItem.classList.add(`log-${logId}`); logItem.appendChild(dateDiv); logItem.appendChild(userDiv); logItem.appendChild(activityDiv); logItem.appendChild(log); // modalLogItemWrap.prepend(logItem); modalLogItemWrap.prepend(logItem); // vars.newLogItemArr ๋ฐฐ์—ด์— ์ƒˆ๋กœ์šด ๋กœ๊ทธ ์•„์ดํ…œ ์ถ”๊ฐ€ vars.newLogItemArr.push(logItem); } // } }) // vars.newLogItemArr ๋ฐฐ์—ด์— ์žˆ๋Š” ๋กœ๊ทธ ์•„์ดํ…œ์— ์• ๋‹ˆ๋ฉ”์ด์…˜ ์ถ”๊ฐ€ for (let i = 0; i < vars.newLogItemArr.length; i++) { let newLogItem = vars.newLogItemArr[i]; if (!isInit) { newLogItem.style.setProperty('--log-highlight', 'log-highlight 1s linear(0 0%, 1 50%, 0 100%) 0s 2 normal none running'); } } // ๋ชจ๋‹ฌ ๋กœ๊ทธ ์•„์ดํ…œ ์ค‘ ์ตœ์‹  ๋กœ๊ทธ ๋ณต์ œ if (addFooterLog) { let modalLatestLog = modalLogItemWrap.children[0]; if (modalLatestLog) { let modalLatestLogClone = modalLatestLog.cloneNode(true); // ํ‘ธํ„ฐ ๋กœ๊ทธ ์˜์—ญ ๋น„์šฐ๊ณ  ๋ณต์ œํ•œ ๋กœ๊ทธ ์ถ”๊ฐ€ if (footerLatestLog) { let dateClone = modalLatestLogClone.querySelector('.date').cloneNode(true); let userClone = modalLatestLogClone.querySelector('.user').cloneNode(true); let activityClone = modalLatestLogClone.querySelector('.activity').cloneNode(true); let logClone = modalLatestLogClone.querySelector('.log').cloneNode(true); let separator1 = document.createElement('div'); separator1.classList.add('log-separator'); let separator2 = document.createElement('div'); separator2.classList.add('log-separator'); let separator3 = document.createElement('div'); separator3.classList.add('log-separator'); footerLatestLog.innerHTML = ''; footerLatestLog.appendChild(modalLatestLogClone); modalLatestLogClone.innerHTML = ''; modalLatestLogClone.appendChild(dateClone); modalLatestLogClone.appendChild(separator1); modalLatestLogClone.appendChild(userClone); modalLatestLogClone.appendChild(separator2); modalLatestLogClone.appendChild(activityClone); modalLatestLogClone.appendChild(separator3); modalLatestLogClone.appendChild(logClone); } } } //// ํ™œ๋™๋กœ๊ทธ ๋ชจ๋‹ฌ์—์„œ ์‹œ๊ฐ„, ์œ ์ €, ํ™œ๋™์ข…๋ฅ˜ ๊ฐ๊ฐ ์ œ์ผ ๊ธด ํ•ญ๋ชฉ ๊ธฐ์ค€์œผ๋กœ width ์กฐ์ • if (document.querySelector('.archive-modal .modal-body .log-wrap').style.display == 'flex') { // ํ™œ๋™๋กœ๊ทธ๊ฐ€ ์—ด๋ ค์žˆ์„ ๋•Œ์—๋งŒ ์ ์šฉ let dateDivs = modalLogItemWrap.querySelectorAll('.log-item .date'); let userDivs = modalLogItemWrap.querySelectorAll('.log-item .user'); let activityDivs = modalLogItemWrap.querySelectorAll('.log-item .activity'); resizeLogDivs(dateDivs); resizeLogDivs(userDivs); resizeLogDivs(activityDivs); let firstLog = document.querySelector('.log-item-wrap.log-body').childNodes[0]; if (firstLog?.classList?.contains('log-item')) { let dateWidth = firstLog.getElementsByClassName('date')[0].offsetWidth; let userWidth = firstLog.getElementsByClassName('user')[0].offsetWidth; let activityWidth = firstLog.getElementsByClassName('activity')[0].offsetWidth; document.querySelector('.log-item-wrap.log-header .date').style.width = `${dateWidth}px`; document.querySelector('.log-item-wrap.log-header .user').style.width = `${userWidth}px`; document.querySelector('.log-item-wrap.log-header .activity').style.width = `${activityWidth}px`; } } document.querySelector('.archive-modal .modal-body > .log-wrap').style.opacity = '1'; function getTextPixelWidth(text) { let remPx = parseFloat(getComputedStyle(document.documentElement).fontSize); let fontPx = remPx * 0.8; let font = `${fontPx}px "Noto Sans KR"`; let canvas = document.createElement('canvas'); let context = canvas.getContext('2d'); context.font = font; let width = context.measureText(text).width; return width; } function resizeLogDivs(divs) { let maxTextWidth = 0; divs.forEach(div => { let text = div.querySelector('.text'); let textWidth = getTextPixelWidth(text.textContent); if (textWidth > maxTextWidth) maxTextWidth = textWidth; }) divs.forEach(div => { div.style.width = `${pxToRem(maxTextWidth+8)}rem`; }) } } export async function renderEditAuthorUserList(inputWrap, keyword) { let confirmBtn = document.querySelector('.archive-modal .modal-body .btn-wrap .confirm-btn'); confirmBtn.classList.add('disabled'); // ๊ธฐ์กด ๊ฒฝ๊ณ ๋ฌธ๊ตฌ ์žˆ์œผ๋ฉด ์‚ญ์ œ if (document.querySelector('.archive-modal .input-wrap .warn')) { inputWrap.removeChild(document.querySelector('.archive-modal .input-wrap .warn')); } // ๊ฒฝ๊ณ ๋ฌธ๊ตฌ dom ์ƒ์„ฑ let warn = document.createElement('div'); warn.classList.add('warn'); warn.style.top = `${inputWrap.offsetHeight}px`; inputWrap.appendChild(warn); // ์ด๋ฆ„์œผ๋กœ ํ•„ํ„ฐ๋ง ์ดํ›„ ์ง๊ธ‰์œผ๋กœ ์ •๋ ฌ let users = vars.permissionList.all; let positionMap = {'ํšŒ์žฅ': 1, '๋ถ€ํšŒ์žฅ':2, '์‚ฌ์žฅ':3, '์ƒ์ž„๊ณ ๋ฌธ':4, '๊ธฐ์ˆ ์œ„์›':5, '๋ถ€์‚ฌ์žฅ':6, '๊ณ ๋ฌธ':7, '์ „๋ฌด์ด์‚ฌ':8, '์ˆ˜์„์—ฐ๊ตฌ์›':9, '์ƒ๋ฌด์ด์‚ฌ':10, '์ด์‚ฌ':11, '์ฑ…์ž„์—ฐ๊ตฌ์›':12, '๋ถ€์žฅ':13, '์ฐจ์žฅ':14, '์„ ์ž„์—ฐ๊ตฌ์›':15, '๊ณผ์žฅ':16, '์—ฐ๊ตฌ์›':17, '๋Œ€๋ฆฌ':18, '์‚ฌ์›':19}; let resultArr = users.filter(user => user.user_nm?.toLowerCase().includes(keyword)).sort((a,b) => { let aPosition = positionMap[a.position] ?? 99; let bPosition = positionMap[b.position] ?? 99; if(aPosition !== bPosition) return aPosition - bPosition; return a.user_id.localeCompare(b.user_id); }) // ์ƒํ™ฉ์— ๋”ฐ๋ผ ๊ฒฝ๊ณ ๋ฌธ๊ตฌ ํ…์ŠคํŠธ ์ถ”๊ฐ€ ๋˜๋Š” renameTarget ์ง„ํ–‰ if (keyword == '') { warn.innerText = '๊ฒ€์ƒ‰์ฐฝ์— ์ด๋ฆ„์„ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”.'; } else if (resultArr.length === 0) { warn.innerText = '๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.'; } else { // ๊ฒฝ๊ณ ๋ฌธ๊ตฌ dom ์‚ญ์ œ inputWrap.removeChild(warn); // ์ง์› ๋ฆฌ์ŠคํŠธ ์ƒ์„ฑ let userListWrap = document.querySelector('.archive-modal .modal-body .user-list-wrap'); let userItemWrap = userListWrap.querySelector('.user-item-wrap'); // ์ž‘์„ฑ์ž ๋ณ€๊ฒฝ ์„ ํƒ ๊ฒฐ๊ณผ ์ˆจ๊น€ // let selectedUserItemWrap = userListWrap.querySelector('.selected-user-item-wrap'); // let selectedUserItem = selectedUserItemWrap.querySelector('.selected-user-item'); userListWrap.style.display = 'flex'; userListWrap.style.width = `${pxToRem(inputWrap.getBoundingClientRect().width)}rem`; userItemWrap.innerHTML = ''; // ์ž‘์„ฑ์ž ๋ณ€๊ฒฝ ์„ ํƒ ๊ฒฐ๊ณผ ์ˆจ๊น€ // selectedUserItemWrap.style.display = 'none'; // selectedUserItem.innerHTML = ''; for (let result of resultArr) { let userItem = document.createElement('div'); userItem.classList.add('user-item'); userItem.dataset.userId = result.user_id; userItem.dataset.userNm = result.user_nm; let userImage = document.createElement('img'); userImage.classList.add('user-image'); let defaultImageUrl = '/main/img/archive/empty-profile.svg'; let userImageUrl = defaultImageUrl; if (/^[a-zA-Z]{1}\d{5}$/.test(result.user_id)) userImageUrl = `http://erp.hanmaceng.co.kr/erpphoto/${result.user_id}.jpg`; userImage.src = userImageUrl; // onerror ํ•ธ๋“ค๋Ÿฌ ๋ฐ”์ธ๋”ฉ (ํ•œ๋ฒˆ๋งŒ ๋™์ž‘ํ•˜๋„๋ก) userImage.onerror = function() { this.onerror = null; // ๋ฌดํ•œ๋ฃจํ”„ ๋ฐฉ์ง€ this.src = defaultImageUrl; }; let userInfo = document.createElement('div'); userInfo.classList.add('user-info'); let userCompany = document.createElement('div'); userCompany.classList.add('user-company'); let userCompanyIcon = document.createElement('img'); userCompanyIcon.classList.add('user-company-icon'); userCompanyIcon.src = `/main/img/permission/s-icon__${result.company}-small-logo.svg`; let userCompanyText = document.createElement('div'); userCompanyText.classList.add('user-company-text'); userCompanyText.innerHTML = result.company; let userName = document.createElement('div'); userName.classList.add('user-name'); userName.innerHTML = (`${result.user_nm} ${result.position ?? ''}`).trim(); userItemWrap.appendChild(userItem); userItem.appendChild(userImage); userItem.appendChild(userInfo); userInfo.appendChild(userCompany); userInfo.appendChild(userName); userCompany.appendChild(userCompanyIcon); userCompany.appendChild(userCompanyText); userItem.addEventListener('click', (e) => { userItemWrap.childNodes.forEach(item => { if (e.target == item) { item.classList.add('selected'); } else { item.classList.remove('selected'); } }) // ์ž‘์„ฑ์ž ๋ณ€๊ฒฝ ์„ ํƒ ๊ฒฐ๊ณผ ์ˆจ๊น€ // let userItemClone = userItem.cloneNode(true); // if (selectedUserItemWrap.style.display != 'flex') selectedUserItemWrap.style.display = 'flex'; // selectedUserItem.innerHTML = ''; // selectedUserItem.appendChild(userItemClone); document.querySelector('.archive-modal .modal-body .btn-wrap .confirm-btn').classList.remove('disabled'); }) } } } export function changeHeaderBtnStyle(headerBtn) { // if (vars.lastHeaderBtn) vars.lastHeaderBtn.classList.remove('selected'); // document.querySelectorAll('.header-center .menu-tab .btn').forEach(e => { document.querySelectorAll('body > .header .center .btn').forEach(e => { e.classList.remove('selected'); }); // if (document.querySelector('.official-doc-btn')) document.querySelector('.official-doc-btn').classList.remove('selected'); if (headerBtn) vars.lastHeaderBtn = headerBtn; if (vars.lastHeaderBtn) { vars.lastHeaderBtn.classList.add('selected'); // let treeTitle = document.querySelector() } // vars.users[JSON.parse(vars.userInfoString).clientId].curPath = resourcePath; // vars.lastMainTreeItem = undefined; // vars.lastListItem = undefined; // vars.lastContextTarget = undefined; // vars.lastSelectTarget = undefined; // document.querySelector('.archive-main-center .list-container .list-wrap.list-header').dataset.resourcePath = ''; // document.querySelector('.archive-main-center .list-container .list-wrap.list-body').dataset.resourcePath = ''; } export function changeTreeItemStyle(treeItem, targetTree='main') { if (targetTree == 'main') { // if (vars.lastMainTreeItem) vars.lastMainTreeItem.style.background = ''; // vars.lastMainTreeItem = treeItem; // vars.lastMainTreeItem.style.background = '#bccbc8'; document.querySelectorAll('.archive-main-left .tree-container .tree .tree-item-wrap.depth3').forEach(e => { e.classList.remove('selected'); }); document.querySelector('.archive-main-left .tree-title').classList.remove('selected'); if (treeItem) vars.lastMainTreeItem = treeItem; if (vars.lastMainTreeItem) { vars.lastMainTreeItem.classList.add('selected'); vars.lastSelectTarget = vars.lastMainTreeItem.querySelector('.tree-item'); } // } else { // if (vars.lastModalTreeItem) vars.lastModalTreeItem.style.background = ''; // vars.lastModalTreeItem = treeItem; // vars.lastModalTreeItem.style.background = '#bccbc8'; } } export function changeListItemStyle(listItem, from) { let isRecycleBinModal = document.querySelector('.recycle-bin-modal').style.display == 'flex'; if (isRecycleBinModal) { //// ์„œ๋ธŒ list item ์žˆ๋Š” ๊ฒฝ์šฐ ๋ฐฐ๊ฒฝ ์ƒ‰์ƒ ๋ณ€๊ฒฝ if (vars.lastListGroupTarget_bin) { vars.lastListGroupTarget_bin.classList.remove('group-style'); } if (listItem.matches('.main-list-item')) { vars.lastListGroupTarget_bin = listItem; } if (listItem.matches('.sub-list-item')) { vars.lastListGroupTarget_bin = document.querySelector(`.list-item.main-list-item[data-main-file-name="${listItem.dataset.mainFileName}"]`); // if (listItem.matches('.grid-item')) { // vars.lastListGroupTarget_bin = document.querySelector(`.grid-item.main-list-item[data-main-file-name="${listItem.dataset.mainFileName}"]`); // } else { // vars.lastListGroupTarget_bin = listItem.closest('.main-list-item'); // } } if (vars.lastListGroupTarget_bin) { vars.lastListGroupTarget_bin.classList.add('group-style'); } //// ๋‹จ์ผ list item ๋ฐฐ๊ฒฝ ์ƒ‰์ƒ ๋ณ€๊ฒฝ if (vars.lastListItem_bin) { vars.lastListItem_bin.classList.remove('selected'); } vars.lastListItem_bin = listItem; vars.lastListItem_bin.classList.add('selected'); vars.lastSelectTarget_bin = vars.lastListItem_bin; let isExistsDataId = false; vars.multiSelectListItemArr_bin.forEach((item) => { if (item.dataset.dataId === listItem.dataset.dataId) isExistsDataId = true; }) if (!isExistsDataId) vars.multiSelectListItemArr_bin.push(listItem); } else { //// ์„œ๋ธŒ list item ์žˆ๋Š” ๊ฒฝ์šฐ ๋ฐฐ๊ฒฝ ์ƒ‰์ƒ ๋ณ€๊ฒฝ if (vars.lastListGroupTarget) { vars.lastListGroupTarget.classList.remove('group-style'); } if (listItem.matches('.main-list-item')) { vars.lastListGroupTarget = listItem; } if (listItem.matches('.sub-list-item')) { vars.lastListGroupTarget = document.querySelector(`.list-item.main-list-item[data-main-file-name="${listItem.dataset.mainFileName}"]`); // if (listItem.matches('.grid-item')) { // vars.lastListGroupTarget = document.querySelector(`.grid-item.main-list-item[data-main-file-name="${listItem.dataset.mainFileName}"]`); // } else { // vars.lastListGroupTarget = listItem.closest('.main-list-item'); // } } if (vars.lastListGroupTarget) { vars.lastListGroupTarget.classList.add('group-style'); } //// ๋‹จ์ผ list item ๋ฐฐ๊ฒฝ ์ƒ‰์ƒ ๋ณ€๊ฒฝ if (vars.lastListItem) { vars.lastListItem.classList.remove('selected'); } vars.lastListItem = listItem; vars.lastListItem.classList.add('selected'); vars.lastSelectTarget = vars.lastListItem; let isExistsDataId = false; vars.multiSelectListItemArr.forEach((item) => { if (item.dataset.dataId === listItem.dataset.dataId) isExistsDataId = true; }) if (!isExistsDataId) vars.multiSelectListItemArr.push(listItem); } let me = JSON.parse(vars.userInfoString); me.selected = listItem.dataset.resourcePath; vars.socket.emit('fileSelect',{me : me}); } // ๊ตฌ์„ฑ ๋ชจ๋‹ฌ ๋ฐ์ดํ„ฐ ๋ Œ๋”๋ง export async function renderCompositionData() { const modal = document.querySelector('.composition-modal'); let userString = vars.userInfoString; let user = JSON.parse(userString); // ์ตœ์ƒ๋‹จ ํด๋” (ํƒญ) const tabList = Object.keys(vars.allTreeObject.folder).sort(naturalSort); // ๋ฆฌ์ŠคํŠธ wrap const listWrap = modal.querySelector('.modal-wrap > ul'); listWrap.innerHTML = ''; // ์ดˆ๊ธฐํ™” // ๊ฐ ์ตœ์ƒ๋‹จ ํด๋”(ํƒญ)์— ๋Œ€ํ•œ ์ฒ˜๋ฆฌ for (const tab of tabList) { let getTreeObjectParams = { userInfoString: JSON.stringify(user), storageType: vars.storageType, resourcePath: tab }; let getTreeObjectRes = await axios.get(`${vars.path_name}/getTreeObject`, { params: {params: getTreeObjectParams} }); if(getTreeObjectRes.data.message == 'getTreeObject_success') { const treeData = getTreeObjectRes.data.currentTreeObject; // ์ตœ์ƒ๋‹จ ํด๋” li ์ƒ์„ฑ const tabLi = document.createElement('li'); // ์ตœ์ƒ๋‹จ ํด๋” ์ œ๋ชฉ (h3) const tabTitle = document.createElement('h3'); tabTitle.textContent = tab; tabLi.appendChild(tabTitle); // ์ƒ๋‹จ ํด๋” (์นดํ…Œ๊ณ ๋ฆฌ) ul ์ƒ์„ฑ const categoryUl = document.createElement('ul'); // ์ƒ๋‹จ ํด๋” (์นดํ…Œ๊ณ ๋ฆฌ) ๋ฐ์ดํ„ฐ๊ฐ€ ์žˆ๋‹ค๋ฉด ์ฒ˜๋ฆฌ if (treeData && treeData.folder && Object.keys(treeData.folder).length > 0) { const categories = Object.keys(treeData.folder).sort(naturalSort); categories.forEach(category => { // ์ƒ๋‹จ ํด๋” li ์ƒ์„ฑ const categoryLi = document.createElement('li'); // ์ƒ๋‹จ ํด๋” ์ œ๋ชฉ (h5) const categoryTitle = document.createElement('h5'); categoryTitle.textContent = category; categoryLi.appendChild(categoryTitle); // ํด๋” ul ์ƒ์„ฑ const folderUl = document.createElement('ul'); const folders = treeData.folder[category] || []; const folderObj = folders.child?.folder || {}; const folderKeys = Object.keys(folderObj).sort(naturalSort); // ํด๋”๊ฐ€ ์—†์„ ๋•Œ ๋นˆ ํ•ญ๋ชฉ ํ‘œ์‹œ if (folderKeys.length === 0) { // const emptyFolderLi = document.createElement('li'); // const emptyIcon = document.createElement('i'); // emptyFolderLi.appendChild(emptyIcon); // const emptyName = document.createElement('h6'); // emptyName.textContent = '-'; // emptyFolderLi.appendChild(emptyName); // const emptyCount = document.createElement('h6'); // emptyCount.textContent = '-'; // emptyFolderLi.appendChild(emptyCount); // folderUl.appendChild(emptyFolderLi); } else { // ํด๋”๊ฐ€ ์žˆ์„ ๋•Œ folderKeys.forEach(folderName => { const folderData = folderObj[folderName]; // ํด๋” ๋‚ด ํŒŒ์ผ ๊ฐœ์ˆ˜ ๊ณ„์‚ฐ let fileCount = 0; // child.file์˜ ํŒŒ์ผ ๊ฐœ์ˆ˜ fileCount += Object.keys(folderData.child?.file || {}).length; // child.folder ์•ˆ์˜ ๋ชจ๋“  ํŒŒ์ผ๋“ค๋„ ์นด์šดํŠธ (์ฒจ๋ถ€, ๋ฒ„์ „ ํŒŒ์ผ) if (folderData.child?.folder) { Object.keys(folderData.child.folder).forEach(subFolderName => { const subFolder = folderData.child.folder[subFolderName]; if (subFolder.child?.file) { fileCount += Object.keys(subFolder.child.file).length; } }); } // ํด๋” li ์ƒ์„ฑ const folderLi = document.createElement('li'); // ํด๋” ์•„์ด์ฝ˜ const folderIcon = document.createElement('i'); folderLi.appendChild(folderIcon); // ํด๋”๋ช… const folderNameEl = document.createElement('h6'); folderNameEl.textContent = folderName; folderLi.appendChild(folderNameEl); // ํŒŒ์ผ ๊ฐœ์ˆ˜ const folderCountEl = document.createElement('h6'); folderCountEl.textContent = fileCount > 0 ? String(fileCount) : '-'; folderLi.appendChild(folderCountEl); folderUl.appendChild(folderLi); }); } categoryLi.appendChild(folderUl); categoryUl.appendChild(categoryLi); }); } else { // ์นดํ…Œ๊ณ ๋ฆฌ๊ฐ€ ์—†์„ ๋•Œ ๋นˆ ํ•ญ๋ชฉ ํ‘œ์‹œ const emptyCategoryLi = document.createElement('li'); const emptyCategoryTitle = document.createElement('h5'); emptyCategoryTitle.textContent = '-'; emptyCategoryLi.appendChild(emptyCategoryTitle); const emptyFolderUl = document.createElement('ul'); const emptyFolderLi = document.createElement('li'); const emptyIcon = document.createElement('i'); emptyFolderLi.appendChild(emptyIcon); const emptyName = document.createElement('h6'); emptyName.textContent = '-'; emptyFolderLi.appendChild(emptyName); const emptyCount = document.createElement('h6'); emptyCount.textContent = '-'; emptyFolderLi.appendChild(emptyCount); emptyFolderUl.appendChild(emptyFolderLi); emptyCategoryLi.appendChild(emptyFolderUl); categoryUl.appendChild(emptyCategoryLi); } tabLi.appendChild(categoryUl); listWrap.appendChild(tabLi); } } // ๋ Œ๋”๋ง ์™„๋ฃŒ ํ›„ ๋†’์ด ๋™๊ธฐํ™” setTimeout(() => { const allLis = listWrap.querySelectorAll(':scope > li'); if (allLis.length === 0) return; // ๋ชจ๋“  li์˜ ์ตœ๋Œ€ ๋†’์ด ์ฐพ๊ธฐ let maxHeight = 0; allLis.forEach(li => { const height = li.scrollHeight; if (height > maxHeight) maxHeight = height; }); // ๋ชจ๋“  li ์— ์ตœ๋Œ€ ๋†’์ด ์ ์šฉ allLis.forEach(li => { li.style.minHeight = `${maxHeight}px`; }) }, 0); } // ์ •๋ ฌ ํ•จ์ˆ˜ function naturalSort(a, b) { const regex = /(\d+)|(\D+)/g; const aParts = a.match(regex); const bParts = b.match(regex); for (let i = 0; i < Math.min(aParts.length, bParts.length); i++) { const aPart = aParts[i]; const bPart = bParts[i]; // ๋‘˜ ๋‹ค ์ˆซ์ž์ธ ๊ฒฝ์šฐ if (!isNaN(aPart) && !isNaN(bPart)) { const diff = parseInt(aPart) - parseInt(bPart); if (diff !== 0) return diff; } else { // ๋ฌธ์ž์—ด ๋น„๊ต if (aPart !== bPart) { return aPart.localeCompare(bPart); } } } return aParts.length - bParts.length; }