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;
}
}
// ๋ธ๋ผ์ฐ์ ๋ค๋ก๊ฐ๊ธฐ, ์์ผ๋ก๊ฐ๊ธฐ ์ด๋ฒคํธ
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 previewKey = getDataFromTreeObject(resourcePath, 'file', vars.currentTreeObject).data.previewKey;
// ๋ฌธ์ ๋ทฐ์ด ์คํ ์ ๋ฏธ๋ฆฌ๋ณด๊ธฐ 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';
}
// ์ง์ ํ์ผ์ธ ๊ฒฝ์ฐ ๋ทฐ์ด ํ๋ก๊ทธ๋ ์ค ํ์, ๋๊ธฐ ์๊ฐ 700ms๋ก ์ค์ , ์ ์ฒด๋ณด๊ธฐ ๋ฒํผ ํ์
let originViewBtn = document.querySelector('.archive-main-right .viewer-container .viewer-header .btn');
if (allArr.includes(ext) && previewKey) {
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) {
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') {
previewKey = getDataInfoRes.data.result.preview_key;
}
}
if (allArr.includes(ext)) {
if (previewKey == undefined || previewKey == `` || previewKey == null) {
viewerConvert();
openFileViewer = false;
shouldAddClickLog = false;
} else {
let generateDownloadUrlParams = {
objectKey: previewKey,
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();
// 3D๋ทฐ์ด ์ธ๋ค์ผ ๋ณ์
const thumbnail_key = getDataFromTreeObject(resourcePath, 'file', vars.currentTreeObject).data?.thumbnailKey;
if (allArr.includes(ext)) {
if (pdfArr.includes(ext)) viewerPdf(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';
}
//// ์๋ณธ 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();
}
}
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;
}