/// 251104 ๋ฐ์ง์ ol ์์ผ์ฒ๋ฆฌ
// ์๋ก ์ถ๊ฐ๋ ID๋ค์ Set์ผ๋ก ๋ณํ (๋น ๋ฅธ ๊ฒ์)
// const newlyAddedSet = new Set(newlyAddedIds.map(id => String(id)));
// ์ค ์๊ณ
const zoom = ol.map.getView().getZoom();
// ์ค๋ฒ๋ ์ด DOM ํ ๊ธ
for (let ov of overlayArr) {
const el = ov.getElement();
if (!el) continue;
// map-item์ด ์๋๋ฉด ์คํต
if (!el.classList.contains('map-item')) continue;
const id = el.dataset.id;
const pos = ov.getPosition();
const inside = inView(pos);
/// 251104 ๋ฐ์ง์ ol ์์ผ์ฒ๋ฆฌ
// ์๋ก ์ถ๊ฐ๋ ์ค๋ฒ๋ ์ด์ธ์ง ํ์ธ
// const isNewlyAdded = newlyAddedSet.has(String(id));
// ํด๋ฌ์คํฐ์ ํฌํจ๋์๋์ง ํ์ธ
const isInCluster = clustered.has(String(id));
let show;
if (zoom >= vars.allOverlayVisibleZoom) {
// ๊ณ ๋ฐฐ์จ: ํญ์ ๋ทฐํฌํธ(+๋ฒํผ) ์๋ง ํ์
show = inside;
} else {
// ์ ๋ฐฐ์จ: ํด๋ฌ์คํฐ ๋ฉค๋ฒ๋ฉด ์จ๊น + ๋ทฐํฌํธ ๋ฐ์ด๋ฉด ์จ๊น
show = !clustered.has(String(id)) && inside;
}
/// 251104 ๋ฐ์ง์ ol ์์ผ์ฒ๋ฆฌ
// if (zoom >= vars.allOverlayVisibleZoom) {
// // ๊ณ ๋ฐฐ์จ: ํด๋ฌ์คํฐ ์๊ด์์ด ๋ทฐํฌํธ ์๋ง ํ์
// show = inside;
// } else {
// // ์ ๋ฐฐ์จ: ํด๋ฌ์คํฐ์ ํฌํจ๋๋ฉด ๋ฌด์กฐ๊ฑด ์จ๊น
// if (isInCluster) {
// show = false;
// } else {
// // ํด๋ฌ์คํฐ์ ์์ผ๋ฉด ๋ทฐํฌํธ ํ์ธ
// // ์๋ก ์ถ๊ฐ๋ ๊ฒ์ ๋ทฐํฌํธ ์ฒดํฌ ๋ฌด์
// if (isNewlyAdded) {
// show = true;
// } else {
// show = inside;
// }
// }
// }
const currentDisplay = el.style.display;
const hidden = currentDisplay === 'none';
if (show && hidden) {
el.style.display = 'flex';
} else if (!show && !hidden) {
el.style.display = 'none';
}
// ์ค์ ํ์ ์ค์ผ ๋๋ง ๋ฆฌ์คํธ ๋ซ๊ณ ํ์ด๋ผ์ดํธ
if (show && vars.lastSelectTarget && vars.lastSelectTarget.dataset.id == id) {
let clusterListWrap = document.querySelector('.map-container .cluster-list-wrap');
if (clusterListWrap) {
clusterListWrap.innerHTML = '';
clusterListWrap.style.display = 'none';
}
changeListItemStyle(el);
}
}
}
function getBufferedViewExtent(bufferPx = 0) {
const map = ol.map;
const view = map.getView();
const size = map.getSize();
if (!view || !size) return null;
let extent = view.calculateExtent(size);
if (bufferPx !== 0) {
const res = view.getResolution(); // map-units/px
if (!res) return extent;
const b = bufferPx * res; // px โ map-units
const w = extent[2] - extent[0];
const h = extent[3] - extent[1];
// ์์(์ถ์)์ผ ๋ ์์ญ์ด ๋ค์งํ์ง ์๋๋ก ํด๋จํ
const maxInset = Math.min(w, h) / 2 - 1e-6; // ๋จ๊ธฐ๋ ์ต์ ์ฌ์
const clamped = Math.max(-maxInset, b); // ๋๋ฌด ํฐ ์์ ๋ฐฉ์ง
extent = ol.extent.buffer(extent, clamped);
}
return extent;
}
// function clusterStyleFor(size, state, clusterStyleCache) {
// let cache = clusterStyleCache[state];
// if (!cache[size]) {
// let scale =
// state === 'selected' ? 1.2 :
// state === 'hover' ? 1.2 : 1.1;
// let strokeWidth =
// state === 'selected' ? 4.5 :
// state === 'hover' ? 4.5 : 4;
// let radius = 20 * scale;
// cache[size] = new ol.style.Style({
// image: new ol.style.Circle({
// radius,
// fill: new ol.style.Fill({ color: '#fff' }),
// stroke: new ol.style.Stroke({ color: state === 'selected' ? '#f9613b' : '#000', width: strokeWidth })
// }),
// // image: new ol.style.RegularShape({
// // points: 4, // ๊ผญ์ง์ 4๊ฐ
// // radius: radius * Math.SQRT2, // ์๊ณผ ๊ฐ์ ๊ฐ๋กํญ(์ง๋ฆ)์ ๋ง์ถ๊ณ ์ถ์ผ๋ฉด โ2 ๋ฐฐ
// // angle: Math.PI / 4, // 45๋ ํ์ (๊ฐ ๋ณ์ด ์ํ/์์ง)
// // fill: new ol.style.Fill({ color: '#fff' }),
// // stroke: new ol.style.Stroke({ color: state === 'selected' ? '#f9613b' : '#000', width: strokeWidth })
// // }),
// text: new ol.style.Text({
// font:
// state === 'selected' ? '14px sans-serif' :
// state === 'hover' ? '14px sans-serif' : '12px sans-serif',
// text: String(size),
// fill: new ol.style.Fill({ color: '#fff' }),
// stroke: new ol.style.Stroke({ color: '#000', width: 6 })
// })
// });
// }
// return cache[size];
// }
function clusterStyleFor(size, state, clusterStyleCache) {
let cache = clusterStyleCache[state];
if (!cache[size]) {
let scale, strokeWidth, strokeColor, font;
if (state == 'selected') {
scale = 1.2;
strokeWidth = 4.5;
strokeColor = '#f9613b';
font = '14px sans-serif';
}
if (state == 'hover') {
scale = 1.2;
strokeWidth = 4.5;
strokeColor = '#000';
font = '14px sans-serif';
}
if (state == 'clicked') {
scale = 1.2;
strokeWidth = 4.5;
strokeColor = '#3bb5f9';
font = '14px sans-serif';
}
if (state == 'normal') {
scale = 1.1;
strokeWidth = 4;
strokeColor = '#000';
font = '12px sans-serif';
}
let radius = 20 * scale;
cache[size] = new ol.style.Style({
image: new ol.style.Circle({
radius,
fill: new ol.style.Fill({ color: '#fff' }),
stroke: new ol.style.Stroke({ color: strokeColor, width: strokeWidth })
}),
text: new ol.style.Text({
font: font,
text: String(size),
fill: new ol.style.Fill({ color: '#fff' }),
stroke: new ol.style.Stroke({ color: '#000', width: 6 })
})
});
}
return cache[size];
}
function reapplyClickedByLastOverlay(clusterSource, clusterLayer, startZoom, endZoom) {
const el = vars.lastSelectTarget;
if (!el) return;
const id = el.dataset?.id;
if (!id) return;
// ํ์ฌ ํ๋ ์์ ํด๋ฌ์คํฐ๋ค ์ค์์ ํด๋น id๋ฅผ ํฌํจํ๋ ํด๋ฌ์คํฐ ์ฐพ๊ธฐ
const feats = clusterSource.getFeatures();
let target = null;
for (const cf of feats) {
const members = cf.get('features');
if (!members || members.length <= 1) continue;
if (members.some(f => String(f.get('dataId')) === String(id))) {
target = cf; break;
}
}
// ์ค ๋ณ๊ฒฝ ์์๋ง(๊ทธ๋ฆฌ๊ณ normal ๋ชจ๋์ผ ๋๋ง) ๋ฆฌ์คํธ ๋ค์ ๊ทธ๋ฆผ
if (startZoom && endZoom) {
if (target && startZoom != endZoom && vars.mapMode == 'normal') {
renderClusterList(target.get('features'), clusterLayer);
}
}
// ์ ํ๋ id๋ฅผ ๊ธฐ์ค์ผ๋ก ์คํ์ผ์ด ๋ค์ ํ๊ฐ๋๋๋ก ๊ฐ์ ๋ฆฌ๋ ๋
clusterLayer.changed();
}
function renderClusterList(items, clusterLayer) {
let clusterListWrap = document.querySelector('.map-container .cluster-list-wrap');
clusterListWrap.innerHTML = '';
clusterListWrap.style.display = 'flex';
for(let i = 0; i < items.length; i++) {
let item = items[i];
let element = item.values_.overlay.values_.element;
let thumbnailWrapClone = element.querySelector('.wrap').cloneNode(true);
thumbnailWrapClone.querySelector('.gps-data').remove();
thumbnailWrapClone.querySelector('.name').remove();
thumbnailWrapClone.querySelector('.uploader').remove();
thumbnailWrapClone.querySelector('.create-date').remove();
thumbnailWrapClone.querySelector('.size').remove();
let nameClone = element.querySelector('.name').cloneNode(true);
// nameClone.querySelector('.name-text').classList.remove('ft-14')
// nameClone.querySelector('.name-text').classList.add('ft-12')
nameClone.style.display = 'flex';
let resourcePath = element.dataset.resourcePath;
let dataId = element.dataset.id;
let clusterList = document.createElement('div');
clusterList.classList.add('cluster-list');
clusterList.dataset.id = dataId;
clusterList.dataset.resourcePath = resourcePath;
clusterList.appendChild(thumbnailWrapClone);
clusterList.appendChild(nameClone);
// vars.lastSelectTarget์ dataId์ ๋์ผํ dataId๋ฅผ ๊ฐ์ง clusterList์ selected ํด๋์ค ์ถ๊ฐํด์ ์ ํ ์ํ๋ก ํ์ํ๊ณ ํฌ์ปค์ค
if (vars.lastSelectTarget && vars.lastSelectTarget.dataset.id == dataId) {
clusterList.classList.add('selected');
// requestAnimationFrame(() => {
requestAnimationFrame(() => {
// clusterList.scrollIntoView({ behavior: 'instant', block: 'center', inline: 'nearest' });
targetFocus(clusterList, 'instant');
});
// });
}
clusterListWrap.appendChild(clusterList);
clusterList.addEventListener('click', async function(e) {
let option = {
from: 'ํด๋ฌ์คํฐ ๋ฆฌ์คํธ ํด๋ฆญ'
}
toggleArchiveMainRight(true, option);
let res = await axios.get(`${vars.path_name}/getMemoInfo`, {
params: { userInfoString: vars.userInfoString, resourcePath, dataId }
});
let memo = res.data.result.memo;
setTimeout(() => {
renderMemo(memo, dataId);
}, 100);
// ์ ๋ณด์์ญ ์จ๊น
// document.querySelector('.archive-main .archive-main-right .viewer-container .info-wrap').classList.remove('open');
// document.querySelector('.archive-main .archive-main-right .viewer-container .info-wrap').classList.add('close');
vars.viewerConnectingTime = vars.viewerConnectingTimeValue;
renderViewer(resourcePath, dataId);
vars.lastSelectTarget = document.querySelector(`.map-container .list-item[data-resource-path="${resourcePath}"]`);
changeListItemStyle(vars.lastSelectTarget);
vars.lastListItem = vars.lastSelectTarget;
vars.multiSelectListItemArr = [];
document.querySelectorAll('.cluster-list-wrap .cluster-list').forEach(clusterList => {
clusterList.classList.remove('selected');
})
e.target.classList.add('selected');
clusterLayer.changed();
// ํด๋ฌ์คํฐ ์์ดํ
๋ฆฌ์คํธ์์ ํด๋ฆญํ ๋์์ ์์น๋ก ์ง๋ ์ด๋
let data = getDataFromTreeObject(resourcePath, 'file', vars.currentTreeObject).data;
let overlayPosition = ol.proj.fromLonLat([data.lon, data.lat]);
let overlayPositionArr = [overlayPosition];
await fitToOverlayExtent(overlayPositionArr, async () => {});
})
}
}
export async function initEditPositionMode() {
document.querySelector('.control-box .file-area-mode-btn.map').click();
toggleArchiveMainRight(false);
vars.mapMode = 'edit';
document.querySelector('.map-container').classList.add('edit-mode');
// ์์น ์
๋ ฅ ๋ถ๋ถ ๋์ด๊ฐ
let coordWrapHeightRem = pxToRem(document.querySelector('.coord-wrap').getBoundingClientRect().height);
// ์ธ๋ค์ผ wrap ๋ณต์
let thumbnailWrapClone = vars.lastListItem.querySelector('.wrap').cloneNode(true);
thumbnailWrapClone.querySelector('.highlight')?.remove();
thumbnailWrapClone.querySelector('.gps-data')?.remove();
thumbnailWrapClone.querySelector('.name')?.remove();
thumbnailWrapClone.querySelector('.uploader')?.remove();
thumbnailWrapClone.querySelector('.create-date')?.remove();
thumbnailWrapClone.querySelector('.size')?.remove();
thumbnailWrapClone.style.width = `${coordWrapHeightRem}rem`;
thumbnailWrapClone.style.minWidth = `${coordWrapHeightRem}rem`;
thumbnailWrapClone.style.maxWidth = `${coordWrapHeightRem}rem`;
thumbnailWrapClone.style.height = `${coordWrapHeightRem}rem`;
thumbnailWrapClone.style.minHeight = `${coordWrapHeightRem}rem`;
thumbnailWrapClone.style.maxHeight = `${coordWrapHeightRem}rem`;
thumbnailWrapClone.dataset.id = vars.lastListItem.dataset.id;
thumbnailWrapClone.dataset.resourcePath = vars.lastListItem.dataset.resourcePath;
// ํ์ผ๋ช
๋ณต์
let nameClone = vars.lastListItem.querySelector('.name').cloneNode(true);
nameClone.style.display = 'flex';
// ํ์ฌ ์์น ์์ ์ค์ธ ํ์ผ ์ ๋ณด wrap์ ๋ณต์ ํ ์ธ๋ค์ผ wrap, ํ์ผ๋ช
์ถ๊ฐ
let editModeUi = document.querySelector('.edit-mode-ui');
let infoWrap = editModeUi.querySelector('.info-wrap');
infoWrap.style.height = `${coordWrapHeightRem}rem`;
infoWrap.innerHTML = '';
infoWrap.appendChild(thumbnailWrapClone);
infoWrap.appendChild(nameClone);
// ์ธ๋ค์ผ wrap์ ํธ๋ฒ ์ด๋ฒคํธ ์ถ๊ฐ
thumbnailWrapClone.addEventListener('pointerover', function() {
if (document.querySelector('.popup-thumbnail')) document.querySelector('.popup-thumbnail').remove();
let popupThumbnailWrapClone = thumbnailWrapClone.cloneNode(true);
popupThumbnailWrapClone.classList.add('popup-thumbnail');
document.querySelector('.map-container .edit-mode-ui').appendChild(popupThumbnailWrapClone);
let editModeUiWidth = editModeUi.getBoundingClientRect().width;
let editModeUiHeight = editModeUi.getBoundingClientRect().height;
let rem;
if (editModeUiWidth >= editModeUiHeight) rem = pxToRem(editModeUiHeight);
if (editModeUiWidth < editModeUiHeight) rem = pxToRem(editModeUiWidth);
popupThumbnailWrapClone.style.width = `${rem*0.5}rem`;
popupThumbnailWrapClone.style.minWidth = `${rem*0.5}rem`;
popupThumbnailWrapClone.style.maxWidth = `${rem*0.5}rem`;
popupThumbnailWrapClone.style.height = `${rem*0.5}rem`;
popupThumbnailWrapClone.style.minHeight = `${rem*0.5}rem`;
popupThumbnailWrapClone.style.maxHeight = `${rem*0.5}rem`;
popupThumbnailWrapClone.style.background = '#aaa';
popupThumbnailWrapClone.style.border = '0.0625rem solid #ccc';
popupThumbnailWrapClone.style.borderRadius = '0.25rem';
popupThumbnailWrapClone.style.position = 'absolute';
popupThumbnailWrapClone.style.bottom = `${coordWrapHeightRem + 4}rem`;
popupThumbnailWrapClone.style.left = '50%';
popupThumbnailWrapClone.style.transform = 'translate(-50%, 0)';
popupThumbnailWrapClone.style.pointerEvents = 'none';
popupThumbnailWrapClone.style.zIndex = '9999';
})
thumbnailWrapClone.addEventListener('pointerleave', function() {
if (document.querySelector('.popup-thumbnail')) document.querySelector('.popup-thumbnail').remove();
})
let resourcePath = vars.lastListItem.dataset.resourcePath;
let data = getDataFromTreeObject(resourcePath, 'file', vars.currentTreeObject).data;
let lon = (data.lon) ? data.lon : '์์';
let lat = (data.lat) ? data.lat : '์์';
let lonInput = document.querySelector('.edit-mode-ui .coord-input.lon');
let latInput = document.querySelector('.edit-mode-ui .coord-input.lat');
lonInput.value = lon;
latInput.value = lat;
}
export function deletePosition() {
let lonInput = document.querySelector('.edit-mode-ui .coord-input.lon');
let latInput = document.querySelector('.edit-mode-ui .coord-input.lat');
lonInput.value = '์์';
latInput.value = '์์';
updateMarker();
document.querySelector('.edit-mode-ui .save-btn').click();
}
export function renderMemo(fileData, dataId) {
// let infoWrap = document.querySelector('.archive-main-right .viewer-container .info-wrap');
const container = dataId
? document.querySelector(`.archive-main-right .viewer-container[data-data-id="${dataId}"]`)
: document.querySelector('.archive-main-right .viewer-container');
if (!container) return
let infoWrap = container.querySelector('.info-wrap'); // โ
scope ํ์
if (!infoWrap) return;
let editBtn = infoWrap.querySelector('.memo .header .wrap .edit-btn');
let editMessage = infoWrap.querySelector('.memo .header .wrap .message');
let bodyWrap = infoWrap.querySelector('.memo .body .wrap');
let bodyTextarea = infoWrap.querySelector('.memo .body .wrap .textarea');
let bodyMessage = infoWrap.querySelector('.memo .body .wrap .message');
// editBtn ํด๋์ค์ edit ์์ผ๋ฉด ์ถ๊ฐ, save ์์ผ๋ฉด ์ญ์
// if (!editBtn.matches('.edit')) editBtn.classList.add('edit');
// if (editBtn.matches('.save')) editBtn.classList.remove('save');
// editBtn ํ
์คํธ '์์ '์ผ๋ก ๋ณ๊ฒฝ
// if (editBtn) editBtn.querySelector('.text').innerText = '์์ ';
// ์์ ์ํ ๊ฐ์ ์ด๊ธฐํ
if (editBtn?.classList.contains('save')) {
editBtn.classList.remove('save');
}
if (editBtn) editBtn.querySelector('.text').innerText = '์์ ';
// haederMessage ํ์ ์ํ์ธ ๊ฒฝ์ฐ ๋ฐ๋ก ์จ๊น
editMessage.style.transition = '0s';
editMessage.style.opacity = '0';
// bodyWrap ํ
๋๋ฆฌ ๊ฐ์กฐ ํด์
bodyWrap.style.border = '1px solid #ddd';
bodyTextarea.disabled = true;
// bodyTextarea disabled ์ํ๋ก ์ค์
bodyTextarea.disabled = true;
if(fileData == undefined || fileData == '') {
bodyTextarea.value = '';
}else{
bodyTextarea.value = fileData;
}
// ์ํ ์ด๊ธฐํ
// ** ๊ถํ ๊ด๋ จ
let permission = JSON.parse(vars.userInfoString).permission;
if (!vars.permission.checkPermission('memo-text')) {
bodyMessage.innerText = '์ฐธ๊ด์ ๊ถํ์ ์ด๋๋ง ๊ฐ๋ฅํฉ๋๋ค.';
} else {
if(editBtn?.querySelector('.text').innerText == '์์ ') {
if (!editBtn.matches('.edit')) editBtn.classList.add ('edit');
bodyWrap.style.border = '1px solid #ddd';
bodyTextarea.disabled = true;
bodyMessage.innerText = '์์ ๋ฒํผ์ ๋๋ฌ ๋ด์ฉ์ ์์ฑ/์์ ํ ์ ์์ต๋๋ค.';
if (bodyTextarea.value == '') bodyMessage.style.color = '#777';
else bodyMessage.style.color = '#ddd';
}else {
if (editBtn?.matches('.save')) editBtn.classList.remove('save');
if (editBtn) editBtn.querySelector('.text').innerText = '์ ์ฅ';
bodyWrap.style.border = '1px solid #000'
bodyTextarea.disabled = false;
bodyMessage.innerText = '๋ด์ฉ์ ์์ฑํ ํ ์ ์ฅ ๋ฒํผ์ ๋๋ฌ์ฃผ์ธ์.';
}
}
}
let renderTimer = null;
let progressFrame = null;
let progressStart = null;
export async function renderViewer(resourcePath, dataId, shouldAddClickLog = true) {
viewerContainer.style.display = 'flex';
viewerNotice.style.display = 'none';
infoWrap.style.height = '15%';
viewerToolbar.style.display = 'none';
metadata.style.display = 'none';
viewerContainer.dataset.resourcePath = resourcePath;
viewerContainer.dataset.dataId = dataId;
// let memo = infoWrap.querySelector('.memo');
// memo.style.height = '100%';
let toggleBtnText = infoWrap.querySelector('.separator .toggle-btn .text');
//// ๋ฆฌ์คํธ ๋ชจ๋์ ์ง๋ ํ์ ๋ชจ๋์์ ๋ฏธ๋ฆฌ๋ณด๊ธฐ ํ๋จ ์์ญ ๋ค๋ฅด๊ฒ ํ์ --- ์์
// if (listContainer.classList.contains('grid')) {
// infoWrap.style.height = '30%';
// // // ๊ทธ๋ฆฌ๋ ํ์ผ ๋ชฉ๋ก์์ ๋ทฐ์ด ์คํํ ๋ ๋ฉํ๋ฐ์ดํฐ์์ญ, ๋ทฐ์ดํด๋ฐ ํ์
// // viewerWrap.style.display = 'flex';
// // metadata.style.display = 'flex';
// // viewerToolbar.style.display = 'flex';
// // ๊ทธ๋ฆฌ๋ ํ์ผ ๋ชฉ๋ก์์ ๋ทฐ์ด ์คํํ ๋ ๋ฉํ๋ฐ์ดํฐ์์ญ ํ์
// metadata.style.display = 'flex';
// // memo.style.height = 'auto';
// // ๊ทธ๋ฆฌ๋ ์์ดํ
์ ํ์ dom์ ๋ด๊ฒจ์๋ ์ ๋ณด๋ฅผ ๊ฐ์ ธ์์ ๋ฉํ๋ฐ์ดํฐ ์์ญ ๋ด์ฉ ์ถ๊ฐ
// let currentItem = listContainer.querySelector(`.list-body .list-item[data-resource-path="${resourcePath}"]`);
// let arr = ['name', 'uploader', 'create-date', 'author', 'size', 'gps-data'];
// arr.map(a => {
// metadata.querySelector(`.${a} .value`).innerHTML = currentItem.querySelector(`.${a} .text`).innerHTML;
// })
// if (listContainer.querySelector('.list-body .list-item-wrap').style.display == 'flex') {
// // ๊ทธ๋ฆฌ๋ ํ์ผ ๋ชฉ๋ก์์ ๋ทฐ์ด ์คํํ ๋ ๋ทฐ์ดํด๋ฐ ํ์
// viewerToolbar.style.display = 'flex';
// // ๋ฉํ๋ฐ์ดํฐ ์์ญ ์(๋ทฐ์ด ํ๋จ)๋ก ๋ทฐ์ดํด๋ฐ ์์น ์กฐ์
// // viewerToolbar.style.bottom = `${pxToRem(infoWrap.offsetHeight + 16)}rem`;
// // ๋ทฐ์ดํด๋ฐ ์ด์ /๋ค์ ๋ฒํผ์ disabled ํด๋์ค ์ญ์
// let prevBtn = viewerToolbar.querySelector('.prev-btn');
// let nextBtn = viewerToolbar.querySelector('.next-btn');
// prevBtn.classList.remove('disabled');
// nextBtn.classList.remove('disabled');
// // ํ์ฌ ์ ํ๋ ์์ดํ
์ด ์ฒซ๋ฒ์งธ ์์ดํ
์ด๋ฉด ์ด์ ๋ฒํผ์, ๋ง์ง๋ง ์์ดํ
์ด๋ฉด ๋ค์๋ฒํผ์ disabled ํด๋์ค ์ถ๊ฐ
// let listItemArr = [...listContainer.querySelector('.list-body .list-item-wrap').children];
// let currentIdx = listItemArr.indexOf(vars.lastListItem);
// if (currentIdx == 0) viewerToolbar.querySelector('.prev-btn').classList.add('disabled');
// if (currentIdx == listItemArr.length-1) viewerToolbar.querySelector('.next-btn').classList.add('disabled');
// }
// toggleBtnText.textContent = '๋ฉํ๋ฐ์ดํฐ';
// } else {
// toggleBtnText.textContent = '๋ฉ๋ชจ (AI ์์ฝ)';
// }
//// ๋ฆฌ์คํธ ๋ชจ๋์ ์ง๋ ํ์ ๋ชจ๋์์ ๋ฏธ๋ฆฌ๋ณด๊ธฐ ํ๋จ ์์ญ ๋ค๋ฅด๊ฒ ํ์ --- ๋
//// ๋ฆฌ์คํธ ๋ชจ๋์ ์ง๋ ํ์ ๋ชจ๋์์ ๋ฏธ๋ฆฌ๋ณด๊ธฐ ํ๋จ ์์ญ ๋ฉํ๋ฐ์ดํฐ ํํ๋ก ๋์ผํ๊ฒ ํ์ --- ์์
infoWrap.style.height = '30%';
// // ๊ทธ๋ฆฌ๋ ํ์ผ ๋ชฉ๋ก์์ ๋ทฐ์ด ์คํํ ๋ ๋ฉํ๋ฐ์ดํฐ์์ญ, ๋ทฐ์ดํด๋ฐ ํ์
// viewerWrap.style.display = 'flex';
// metadata.style.display = 'flex';
// viewerToolbar.style.display = 'flex';
// ๊ทธ๋ฆฌ๋ ํ์ผ ๋ชฉ๋ก์์ ๋ทฐ์ด ์คํํ ๋ ๋ฉํ๋ฐ์ดํฐ์์ญ ํ์
metadata.style.display = 'flex';
// memo.style.height = 'auto';
// ๊ทธ๋ฆฌ๋ ์์ดํ
์ ํ์ dom์ ๋ด๊ฒจ์๋ ์ ๋ณด๋ฅผ ๊ฐ์ ธ์์ ๋ฉํ๋ฐ์ดํฐ ์์ญ ๋ด์ฉ ์ถ๊ฐ
let parts = resourcePath.split('/').filter(Boolean);
let fileType = parts[3] ?? "";
let currentItem;
// ๋ฒ์ /์ฒจ๋ถํ์ผ์ด ์๋ ๊ฒฝ์ฐ (ํ์ฌ ๋ฒ์ /์ฒจ๋ถํ์ผ์ ์ง๋ํ์์ ํ์์๋จ)
if(!fileType.includes('_version') && !fileType.includes('__attachment')) {
currentItem = listContainer.querySelector(`.list-body .list-item[data-resource-path="${resourcePath}"]`);
} else {
currentItem = vars.lastSelectTarget;
}
let arr = ['name', 'uploader', 'create-date', 'author', 'size', 'gps-data'];
arr.map(a => {
metadata.querySelector(`.${a} .value`).innerHTML = currentItem.querySelector(`.${a} .text`).innerHTML;
})
// if (listContainer.querySelector('.list-body .list-item-wrap').style.display == 'flex') {
// // ๊ทธ๋ฆฌ๋ ํ์ผ ๋ชฉ๋ก์์ ๋ทฐ์ด ์คํํ ๋ ๋ทฐ์ดํด๋ฐ ํ์
// viewerToolbar.style.display = 'flex';
// // ๋ฉํ๋ฐ์ดํฐ ์์ญ ์(๋ทฐ์ด ํ๋จ)๋ก ๋ทฐ์ดํด๋ฐ ์์น ์กฐ์
// // viewerToolbar.style.bottom = `${pxToRem(infoWrap.offsetHeight + 16)}rem`;
// // ๋ทฐ์ดํด๋ฐ ์ด์ /๋ค์ ๋ฒํผ์ disabled ํด๋์ค ์ญ์
// let prevBtn = viewerToolbar.querySelector('.prev-btn');
// let nextBtn = viewerToolbar.querySelector('.next-btn');
// prevBtn.classList.remove('disabled');
// nextBtn.classList.remove('disabled');
// // ํ์ฌ ์ ํ๋ ์์ดํ
์ด ์ฒซ๋ฒ์งธ ์์ดํ
์ด๋ฉด ์ด์ ๋ฒํผ์, ๋ง์ง๋ง ์์ดํ
์ด๋ฉด ๋ค์๋ฒํผ์ disabled ํด๋์ค ์ถ๊ฐ
// let listItemArr = [...listContainer.querySelector('.list-body .list-item-wrap').children];
// let currentIdx = listItemArr.indexOf(vars.lastListItem);
// if (currentIdx == 0) viewerToolbar.querySelector('.prev-btn').classList.add('disabled');
// if (currentIdx == listItemArr.length-1) viewerToolbar.querySelector('.next-btn').classList.add('disabled');
// }
toggleBtnText.textContent = '๋ฉํ๋ฐ์ดํฐ';
//// ๋ฆฌ์คํธ ๋ชจ๋์ ์ง๋ ํ์ ๋ชจ๋์์ ๋ฏธ๋ฆฌ๋ณด๊ธฐ ํ๋จ ์์ญ ๋ฉํ๋ฐ์ดํฐ ํํ๋ก ๋์ผํ๊ฒ ํ์ --- ๋
// console.log('========= renderViewer');
// console.log(resourcePath);
// console.log(dataId);
let pdfArr = ['hwp', 'hwpx', 'doc', 'docx', 'xls', 'xlsx', 'xlsm', 'ppt', 'pptx', 'dwg', 'dxf', 'grm', 'pdf'];
let gsimArr = ['gsim'];
let ifcArr = ['ifc'];
let imageArr = ['png', 'jpg', 'jpeg', 'webp', 'gif'];
let videoArr = ['mp4', 'mov', 'webm'];
let textArr = ['txt', 'log', 'md'];
let urlArr = ['url'];
let zipArr = ['zip'];
let threeArr = ['glb', 'gltf', 'obj', 'stl', 'fbx', '3dm'];
let htmlArr = ['html'];
let allArr = [...pdfArr, ...videoArr, ...imageArr, ...ifcArr, ...gsimArr, ...textArr, ...urlArr, ...zipArr, ...threeArr, ...htmlArr];
let isLowerExt = true;
let ext = splitBaseAndExt(resourcePath, isLowerExt).ext;
let excelDirectArr = ['xls', 'xlsx', 'xlsm'];
let hwpDirectArr = ['hwp', 'hwpx'];
let wordDirectArr = ['docx'];
let isDirectView = excelDirectArr.includes(ext) || hwpDirectArr.includes(ext) || wordDirectArr.includes(ext);
let treeData = getDataFromTreeObject(resourcePath, 'file', vars.currentTreeObject)?.data || {};
let previewKey = treeData.previewKey;
let objectKey = treeData.objectKey || treeData.object_key;
// ๋ฌธ์ ๋ทฐ์ด ์คํ ์ ๋ฏธ๋ฆฌ๋ณด๊ธฐ 10์ฅ ์ ํ ๋ฌธ๊ตฌ ํ์
let thumbAlert = document.querySelector('.archive-main-right .viewer-container .viewer-header .thumb-alert');
if (pdfArr.includes(ext)) {
thumbAlert.style.display = 'flex';
} else {
thumbAlert.style.display = 'none';
}
// fallback-pdf-btn ์จ๊น
const mainFallbackPdfBtn = document.getElementById('main-fallback-pdf-btn');
if (mainFallbackPdfBtn) {
mainFallbackPdfBtn.style.display = 'none';
}
// ์ง์ ํ์ผ์ธ ๊ฒฝ์ฐ ๋ทฐ์ด ํ๋ก๊ทธ๋ ์ค ํ์, ๋๊ธฐ ์๊ฐ 700ms๋ก ์ค์ , ์ ์ฒด๋ณด๊ธฐ ๋ฒํผ ํ์
let originViewBtn = document.querySelector('.archive-main-right .viewer-container .viewer-header .btn');
if (allArr.includes(ext) && (previewKey || isDirectView)) {
toggleViewerProgress(true);
vars.viewerConnectingTime = 700;
originViewBtn.style.display = 'flex';
} else {
toggleViewerProgress(false);
vars.viewerConnectingTime = 0;
originViewBtn.style.display = 'none';
}
if (!shouldAddClickLog) vars.viewerConnectingTime = 0;
clearTimeout(renderTimer);
renderTimer = setTimeout(async () => {
toggleViewerProgress(false);
// ๋ทฐ์ด ์ด๊ธฐํ
vars.viewer = viewerWrap.querySelector('.viewer');
vars.viewer.innerHTML = '';
vars.viewer.style.display = 'flex';
// Presigned URL
let PresignedUrl = undefined;
let openFileViewer = true;
if (!previewKey || !objectKey) {
let getDataInfoParams = {
userInfoString: vars.userInfoString,
storageType: vars.storageType,
dataIdArr: [dataId],
isRemoved: false,
debug: "'renderViewer'์์ ์คํ"
}
let getDataInfoRes = await axios.post(`${vars.path_name}/getDataInfo`, { params: getDataInfoParams } );
if (getDataInfoRes.data.message == 'getDataInfo_success') {
let result = getDataInfoRes.data.result;
if (result) {
previewKey = result.preview_key;
objectKey = result.object_key;
}
}
}
let targetKey = isDirectView ? objectKey : previewKey;
if (allArr.includes(ext)) {
if (targetKey == undefined || targetKey == `` || targetKey == null) {
viewerConvert();
openFileViewer = false;
shouldAddClickLog = false;
} else {
let generateDownloadUrlParams = {
objectKey: targetKey,
resourcePath: resourcePath
}
let generateDownloadUrlRes = await axios.post(`${vars.path_name}/generateDownloadUrl`, generateDownloadUrlParams);
if (generateDownloadUrlRes.data.message == 'generateDownloadUrl_success') {
PresignedUrl = generateDownloadUrlRes.data.url;
}
}
} else {
viewerUnsupport(ext);
openFileViewer = false;
shouldAddClickLog = false;
}
if (openFileViewer) {
let ext = (splitBaseAndExt(resourcePath).ext).toLowerCase();
let pdfArrFiltered = pdfArr.filter(e => !excelDirectArr.includes(e) && !hwpDirectArr.includes(e) && !wordDirectArr.includes(e));
// 3D๋ทฐ์ด ์ธ๋ค์ผ ๋ณ์
const thumbnail_key = getDataFromTreeObject(resourcePath, 'file', vars.currentTreeObject).data?.thumbnailKey;
if (allArr.includes(ext)) {
if (pdfArrFiltered.includes(ext)) viewerPdf(PresignedUrl);
if (excelDirectArr.includes(ext)) viewerExcel(PresignedUrl);
if (hwpDirectArr.includes(ext)) viewerHwp(PresignedUrl);
if (wordDirectArr.includes(ext)) viewerWord(PresignedUrl);
if (gsimArr.includes(ext)) viewerGsim(PresignedUrl);
if (ifcArr.includes(ext)) viewerIfc(PresignedUrl, thumbnail_key, resourcePath, dataId, vars.path_name);
if (threeArr.includes(ext)) viewer3d(PresignedUrl, thumbnail_key, resourcePath, dataId, vars.path_name);
if (imageArr.includes(ext)) viewerImage(PresignedUrl);
if (videoArr.includes(ext)) viewerVideo(PresignedUrl);
if (textArr.includes(ext)) viewerText(PresignedUrl, ext);
if (urlArr.includes(ext)) viewerURL(PresignedUrl);
if (zipArr.includes(ext)) viewerZIP(PresignedUrl);
if (htmlArr.includes(ext)) viewerHTML(PresignedUrl);
} else {
viewerUnsupport(ext);
shouldAddClickLog = false;
}
}
renderTimer = null;
// ํด๋ฆญ ๋ก๊ทธ ์ถ๊ฐ (renderViewer)
if (shouldAddClickLog) {
// console.log('ํด๋ฆญ ๋ก๊ทธ ์ถ๊ฐ (renderViewer)');
let params = {
userInfoString: vars.userInfoString,
dataIdArr: [String(dataId)],
resourcePathArr: [resourcePath],
activity: 'click_file'
}
mgmtFunc_addClickLog(params);
}
// AI ๋ฒํผ ์ํ ๋ณต์ (๋ทฐ์ด ๋ ๋๋ง ์๋ฃ ํ ์คํ)
// restoreAiButtonState(resourcePath, viewerContainer.dataset.dataId);
}, vars.viewerConnectingTime);
function toggleViewerProgress(state) {
let viewerProgress = document.querySelector('.viewer-progress');
let viewerProgressFill = viewerProgress.querySelector('.wrap .bar .fill');
if (state == false) {
viewerProgress.style.display = 'none';
if (progressFrame) {
cancelAnimationFrame(progressFrame);
progressFrame = null;
}
if (viewerProgressFill) viewerProgressFill.style.transform = 'scaleX(0)';
return;
}
if (state == true) {
viewerProgress.style.display = 'flex';
if (progressFrame) cancelAnimationFrame(progressFrame);
progressStart = performance.now();
function animate(now) {
let elapsed = now - progressStart;
let t = Math.min(elapsed / vars.viewerConnectingTime, 1);
let eased = 1 - (1 - t) ** 5;
if (viewerProgressFill) viewerProgressFill.style.transform = `scaleX(${eased})`;
if (elapsed < vars.viewerConnectingTime) progressFrame = requestAnimationFrame(animate);
}
progressFrame = requestAnimationFrame(animate);
}
}
function viewerUnsupport(ext) {
let viewerUnsupportWrap = document.createElement('div');
viewerUnsupportWrap.classList.add('viewer-unsupport-wrap');
let text = document.createElement('div');
text.classList.add('text');
if (isValidExt(ext)) {
// ํ์ฅ์๊ฐ ์ ํจํ ๊ฒฝ์ฐ
text.innerText = `${ext} ํ์ผ ํ์์ ํ์ฌ ์ง์๋์ง ์์ต๋๋ค.`;
} else {
// ํ์ฅ์๊ฐ ์ ํจํ์ง ์์ ๊ฒฝ์ฐ
text.innerText = `ํ์ฅ์๊ฐ ์ ํจํ์ง ์์ ํ์ผ์ ์ง์๋์ง ์์ต๋๋ค.`;
}
viewerUnsupportWrap.appendChild(text);
vars.viewer.appendChild(viewerUnsupportWrap);
vars.viewer.dataset.viewerType = 'unsupport';
}
function viewerConvert() {
let viewerConvertWrap = document.createElement('div');
viewerConvertWrap.classList.add('viewer-convert-wrap');
let text = document.createElement('div');
text.classList.add('text');
text.innerText = `ํด๋น ํ์ผ์ ๋ณํ ํ ์ด๋์ด ๊ฐ๋ฅํฉ๋๋ค.`;
// let convertBtn = document.createElement('div');
// convertBtn.textContent = '๋ณํ';
// convertBtn.classList.add('convert-btn');
// convertBtn.addEventListener('click', () => {
// convertPdf(resourcePath);
// })
viewerConvertWrap.appendChild(text);
// viewerConvertWrap.appendChild(convertBtn);
vars.viewer.appendChild(viewerConvertWrap);
vars.viewer.dataset.viewerType = 'convert';
}
// -----------------------------------------------------------------
// ์คํ์์ค ๋ฌธ์ ์ง์ ๋ทฐ์ ๋ฐ PDF ํด๋ฐฑ ํจ์ ์ ์ (Main Viewer)
// -----------------------------------------------------------------
function initMainFallbackPdfButton(dataId, resourcePath, objectKey, previewKey) {
const btn = document.getElementById('main-fallback-pdf-btn');
if (!btn) return;
// ์ด์ ๋ฑ๋ก๋ ๋ฆฌ์ค๋ ์ ๊ฑฐ๋ฅผ ์ํด ๋ณต์ฌ ๋์ฒด
const newBtn = btn.cloneNode(true);
btn.parentNode.replaceChild(newBtn, btn);
newBtn.style.display = 'flex';
newBtn.querySelector('.text').textContent = 'PDF๋ก ๋ณด๊ธฐ';
newBtn.style.pointerEvents = 'auto';
newBtn.addEventListener('click', async () => {
newBtn.querySelector('.text').textContent = '๋ก๋ฉ ์ค...';
newBtn.style.pointerEvents = 'none';
try {
// 1. ์ต์ ๋ฉํ๋ฐ์ดํฐ (preview_key) ์กฐํ
if (!previewKey) {
let getDataInfoParams = {
userInfoString: vars.userInfoString,
storageType: vars.storageType,
dataIdArr: [dataId],
isRemoved: false,
debug: "main fallback"
}
let getDataInfoRes = await axios.post(`${vars.path_name}/getDataInfo`, { params: getDataInfoParams } );
if (getDataInfoRes.data.message == 'getDataInfo_success') {
let result = getDataInfoRes.data.result;
if (result) {
previewKey = result.preview_key;
objectKey = result.object_key;
}
}
}
// 2. ๋ง์ฝ PDF ๋ณํ๋ณธ์ด ์์ง ์๋ค๋ฉด ๋ฐฑ์๋ ๋ณํ ์์ฒญ
if (!previewKey) {
newBtn.querySelector('.text').textContent = 'PDF ๋ณํ ์์ฒญ ์ค...';
await convertPdf(resourcePath, dataId);
alert('์๋ฒ ์ธก PDF ๋ณํ์ด ์์๋์์ต๋๋ค. ์ ์ ํ ๋ค์ ํด๋ฆญํด ์ฃผ์ธ์.');
newBtn.querySelector('.text').textContent = 'PDF๋ก ๋ณด๊ธฐ';
newBtn.style.pointerEvents = 'auto';
return;
}
// 3. PDF์ฉ Presigned URL ์์ฑ
let generateDownloadUrlParams = {
objectKey: previewKey,
resourcePath: resourcePath
}
let generateDownloadUrlRes = await axios.post(`${vars.path_name}/generateDownloadUrl`, generateDownloadUrlParams);
if (generateDownloadUrlRes.data.message == 'generateDownloadUrl_success') {
let pdfUrl = generateDownloadUrlRes.data.url;
// ํ๋ฉด ์ด๊ธฐํ ๋ฐ PDF ๋ทฐ์ด ๋ก๋
vars.viewer = viewerWrap.querySelector('.viewer');
vars.viewer.innerHTML = '';
newBtn.style.display = 'none';
viewerPdf(pdfUrl);
} else {
alert('PDF ๋ฏธ๋ฆฌ๋ณด๊ธฐ ์ฃผ์ ํ๋์ ์คํจํ์ต๋๋ค.');
newBtn.querySelector('.text').textContent = 'PDF๋ก ๋ณด๊ธฐ';
newBtn.style.pointerEvents = 'auto';
}
} catch (err) {
console.error(err);
alert('PDF ๋ณํ ๋ฐ ์กฐํ ์ค ์ค๋ฅ๊ฐ ๋ฐ์ํ์ต๋๋ค.');
newBtn.querySelector('.text').textContent = 'PDF๋ก ๋ณด๊ธฐ';
newBtn.style.pointerEvents = 'auto';
}
});
}
function viewerExcel(presignedUrl) {
vars.viewer.innerHTML = '์์
๋ฐ์ดํฐ๋ฅผ ๋ถ๋ฌ์ค๋ ์ค...
';
initMainFallbackPdfButton(dataId, resourcePath, objectKey, previewKey);
fetch(presignedUrl)
.then(res => {
if (!res.ok) throw new Error(`HTTP ${res.status} ${res.statusText}`);
return res.arrayBuffer();
})
.then(arrayBuffer => {
vars.viewer.innerHTML = '';
LuckyExcel.transformExcelToLucky(arrayBuffer, function(exportJson, luckysheetfile) {
if(exportJson.sheets == null || exportJson.sheets.length == 0) {
vars.viewer.innerHTML = '์์
๋ฐ์ดํฐ๋ฅผ ํ์ฑํ์ง ๋ชปํ์ต๋๋ค. (xls ํ์ฅ์๋ ์ง์ํ์ง ์์ต๋๋ค.)
';
initMainFallbackPdfButton(dataId, resourcePath, objectKey, previewKey);
return;
}
if (window.luckysheet) {
window.luckysheet.destroy();
}
vars.viewer.style.position = 'relative';
const container = document.createElement('div');
container.id = 'luckysheet_inner';
container.style.margin = '0px';
container.style.padding = '0px';
container.style.position = 'absolute';
container.style.width = '100%';
container.style.height = '100%';
container.style.left = '0px';
container.style.top = '0px';
vars.viewer.appendChild(container);
try {
window.luckysheet.create({
container: 'luckysheet_inner',
data: exportJson.sheets,
title: exportJson.info.name || 'Excel Viewer',
lang: 'en',
showinfobar: false,
myFolderUrl: 'javascript:void(0)'
});
} catch (createErr) {
console.error("Luckysheet create error: ", createErr);
vars.viewer.innerHTML = `
์์
์ํธ ์์ฑ ์ค ์ค๋ฅ๊ฐ ๋ฐ์ํ์ต๋๋ค.
์๋ฌ: ${createErr.message}
`;
}
}, function(err) {
console.error("Luckysheet transform error: ", err);
vars.viewer.innerHTML = `
์์
ํ์ผ์ ์ฝ๋ ์ค ์ค๋ฅ๊ฐ ๋ฐ์ํ์ต๋๋ค.
์์ธ: ${err.message || err}
`;
initMainFallbackPdfButton(dataId, resourcePath, objectKey, previewKey);
});
})
.catch(err => {
console.error(err);
vars.viewer.innerHTML = `
์์
ํ์ผ์ ๋ถ๋ฌ์ค๋๋ฐ ์คํจํ์ต๋๋ค.
์๋ฌ: ${err.message}
`;
initMainFallbackPdfButton(dataId, resourcePath, objectKey, previewKey);
});
vars.viewer.dataset.viewerType = 'excel';
}
function viewerWord(presignedUrl) {
vars.viewer.innerHTML = '์๋ ๋ฌธ์๋ฅผ ๋ถ๋ฌ์ค๋ ์ค...
';
initMainFallbackPdfButton(dataId, resourcePath, objectKey, previewKey);
fetch(presignedUrl)
.then(res => {
if (!res.ok) throw new Error('Word fetch failed');
return res.arrayBuffer();
})
.then(arrayBuffer => {
vars.viewer.innerHTML = '';
const container = document.createElement('div');
container.style.width = '100%';
container.style.height = '100%';
container.style.overflow = 'auto';
container.style.padding = '20px';
container.style.boxSizing = 'border-box';
container.style.background = '#f5f5f5';
const docxInner = document.createElement('div');
docxInner.style.background = '#ffffff';
docxInner.style.margin = '0 auto';
docxInner.style.maxWidth = '800px';
docxInner.style.boxShadow = '0 4px 10px rgba(0,0,0,0.1)';
docxInner.style.padding = '40px';
container.appendChild(docxInner);
vars.viewer.appendChild(container);
docx.renderAsync(arrayBuffer, docxInner)
.then(() => console.log("docx rendered"))
.catch(err => {
console.error(err);
docxInner.innerHTML = '์๋ ๋ฌธ์ ํ์ฑ ์ค ์ค๋ฅ๊ฐ ๋ฐ์ํ์ต๋๋ค. ์๋จ์ "PDF๋ก ๋ณด๊ธฐ" ๋ฒํผ์ ์ด์ฉํด ์ฃผ์ธ์.
';
});
})
.catch(err => {
console.error(err);
vars.viewer.innerHTML = '์๋ ๋ฌธ์๋ฅผ ๋ถ๋ฌ์ค๋๋ฐ ์คํจํ์ต๋๋ค.
';
});
vars.viewer.dataset.viewerType = 'word';
}
function viewerHwp(presignedUrl) {
vars.viewer.innerHTML = 'ํ๊ธ ๋ฌธ์๋ฅผ ๋ถ๋ฌ์ค๋ ์ค...
';
initMainFallbackPdfButton(dataId, resourcePath, objectKey, previewKey);
fetch(presignedUrl)
.then(res => {
if (!res.ok) throw new Error('HWP fetch failed');
return res.blob();
})
.then(blob => {
vars.viewer.innerHTML = '';
const container = document.createElement('div');
container.style.width = '100%';
container.style.height = '100%';
container.style.overflowX = 'auto';
container.style.overflowY = 'auto';
container.style.padding = '20px';
container.style.boxSizing = 'border-box';
container.style.background = '#f5f5f5';
const styleEl = document.createElement('style');
styleEl.textContent = `
.hwp-inner-container {
background: #ffffff;
margin: 0 auto;
width: max-content;
min-width: 800px;
box-shadow: 0 4px 10px rgba(0,0,0,0.1);
padding: 0 !important;
box-sizing: border-box !important;
min-height: 100%;
}
.hwp-inner-container img {
max-width: 100% !important;
height: auto !important;
}
`;
container.appendChild(styleEl);
const hwpInner = document.createElement('div');
hwpInner.classList.add('hwp-inner-container');
container.appendChild(hwpInner);
vars.viewer.appendChild(container);
const reader = new FileReader();
reader.onload = (e) => {
const bstr = e.target.result;
try {
new hwp.Viewer(hwpInner, bstr);
} catch (err) {
console.error("hwp.js error: ", err);
hwpInner.innerHTML = 'ํ๊ธ ๋ฌธ์ ํ์ฑ ์ค ์ค๋ฅ๊ฐ ๋ฐ์ํ์ต๋๋ค. ์๋จ์ "PDF๋ก ๋ณด๊ธฐ" ๋ฒํผ์ ์ด์ฉํด ์ฃผ์ธ์.
';
}
};
reader.readAsBinaryString(blob);
})
.catch(err => {
console.error(err);
vars.viewer.innerHTML = 'ํ๊ธ ๋ฌธ์๋ฅผ ๋ถ๋ฌ์ค๋๋ฐ ์คํจํ์ต๋๋ค.
';
});
vars.viewer.dataset.viewerType = 'hwp';
}
//// ์๋ณธ viewer
async function viewerPdf(presignedUrl) {
if(presignedUrl == undefined || presignedUrl == ``){
viewerConvert();
return;
}
let pdfOptions = {
url : presignedUrl,
initialPage: 1,
}
let iframe = document.createElement('iframe');
iframe.src = `/libs/pdfViewer/web/viewer.html`;
iframe.addEventListener('load', async () => {
// pdf ์คํ ์ ๋ฌด์กฐ๊ฑด 1ํ์ด์ง๋ถํฐ ๋ณด์ด๋๋ก ๊ธฐ์กด pdf ํ์คํ ๋ฆฌ ์ญ์
try {
let appWin = iframe.contentWindow;
// PDF.js์ ๊ธฐ๋ณธ ํ์คํ ๋ฆฌ ํค
appWin.localStorage.removeItem('pdfjs.history');
// ๋๋ ์ฌ๋ฌ ํค ์ญ์
Object.keys(appWin.localStorage).forEach(k => {
if (k.startsWith('pdfjs.history') || k.startsWith('pdfjs.preferences')) {
appWin.localStorage.removeItem(k);
}
});
} catch (e) { /* ignore */ }
let app = document.querySelector('.viewer-container .viewer-wrap .viewer iframe').contentWindow.PDFViewerApplication;
app.pdfCursorTools._handTool.activate();
app.open(pdfOptions);
// ๋ฏธ๋ฆฌ๋ณด๊ธฐ 10ํ์ด์ง ํ์ ์ ํ
app.appConfig.mainContainer.classList.add('scrollbar');
app.appConfig.mainContainer.style.marginLeft = '4px';
iframe.contentWindow.document.querySelector('body').style.backgroundColor = '#383838';
// ๋ฏธ๋ฆฌ๋ณด๊ธฐ 10ํ์ด์ง ํ์ ์ ํ
app.eventBus.on('pagesloaded', async function onPagesLoaded() {
// PDF๊ฐ ์์ ํ ๋ก๋๋ ํ์ ์คํ
// ๋ฏธ๋ฆฌ๋ณด๊ธฐ PDF ํ์ด์ง ์๊ฐ 10์ฅ ์ดํ๋ฉด ๋ฆฌํด
if (app.pagesCount <= 10) return;
let mainContainer = iframe.contentWindow.document.querySelector('#mainContainer');
let viewerContainer = mainContainer.querySelector('#viewerContainer');
let viewer = viewerContainer.querySelector('#viewer');
let pages = viewer.querySelectorAll('.page');
let numPages = mainContainer.querySelector('#toolbarContainer #numPages');
// ํ์ด์ง๊ฐ 10์ฅ ์ด๊ณผ์ธ ๊ฒฝ์ฐ ํด๋ฐ์ ์ต๋ ํ์ด์ง ์ 10ํ์ด์ง๋ก ๊ณ ์
if (app.pagesCount > 10) numPages.innerText = '/ 10';
// ์ต๋ ํ์ด์ง ์ ํ์
numPages.style.display = 'flex';
// ํ์ด์ง ์ซ์ ์
๋ ฅ input disabled ์ฒ๋ฆฌ
let pageNumberInput = mainContainer.querySelector('#toolbarContainer #pageNumber');
pageNumberInput.disabled = true;
pageNumberInput.style.background = '#ddd';
pageNumberInput.style.color = '#999';
// ๋ค์ ํ์ด์ง ๋ฒํผ ํด๋ฆญ ์ 10ํ์ด์ง ๋์ด๊ฐ๋ฉด 10 ํ์ด์ง๋ก ๊ณ ์
let nextBtn = mainContainer.querySelector('#toolbarContainer #next.toolbarButton');
nextBtn.addEventListener('click', function() {
if (pageNumberInput.value > 10) {
pageNumberInput.value = 10;
app.page = 10;
}
})
// 10ํ์ด์ง ๋์ด๊ฐ ์ค์
// -> ํ ํ์ด์ง ๋์ด์ 10์ ๊ณฑํ ๊ฐ์ iframe ๋์ด๋ฅผ ๋นผ์ผ ์คํฌ๋กค์ด ์ ์ผ ์๋๋ก ๋ด๋ ค๊ฐ์ ๋ ๋ง์ง๋ง ํ์ด์ง ๋์ ๋ง์
let pageHeightLimit = (pages[0].offsetHeight * 10) - iframe.offsetHeight;
// pdf๋ทฐ์ด ์คํ ์ ํญ์ ์คํฌ๋กค ์ฒ์์ผ๋ก ๊ณ ์
// viewerContainer.scrollTop = 0;
viewerContainer.addEventListener('scroll', function() {
if (viewerContainer.scrollTop >= pageHeightLimit) {
// ์คํฌ๋กค์ด 10ํ์ด์ง ๋์ด๊ฐ์ ๋๋ฌํ๋ฉด ์คํฌ๋กค์์น๋ฅผ 10ํ์ด์ง ๋(๋์ด๊ฐ)์ผ๋ก ๊ณ ์
viewerContainer.scrollTop = pageHeightLimit;
// ์คํฌ๋กค์ด 10ํ์ด์ง ๋์ด๊ฐ์ ๋๋ฌํ๋ฉด 11ํ์ด์ง๋ถํฐ ์จ๊น์ฒ๋ฆฌ
for (let i = 0; i < pages.length; i++) {
let page = pages[i];
if (i >= 10) {
if (page.querySelector('.canvasWrapper')) page.querySelector('.canvasWrapper').remove(); // ๋๋ ์จ๊น
page.style.backgroundColor = '#383838';
}
}
}
});
// ๊ฐ์ ์คํฌ๋กค๋ฐ ์์ฑ
// ๋ง์ฐ์ค ๋ค์ด ์ํ์์ ๊ฐ์ ์คํฌ๋กค๋ฐ ์์ญ ๋ฒ์ด๋ฌ์ ๋ ์ด๋ฒคํธ ์ฒ๋ฆฌ ํ์
await setupFakeScrollbar(iframe, 10);
// ์ด๋ฒคํธ ๋ฆฌ์ค๋ ์ ๊ฑฐ (์ค๋ณต๋ฐฉ์ง)
app.eventBus.off('pagesloaded', onPagesLoaded);
});
})
vars.viewer.appendChild(iframe);
vars.viewer.dataset.viewerType = 'pdf';
// ๋ฏธ๋ฆฌ๋ณด๊ธฐ 10ํ์ด์ง ํ์ ์ ํ
function setupFakeScrollbar(iframe, visiblePages) {
const doc = iframe.contentWindow.document;
const container = doc.querySelector('#viewerContainer');
if (!container) return;
// fakeScrollbar div ์์ฑ
let fakeScrollbar = document.createElement('div');
fakeScrollbar.className = 'fake-scrollbar';
// thumb ์์ฑ
let fakeThumb = document.createElement('div');
fakeThumb.className = 'fake-thumb';
fakeScrollbar.appendChild(fakeThumb);
// iframe ์์ fakeScrollbar ์ถ๊ฐ
iframe.parentNode.appendChild(fakeScrollbar);
// 10ํ์ด์ง ๋์ด ํฉ์ฐ
let pageDivs = doc.querySelectorAll('.page');
let totalHeight = 0;
for (let i = 0; i < visiblePages && i < pageDivs.length; i++) {
totalHeight += pageDivs[i].offsetHeight;
}
// ์ค์ ์ปจํ
์ด๋ ์ ์ฒด ๋์ด
let contentHeight = doc.querySelector('#viewer').offsetHeight;
let viewportHeight = container.clientHeight;
// fakeThumb์ ๋์ด์ ์ด๋๊ฐ๋ฅ ๋ฒ์ ๊ณ์ฐ
let thumbHeight = Math.max(
(viewportHeight / totalHeight) * viewportHeight,
40
);
fakeThumb.style.height = thumbHeight + 'px';
// fakeThumb ์์น ์
๋ฐ์ดํธ ํจ์
function updateFakeThumb() {
let maxScroll = totalHeight - viewportHeight;
let scroll = Math.min(container.scrollTop, maxScroll);
let top = (scroll / maxScroll) * (viewportHeight - thumbHeight);
fakeThumb.style.top = (isNaN(top) ? 0 : top) + 'px';
}
// ์คํฌ๋กค ์ด๋ฒคํธ ์ฐ๊ฒฐ
container.addEventListener('scroll', (e) => {
updateFakeThumb();
});
// container.addEventListener('wheel', (e) => {
// console.log(e);
// updateFakeThumb();
// });
// fakeThumb ๋๋๊ทธ๋ก ์ค์ ์คํฌ๋กค ์กฐ์
let dragging = false, dragStartY = 0, startScroll = 0;
fakeThumb.addEventListener('mousedown', (e) => {
dragging = true;
dragStartY = e.clientY;
startScroll = container.scrollTop;
document.body.style.userSelect = 'none';
});
window.addEventListener('mousemove', (e) => {
if (!dragging) return;
let delta = e.clientY - dragStartY;
let maxScroll = totalHeight - viewportHeight;
let trackLen = viewportHeight - thumbHeight;
let scroll = startScroll + (delta / trackLen) * maxScroll;
scroll = Math.max(0, Math.min(maxScroll, scroll));
container.scrollTop = scroll;
});
window.addEventListener('mouseup', () => {
dragging = false;
document.body.style.userSelect = '';
});
// fakeThumb์ ์ปจํ
์ด๋ ์์น ์ด๊ธฐ ๋๊ธฐํ
updateFakeThumb();
fakeScrollbar.style.pointerEvents = 'auto';
}
}
function viewerImage(presignedUrl) {
let viewerImageWrap = document.createElement('div');
viewerImageWrap.classList.add('viewer-image-wrap');
let viewerImage = document.createElement('img');
viewerImage.classList.add('viewer-image');
viewerImage.src = presignedUrl;
viewerImageWrap.appendChild(viewerImage);
vars.viewer.appendChild(viewerImageWrap);
vars.viewer.dataset.viewerType = 'image';
}
function viewerVideo(presignedUrl) {
let viewerVideoWrap = document.createElement('div');
viewerVideoWrap.classList.add('viewer-video-wrap');
let viewerVideo = document.createElement('video');
viewerVideo.classList.add('viewer-video');
viewerVideo.autoplay = true;
viewerVideo.muted = true;
viewerVideo.playsInline = true;
viewerVideo.controls = true;
viewerVideo.crossOrigin = 'anonymous';
let sourceElement = document.createElement('source');
sourceElement.src = presignedUrl;
sourceElement.type = 'video/mp4; codecs="avc1.42E01E, mp4a.40.2"';
viewerVideo.appendChild(sourceElement);
viewerVideoWrap.appendChild(viewerVideo);
vars.viewer.appendChild(viewerVideoWrap);
vars.viewer.dataset.viewerType = 'video';
}
function viewerText(presignedUrl, ext) {
let viewerTextWrap = document.createElement('div');
viewerTextWrap.classList.add('viewer-text-wrap');
viewerTextWrap.classList.add('scrollbar');
fetch(presignedUrl).then(res => res.text()).then(data => {
let viewerText = document.createElement('div');
viewerText.classList.add('viewer-text');
if(ext === 'md'){
viewerText.style.whiteSpace = 'normal';
viewerText.classList.add('markdown-body');
// mermaid ์ํ์ค ๋ค์ด์ด๊ทธ๋จ ๋ณํ
const renderer = new marked.Renderer();
const originalCode = renderer.code.bind(renderer);
// ๋จธ๋ฉ์ด๋๋ง ๋ณํํ๊ณ ๋๋จธ์ง๋ ๊ธฐ์กด ๋ ๋๋ฌ ์ฌ์ฉ
renderer.code = (code) => {
if(code.lang === 'mermaid') return `${code.text}`;
return originalCode(code);
}
//mdํ์ผ ํ์ฑ ํ ์ฝ์
marked.setOptions({ gfm: true, breaks: true, renderer});
viewerText.innerHTML = marked.parse(data);
// mermaid ์ด๊ธฐํ ๋ฐ ์์ฑ
const mermaidEls = viewerText.querySelectorAll('.mermaid')
if(mermaidEls.length > 0){
mermaid.initialize({ startOnLoad: false });
mermaid.init(undefined, mermaidEls);
}
} else {
viewerText.textContent = data;
}
viewerTextWrap.appendChild(viewerText);
vars.viewer.appendChild(viewerTextWrap);
if(ext === 'md')hljs.highlightAll();
vars.viewer.dataset.viewerType = 'text';
})
}
function viewerGsim(presignedUrl) {
let viewerGsim = document.createElement('div');
viewerGsim.classList.add('viewer-gsim');
let iframe = document.createElement('iframe');
iframe.onload = () => {
iframe.contentWindow.postMessage({ path: presignedUrl }, '*'); // path ๊ฐ์ iframe์ ์ ๋ฌ
};
iframe.src = `/libs/gsimViewer/gsimViewer.html?path=${encodeURIComponent(presignedUrl)}`;
viewerGsim.appendChild(iframe);
vars.viewer.appendChild(viewerGsim);
vars.viewer.dataset.viewerType = 'gsim';
}
function viewerIfc(presignedUrl, thumbnail_key, resourcePath, dataId, path_name) {
let viewerIfc = document.createElement('div');
viewerIfc.classList.add('viewer-ifc');
let iframe = document.createElement('iframe');
iframe.onload = () => {
iframe.contentWindow.postMessage({ path: presignedUrl, thumbnail_key, resourcePath, dataId, path_name }, '*'); // presignedUrl์ iframe์ ์ ๋ฌ
};
iframe.src = `/libs/ifcViewer/index.html`;
iframe.width = '100%';
iframe.height = '100%';
iframe.style.border = 'none';
viewerIfc.appendChild(iframe);
vars.viewer.appendChild(viewerIfc);
vars.viewer.dataset.viewerType = 'ifc';
}
function viewer3d(presignedUrl, thumbnail_key, resourcePath, dataId, path_name) {
let viewer3d = document.createElement('div');
viewer3d.classList.add('viewer-3d');
let iframe = document.createElement('iframe');
// ๋ฐ์ดํฐ(payload)๋ฅผ ๋ณด๋
iframe.onload = () => {
iframe.contentWindow.postMessage({ path: presignedUrl, thumbnail_key, resourcePath, dataId, path_name}, '*');
};
iframe.src = `/libs/3dViewer/index.html`;
iframe.width = '100%';
iframe.height = '100%';
iframe.style.border = 'none';
viewer3d.appendChild(iframe);
vars.viewer.appendChild(viewer3d);
vars.viewer.dataset.viewerType = '3d';
}
function viewerURL(presignedUrl) {
let viewerURLWrap = document.createElement('div');
viewerURLWrap.classList.add('viewer-text-wrap');
fetch(presignedUrl).then(res => res.text()).then(data => {
let url = data.split('URL=')[1];
let iframe = document.createElement('iframe');
iframe.src = url;
iframe.style.width = '100%'; // ์ปจํ
์ด๋์ ๋ง๊ฒ ๋๋น ์ค์
iframe.style.height = '100%'; // ์ปจํ
์ด๋์ ๋ง๊ฒ ๋์ด ์ค์
iframe.style.border = 'none'; // ํ
๋๋ฆฌ ์ ๊ฑฐ (์ ํ ์ฌํญ)
viewerURLWrap.appendChild(iframe);
vars.viewer.appendChild(viewerURLWrap);
vars.viewer.dataset.viewerType = 'url';
})
}
function viewerHTML(presignedUrl){
let viewerHTMLWrap = document.createElement('div');
viewerHTMLWrap.classList.add('viewer-text-wrap');
fetch(presignedUrl).then(res => res.text()).then(data => {
let iframe = document.createElement('iframe');
iframe.srcdoc = data;
iframe.style.width = '100%'; // ์ปจํ
์ด๋์ ๋ง๊ฒ ๋๋น ์ค์
iframe.style.height = '100%'; // ์ปจํ
์ด๋์ ๋ง๊ฒ ๋์ด ์ค์
iframe.style.border = 'none'; // ํ
๋๋ฆฌ ์ ๊ฑฐ (์ ํ ์ฌํญ)
viewerHTMLWrap.appendChild(iframe);
vars.viewer.appendChild(viewerHTMLWrap);
vars.viewer.dataset.viewerType = 'url';
})
}
function viewerZIP(presignedUrl) {
let viewerTextWrap = document.createElement('div');
viewerTextWrap.classList.add('viewer-text-wrap');
viewerTextWrap.classList.add('scrollbar');
let selectItem = vars.lastListItem.dataset.resourcePath;
fetch(presignedUrl).then(async data => {
let zblob = await data.blob();
const zip = new JSZip();
await zip.loadAsync(zblob);
let folderText = ``;
let fileText = ``;
zip.forEach((relativePath, zipEntry) => {
let slashIdx = relativePath.indexOf('/');
if(slashIdx == -1 || slashIdx == relativePath.length -1){
if(zipEntry.dir){
folderText += `(ํด๋) ${zipEntry.name.split('/')[0]} \n`;
}else{
fileText += `(ํ์ผ) ${zipEntry.name} \n`
}
}
});
if(!vars.lastListItem.dataset.resourcePath || vars.lastListItem.dataset.resourcePath != selectItem) return;
let viewerText = document.createElement('div');
viewerText.classList.add('viewer-text');
viewerText.textContent = `${folderText}${(folderText == ``)?'':'\n'}${fileText}`;
viewerTextWrap.appendChild(viewerText);
vars.viewer.appendChild(viewerTextWrap);
vars.viewer.dataset.viewerType = 'text';
})
}
// ๋ทฐ ๋ ๋ ํ, ์๋ฒ ์ํ๋ฅผ ํ๋ฒ ๋๊ธฐํ
await syncAiStateRestore(resourcePath, dataId);
async function syncAiStateRestore(resourcePath, dataId) {
if (!dataId) return;
try {
const res = await axios.get(`${vars.path_name}/summarizeState`, {
params: { resourcePath, dataId }
});
if (res.data.message === 'summarizeState_success') {
const dataInfo = res.data.dataInfo;
if (dataInfo) {
updateAiButtonState(dataId, 'loading');
} else {
updateAiButtonState(dataId, 'initial');
}
}
} catch(e) {
console.warn(`์๋ฒ ์ํ ๋๊ธฐํ ์คํจ (dataId: ${dataId}):`, e);
updateAiButtonState(dataId, 'initial');
}
}
}
export function resetViewer() {
viewerContainer.style.display = 'none';
viewerContainer.dataset.resourcePath = '';
viewerContainer.dataset.dataId = '';
viewerNotice.style.display = 'flex';
if (!vars.viewer) return;
if (vars.viewer.dataset.viewerType == 'pdf') {
const iframe = vars.viewer.querySelector('.viewer iframe');
if (iframe) {
const app = iframe.contentWindow?.PDFViewerApplication;
app?.close?.();
iframe.remove();
}
}
if (vars.viewer.dataset.viewerType == 'image') {
const imageWrap = vars.viewer.querySelector('.viewer-image-wrap');
if (imageWrap) {
const image = imageWrap.querySelector('.viewer-image');
image.src = '';
image.remove();
imageWrap.remove();
}
}
if (vars.viewer.dataset.viewerType == 'video') {
const videoWrap = vars.viewer.querySelector('.viewer-video-wrap');
if (videoWrap) {
const video = vars.viewer.querySelector('.viewer-video');
video.pause();
video.src = '';
video.load();
video.remove();
videoWrap.remove();
}
}
if (vars.viewer.dataset.viewerType == 'text') {
const textWrap = vars.viewer.querySelector('.viewer-text-wrap');
if (textWrap) {
textWrap.remove();
}
}
if (vars.viewer.dataset.viewerType == '3d') {
const viewer3d = vars.viewer.querySelector('.viewer-3d');
if (viewer3d) {
viewer3d.remove();
}
}
if (vars.viewer.dataset.viewerType == 'excel') {
if (window.luckysheet) {
try {
window.luckysheet.destroy();
} catch (e) {
console.error("Luckysheet destroy error: ", e);
}
}
}
vars.viewer.dataset.viewerType = '';
}
export function renderContextmenu(event, scope) {
/*
depth1 ํด๋ ์ฐํด๋ฆญ ๋ฉ๋ด ํธ๋ฆฌ ์ฐํด๋ฆญ ๋ฉ๋ด ๋ฆฌ์คํธ ์ฐํด๋ฆญ ๋ฉ๋ด
- ์ ํด๋ - ํ์ผ ์
๋ก๋
- ์ด๋ฆ ๋ณ๊ฒฝ - ์ด๋ฆ ๋ณ๊ฒฝ - ์ด๋ฆ ๋ณ๊ฒฝ
- ๋ค์ด๋ก๋ - ๋ค์ด๋ก๋ - ๋ค์ด๋ก๋
- ์ด๋
- ์ญ์ - ์ญ์ - ์ญ์
- ๊ถํ์ค์ (?) - ๊ถํ์ค์ - ๋ด๋น์ ๋ณ๊ฒฝ
* ํธ๋ฆฌ ์ด๋ : depth3 ํด๋๋ depth2 ํด๋ ์ ํํด์ ์ด๋, depth2 ํด๋๋ depth1 ํด๋ ์ ํํด์ ์ด๋
* ๋ฆฌ์คํธ ์ด๋ : depth3 ํด๋ ์ ํํด์ ์ด๋
* ๋ค๋ฅธ depth1 ํด๋ ๋ด์ ํด๋๋ก๋ ์ด๋ํ๋๋ก ํด์ผ๋ ๊น?
* depth1 ํด๋ ํด๋ ์
๋ก๋ : depth1 - depth2 - depth3 - files ์์๋ก ๊ตฌ์ฑ๋ ํด๋ ์
๋ก๋ ํ๋๋ก ๊ฐ์ด๋ ํ์
๊ฐ์ด๋ ์ง์ผ์ง์ง ์๋ ๊ฒฝ์ฐ depth1, depth2์ ํฌํจ๋ ํ์ผ ๋ฐ depth3์ ํฌํจ๋ ํด๋ ๋ฌด์
* ํธ๋ฆฌ ํด๋ ์
๋ก๋ (depth2) : depth2 - depth3 - files ์์๋ก ๊ตฌ์ฑ๋ ํด๋ ์
๋ก๋ ํ๋๋ก ๊ฐ์ด๋ ํ์
๊ฐ์ด๋ ์ง์ผ์ง์ง ์๋ ๊ฒฝ์ฐ depth2์ ํฌํจ๋ ํ์ผ ๋ฐ depth3์ ํฌํจ๋ ํด๋ ๋ฌด์
* ํธ๋ฆฌ ํด๋ ์
๋ก๋ (depth3) : depth3 - files ์์๋ก ๊ตฌ์ฑ๋ ํด๋ ์
๋ก๋ ํ๋๋ก ๊ฐ์ด๋ ํ์
๊ฐ์ด๋ ์ง์ผ์ง์ง ์๋ ๊ฒฝ์ฐ depth3์ ํฌํจ๋ ํด๋ ๋ฌด์
*/
// addContextmenuItem('createFolder');
// addContextmenuItem('uploadFolder', true);
// addContextmenuItem('uploadFile', true);
// addContextmenuItem('renameTarget');
// addContextmenuItem('downloadTarget');
// addContextmenuItem('deleteTarget');
// addContextmenuItem('relocateTarget');
// addContextmenuItem('setPermission');
// addContextmenuItem('editAuthor');
// addContextmenuItem('lev_1');
// addContextmenuItem('lev_2');
// addContextmenuItem('lev_4');
// addContextmenuItem('lev_8');
// addContextmenuItem('lev_0');
let contextmenu = document.querySelector('.contextmenu.main-menu');
contextmenu.style.display = "none";
let contextmenuContainer = contextmenu.querySelector('.contextmenu-container');
contextmenuContainer.innerHTML = '';
let userInfo = JSON.parse(vars.userInfoString);
let isRecycleBinModal = document.querySelector('.recycle-bin-modal').style.display == 'flex';
// ** ๊ถํ ๊ด๋ จ
if (!vars.permission.checkPermission('context-menu-viewer')) {
addContextmenuWarn('viewer');
} else {
if (scope == 'headerBtn') {
// ** ๊ถํ ๊ด๋ จ
if (!vars.permission.checkPermission('context-menu-sub-master')) {
addContextmenuWarn('min-sub-master');
} else {
// addContextmenuItem('createFolder');
addContextmenuItem('renameTarget');
// addContextmenuItem('deleteTarget');
addContextmenuItem('removeTarget');
addContextmenuItem('setPermission');
if(vars.permission.checkPermission('download-folder')) addContextmenuItem('downloadTarget-folder');
}
}
if (scope == 'tree') {
addContextmenuItem('createFolder');
}
if (scope == 'tree-item-wrap-depth2') {
addContextmenuItem('createFolder');
// addContextmenuItem('createFolder-drawing');
// addContextmenuItem('createFolder-gallery');
addContextmenuItem('renameTarget');
// addContextmenuItem('deleteTarget');
addContextmenuItem('removeTarget');
// ** ๊ถํ ๊ด๋ จ
if (vars.permission.checkPermission('context-menu-sub-master')) addContextmenuItem('setPermission');
if(vars.permission.checkPermission('download-folder')) addContextmenuItem('downloadTarget-folder');
}
if (scope == 'tree-item-wrap-depth3') {
addContextmenuItem('renameTarget');
// addContextmenuItem('deleteTarget');
addContextmenuItem('removeTarget');
// ** ๊ถํ ๊ด๋ จ
if (vars.permission.checkPermission('context-menu-sub-master')) addContextmenuItem('setPermission');
if(vars.permission.checkPermission('download-folder')) addContextmenuItem('downloadTarget-folder');
}
if (scope == 'list') {
// ๊ฐค๋ฌ๋ฆฌ ํด๋ ์ง๋๋ชจ๋์ผ ๋ ์๋ด ํ์ ๋ฐ ๋ฆฌํด
let mapContainer = listContainer?.querySelector('.map-container');
if (mapContainer.style.display == 'flex') {
let notificatitonParams = { text: '์ง๋๋ชจ๋์์๋ ์ฐํด๋ฆญ ๊ธฐ๋ฅ์ด ์ ํ๋ฉ๋๋ค.' }
showNotification(notificatitonParams);
return;
}
addContextmenuItem('uploadFile', true, event);
}
if (scope == 'list-item') {
// ํ์ผ ์ด๋ ๋ชจ๋์ธ ๊ฒฝ์ฐ ๋ฆฌํด
if (document.querySelector('.list-viewer-cover').style.display == 'flex') return;
if (isRecycleBinModal) {
addContextmenuItem('downloadTarget');
addContextmenuItem('deleteTarget');
} else {
let listItem = event.target.closest('.list-item');
let state = listItem.getElementsByClassName('state')[0];
if (state && state.classList.contains('working')) {
// ์ฐํด๋ฆญํ ํ์ผ์ด ์์
์ค์ธ ๊ฒฝ์ฐ ๊ฒฝ๊ณ ํ์
addContextmenuItem('uploadFile', true);
addContextmenuWarn('working');
} else {
let existsWorkingListItem;
Array.from(listItem.getElementsByClassName('state')).forEach(state => {
if (state.classList.contains('working')) existsWorkingListItem = true;
})
if (existsWorkingListItem) {
// ์ฐํด๋ฆญํ ํ์ผ์ ์ถ๊ฐ ํ์ผ์ค์ ์์
์ค์ธ ํ์ผ์ด ์๋ ๊ฒฝ์ฐ ๊ฒฝ๊ณ ํ์
addContextmenuItem('uploadFile', true);
addContextmenuWarn('includesWorking');
} else {
addContextmenuItem('uploadFile', true);
addContextmenuItem('addOn_version', true);
addContextmenuItem('addOn_attachment', true);
if (listItem.classList.contains('dwg') || listItem.classList.contains('dxf')) {
//// ๋๋ฉด ctb xref ๊ด๋ จ ์ฝ๋
// addContextmenuItem('addOn_ctb', true);
// addContextmenuItem('addOn_xref', true);
}
addContextmenuItem('renameTarget');
addContextmenuItem('editAuthor');
addContextmenuItem('downloadTarget');
addContextmenuItem('relocateTarget'); // ํ์ผ์ด๋
addContextmenuItem('removeTarget');
}
}
}
if (!isRecycleBinModal && userInfo.group == 'dev') {
addContextmenuItem('mgmtFunc_resetConvert');
}
// ๋ค์ค์ญ์ , ๋ค์ค์ด๋ ์ ์ปจํ
์คํธ๋ฉ๋ด ์ถ๊ฐ
}
if (scope == 'grid-item') {
let gridItem = event.target.closest('.grid-item');
// ํ์ผ ์ด๋ ๋ชจ๋์ธ ๊ฒฝ์ฐ ๋ฆฌํด
if (document.querySelector('.list-viewer-cover').style.display == 'flex') return;
addContextmenuItem('uploadFile', true, event);
if (gridItem.classList.contains('dwg') || gridItem.classList.contains('dxf')) {
//// ๋๋ฉด ctb xref ๊ด๋ จ ์ฝ๋
// addContextmenuItem('addOn_ctb', true);
// addContextmenuItem('addOn_xref', true);
}
addContextmenuItem('renameTarget');
addContextmenuItem('editAuthor');
addContextmenuItem('downloadTarget');
addContextmenuItem('relocateTarget'); // ํ์ผ์ด๋
addContextmenuItem('removeTarget');
}
if (scope == 'map-item') {
// ๊ฐค๋ฌ๋ฆฌ ํด๋ ์ง๋๋ชจ๋์ผ ๋ ์๋ด ํ์ ๋ฐ ๋ฆฌํด
let mapContainer = listContainer?.querySelector('.map-container');
if (mapContainer.style.display == 'flex') {
let notificatitonParams = { text: '์ง๋๋ชจ๋์์๋ ์ฐํด๋ฆญ ๊ธฐ๋ฅ์ด ์ ํ๋ฉ๋๋ค.' }
showNotification(notificatitonParams);
return;
}
// addContextmenuItem('uploadFile', true, event);
// addContextmenuItem('renameTarget');
// addContextmenuItem('downloadTarget');
// addContextmenuItem('relocateTarget'); // ํ์ผ์ด๋
// addContextmenuItem('removeTarget');
}
if (scope == 'sub-list-item') {
let listItem = event.target.closest('.list-item');
// ์ถ๊ฐ ํ์ผ์ disabled ํด๋์ค๊ฐ ํฌํจ๋์ด ์์ผ๋ฉด ๋ฆฌํด (ํ์ผ ์ด๋ ๋ชจ๋)
if (listItem.classList.contains('disabled')) return;
let state = listItem.getElementsByClassName('state')[0];
if (state && state.classList.contains('working')) {
// ์ฐํด๋ฆญํ ์ถ๊ฐ ํ์ผ์ด ์์
์ค์ธ ๊ฒฝ์ฐ ๊ฒฝ๊ณ ํ์
addContextmenuWarn('working');
} else {
addContextmenuItem('renameTarget');
addContextmenuItem('editAuthor');
addContextmenuItem('downloadTarget');
addContextmenuItem('relocateTarget');
addContextmenuItem('removeTarget');
// addContextmenuItem('deleteTarget');
}
if (userInfo.group == 'dev') addContextmenuItem('mgmtFunc_resetConvert');
// ๋ค์ค์ญ์ , ๋ค์ค์ด๋ ์ ์ปจํ
์คํธ๋ฉ๋ด ์ถ๊ฐ
}
if (scope == 'multi-select-list') {
if (isRecycleBinModal) {
addContextmenuItem('downloadTarget');
addContextmenuItem('deleteTarget');
} else {
let existsWorkingListItem;
let existsMainListItem;
let extArr = [];
vars.multiSelectListItemArr.map(listItem => {
if (listItem.classList.contains('main-list-item')) {
existsMainListItem = true;
Array.from(listItem.getElementsByClassName('state')).forEach(state => {
if (state.classList.contains('working')) existsWorkingListItem = true;
})
let resourcePath = listItem.dataset.resourcePath;
let isLowerExt = true;
let ext = splitBaseAndExt(resourcePath, isLowerExt).ext;
extArr.push(ext);
} else {
let state = listItem.getElementsByClassName('state')[0];
if (state && state.classList.contains('working')) existsWorkingListItem = true;
}
})
// ํ์ฅ์ ๋ฐฐ์ด ๋ด์์ ์ค๋ณต์์ ์ ๊ฑฐ
extArr = extArr.filter((element, index) => {
return extArr.indexOf(element) === index;
});
if (existsWorkingListItem) {
// vars.multiSelectListItemArr์ ํฌํจ๋ ํ์ผ ํน์ ํ์ผ์ ์ถ๊ฐ ํ์ผ์ค์ ์์
์ค์ธ ํ์ผ์ด ์๋ ๊ฒฝ์ฐ ๊ฒฝ๊ณ ํ์
addContextmenuWarn('includesWorking');
} else {
// ๋๋ฉด ํ์ฅ์
let drawingExtArr = ['dwg', 'dxf'];
// ํ์ฅ์ ๋ฐฐ์ด์ ๋๋ฉด ํ์ฅ์๋ค๋ง ๋ค์ด์๋์ง ํ์ธ
let isDrawingExtMatch = (extArr, drawingExtArr) => {
let extArrSet = new Set(extArr);
// ์ต์ 1๊ฐ ์ด์ ์์ด์ผ ํจ
if (extArrSet.size === 0) return false;
// extArrSet์ด drawingExtArr์ ๋ถ๋ถ์งํฉ์ธ์ง ํ์ธ
for (let ext of extArrSet) {
if (!drawingExtArr.includes(ext)) return false;
}
return true;
};
// ์ฐํด๋ฆญ ํ ๋์์ด main-list-item์ด๊ณ , ํ์ฅ์ ๋ฐฐ์ด์ ๋๋ฉด ํ์ฅ์๋ค๋ง ๋ค์ด์์ผ๋ฉด 'CTBํ์ผ ์ผ๊ด ์ถ๊ฐ', 'XREFํ์ผ ์ผ๊ด ์ถ๊ฐ' ๋ฉ๋ด ์ถ๊ฐ
let listItem = event.target.closest('.list-item');
if (listItem.classList.contains('main-list-item') && isDrawingExtMatch(extArr, drawingExtArr)) {
//// ๋๋ฉด ctb xref ๊ด๋ จ ์ฝ๋
// addContextmenuItem('addOn_ctb_bulk', true);
// addContextmenuItem('addOn_xref_bulk', true);
}
addContextmenuItem('editAuthor');
addContextmenuItem('downloadTarget');
addContextmenuItem('removeTarget');
addContextmenuItem('relocateTarget');
}
// addContextmenuItem('deleteTarget');
}
}
}
contextmenu.style.display = "flex";
contextmenu.style.left = event.clientX + 5 + "px";
contextmenu.style.top = event.clientY + 10 + "px";
// ํธ์์ฑ - contextmenu๊ฐ ํ๋ฉด ์์ญ ์๋/์์ผ๋ก ๋ค์ด๊ฐ์ง ์๋๋ก ์์น ์กฐ์
if (contextmenu.offsetHeight + event.clientY > window.innerHeight) {
contextmenu.style.top = (event.clientY - contextmenu.offsetHeight) + "px";
}
if (contextmenu.offsetWidth + event.clientX > window.innerWidth) {
contextmenu.style.left = (event.clientX - contextmenu.offsetWidth) + "px";
}
function addContextmenuWarn(target) {
// target : min-sub-master (๋ถ๊ด๋ฆฌ์ ๋ฏธ๋ง) / viewer (์ฐธ๊ด์)
let html;
if (target == 'min-sub-master') html = `์๋จ ๋ฉ๋ด์ ์์ฑ/ํธ์ง/์ญ์ ๋ ๋ถ๊ด๋ฆฌ์ ๊ถํ ์ด์์์๋ง ๊ฐ๋ฅํฉ๋๋ค.`;
if (target == 'viewer') html = `์ฐธ๊ด์ ๊ถํ์ ์ด๋๋ง ๊ฐ๋ฅํฉ๋๋ค.`;
if (target == 'working') html = `๋ณํ์ค์ธ ํ์ผ์ ํธ์ง/์ญ์ ๊ฐ ๋ถ๊ฐ๋ฅํฉ๋๋ค.`;
if (target == 'includesWorking') html = `์ ํํ ํ์ผ ๋๋ ๊ด๋ จ๋ ๋ฒ์ /์ฒจ๋ถ ํ์ผ ์ค ๋ณํ์ค์ธ ํญ๋ชฉ์ด ์์ด ํธ์ง/์ญ์ ๊ฐ ๋ถ๊ฐ๋ฅํฉ๋๋ค.`;
let contextmenuWarn = document.createElement('div');
contextmenuWarn.classList.add('contextmenu-warn');
contextmenuWarn.classList.add('contextmenu-padding');
contextmenuContainer.appendChild(contextmenuWarn);
let wrap = document.createElement('div');
wrap.classList.add('wrap');
let text = document.createElement('div');
text.classList.add('text');
text.innerHTML = html;
wrap.appendChild(text);
contextmenuWarn.appendChild(wrap);
}
function addContextmenuItem(id, useInputFile, event) {
let menuData = getMenuData(id);
let contextmenuItem = document.createElement('div');
contextmenuItem.id = id;
contextmenuItem.classList.add('contextmenu-item');
let img = document.createElement('img');
let imgFileName = id.replace('_bulk', '');
img.src = `/main/img/archive/contextmenu/${imgFileName}.svg`;
img.alt = `${imgFileName}_icon`;
let wrap = document.createElement('div');
wrap.classList.add('wrap');
let name = document.createElement('div');
name.classList.add('name');
name.innerText = menuData.menuNameKor;
wrap.appendChild(name);
// let shortcut;
// if (menuData.shortcut) {
// shortcut = document.createElement('div');
// shortcut.classList.add('shortcut');
// shortcut.innerText = menuData.shortcut;
// wrap.appendChild(shortcut);
// }
if (id == 'removeTarget' && vars.lastContextTarget.matches('.folder')) {
img.src = `/main/img/archive/contextmenu/deleteTarget.svg`;
img.alt = `deleteTarget_icon`;
name.innerText = '์ญ์ ';
}
if (useInputFile) {
let isGalleryFolder = false, isDrawingFolder = false;
if (vars.lastFolderType == 'gallery') isGalleryFolder = true;
if (vars.lastFolderType == 'drawing') isDrawingFolder = true;
let form = document.createElement('form');
form.classList.add('btn');
form.enctype = 'multipart/form-data';
let input = document.createElement('input');
input.type = 'file';
input.id = `${id}Input`;
if (id.includes('File') || id.includes('addOn')) {
input.setAttribute('multiple', '');
input.setAttribute('onclick', 'this.value=null;');
}
if (id.includes('Folder')) {
input.setAttribute('webkitdirectory', '');
input.setAttribute('directory', '');
input.setAttribute('onclick', 'this.value=null;');
}
let label = document.createElement('label');
label.id = `${id}Label`;
label.classList.add('contextmenu-padding');
label.setAttribute('for', `${id}Input`);
label.appendChild(img);
label.appendChild(wrap);
form.appendChild(input);
form.appendChild(label);
contextmenuItem.appendChild(form);
} else {
contextmenuItem.classList.add('contextmenu-padding');
contextmenuItem.appendChild(img);
contextmenuItem.appendChild(wrap);
if (id == 'createFolder') {
// ์ ํด๋ ๋ฉ๋ด์ ๋ง์ฐ์ค์ค๋ฒ ์ ํด๋ ๋ง๋ค์ด์ง๋ ๊ฒฝ๋ก ํดํ ํ์?
contextmenuItem.addEventListener('mouseover', (e) => {
// console.log(e.target);
// console.log('์ ํด๋');
})
}
if (id == 'relocateTarget') {
}
if (id == 'setPermission') {
contextmenuItem.classList.add('mouseover');
let toggle = document.createElement('div');
toggle.classList.add('image');
toggle.classList.add('toggle');
wrap.appendChild(toggle);
let subContextmenu = document.createElement('div');
subContextmenu.classList.add('contextmenu');
subContextmenu.classList.add('sub-menu');
let subContextmenuContainer = document.createElement('div');
subContextmenuContainer.classList.add('contextmenu-container');
let resourcePath = vars.lastContextTarget.dataset.resourcePath;
let data = getDataFromTreeObject(resourcePath, 'folder').data;
let dataPermission = data.permission;
let lev1 = getSubContextmenuItem('lev_1', dataPermission);
// let lev2 = getSubContextmenuItem('lev_2', dataPermission);
let lev4 = getSubContextmenuItem('lev_4', dataPermission);
let lev8 = getSubContextmenuItem('lev_8', dataPermission);
let lev0 = getSubContextmenuItem('lev_0', dataPermission);
subContextmenuContainer.appendChild(lev1);
// subContextmenuContainer.appendChild(lev2);
subContextmenuContainer.appendChild(lev4);
subContextmenuContainer.appendChild(lev8);
subContextmenuContainer.appendChild(lev0);
subContextmenu.appendChild(subContextmenuContainer);
contextmenuItem.appendChild(subContextmenu);
// ๊ถํ ์ค์ ๋ฉ๋ด ๋ง์ฐ์ค์ค๋ฒ ์ ํ์ ๋ฉ๋ด ํ์
document.addEventListener('mousemove', throttle((e) => {
if (document.querySelector('.contextmenu.main-menu').style.display == 'flex') {
let subMenu = document.querySelector('.contextmenu.sub-menu');
if (!subMenu) return;
if (e.target.id == 'setPermission' || subMenu.contains(e.target)) {
subMenu.style.display = 'flex';
let parentHeight = subMenu.parentElement.offsetHeight;
//ํธ์์ฑ - subMenu๊ฐ ํ๋ฉด ์์ญ ์๋๋ก ๋ค์ด๊ฐ์ง ์๋๋ก ์์น ์กฐ์
if (subMenu.offsetHeight + e.clientY > window.innerHeight) {
subMenu.style.top = `-${subMenu.offsetHeight - parentHeight - 4}px`;
}
} else {
subMenu.style.display = 'none';
}
}
}, 100))
}
}
contextmenuContainer.appendChild(contextmenuItem);
contextmenuItem.addEventListener('click', (e) => {
let targetId = e.target.id;
let resourcePath, dataId;
let lastContextTarget;
let isRecycleBinModal = document.querySelector('.recycle-bin-modal').style.display == 'flex';
if (isRecycleBinModal) {
lastContextTarget = vars.lastContextTarget_bin;
} else {
lastContextTarget = vars.lastContextTarget;
}
if (lastContextTarget) resourcePath = lastContextTarget.dataset.resourcePath;
if (lastContextTarget) dataId = lastContextTarget.dataset.id;
if (targetId == 'createFolder') openCreateFolderModal(resourcePath);
if (targetId == 'renameTarget') openRenameModal(resourcePath);
// if (targetId == 'downloadTarget') downloadTarget();
if (targetId == 'downloadTarget') openDownloadModal(resourcePath);
if (targetId == 'downloadTarget-folder') openDownloadModal(resourcePath);
if (targetId == 'relocateTarget') toggleRelocateCover(true, resourcePath);
if (targetId == 'removeTarget') openRemoveModal(resourcePath);
if (targetId == 'deleteTarget') openDeleteModal(resourcePath);
// if (targetId == 'setPermission')
if (targetId == 'editAuthor') openEditAuthorModal(resourcePath);
if (targetId == 'lev_1') setDataPermission(resourcePath, targetId);
// if (targetId == 'lev_2')
if (targetId == 'lev_4') setDataPermission(resourcePath, targetId);
if (targetId == 'lev_8') setDataPermission(resourcePath, targetId);
if (targetId == 'lev_0') setDataPermission(resourcePath, targetId);
if (targetId == 'mgmtFunc_resetConvert') mgmtFunc_resetConvert(resourcePath, dataId);
})
contextmenuItem.addEventListener('change', (e) => {
let uploadDataOption = {
functionId: id,
dataType: 'file',
}
if (id == 'uploadFile') {
// console.log(111);
let files = e.target.files;
uploadData(files, uploadDataOption);
// ์ปจํ
์คํธ๋ฉ๋ด ์ด๊ธฐํ
contextmenu.querySelector('.contextmenu-container').innerHTML = '';
}
if (id == 'addOn_version' || id == 'addOn_attachment') {
// console.log(222);
let files = e.target.files;
let uploadDataOption = {
functionId: id,
dataType: 'file',
addOnTarget: vars.lastContextTarget.dataset.resourcePath
}
uploadData(files, uploadDataOption);
// ์ปจํ
์คํธ๋ฉ๋ด ์ด๊ธฐํ
contextmenu.querySelector('.contextmenu-container').innerHTML = '';
}
//// ๋๋ฉด ctb xref ๊ด๋ จ ์ฝ๋
if (id.includes('addOn_ctb') || id.includes('addOn_xref')) {
// console.log(333);
// vars.multiSelectListItemArr ์ผ๋ก ๋ฐฐ์ด ๋๋ ค์ ์๋ uploadData๋ฅผ ์ฌ๋ฌ๋ฒ ์คํ?
// let files = e.target.files
// let uploadDataOption = {
// functionId: id,
// dataType: 'file',
// addOnTarget: vars.lastContextTarget.dataset.resourcePath
// }
// uploadData(files, uploadDataOption);
// // ์ปจํ
์คํธ๋ฉ๋ด ์ด๊ธฐํ
// contextmenu.querySelector('.contextmenu-container').innerHTML = '';
}
})
}
function getSubContextmenuItem(id, dataPermission) {
let menuData = getMenuData(id);
let subContextmenuItem = document.createElement('div');
subContextmenuItem.id = id;
subContextmenuItem.classList.add('contextmenu-item');
subContextmenuItem.classList.add('contextmenu-padding');
subContextmenuItem.classList.add('set-permission-item');
// ** ๊ถํ ๊ด๋ จ (ํด๋์ค์๋ ํฌํจ ์๋ ์์ )
// id : lev_1, lev_2, lev_4, lev_8, lev_0
if (id.split('_')[1] == dataPermission) subContextmenuItem.classList.add('check');
let img = document.createElement('img');
img.src = `/main/img/permission/${menuData.menuNameEng}.svg`;
img.alt = `${id}_icon`;
let wrap = document.createElement('div');
wrap.classList.add('wrap');
let name = document.createElement('div');
name.classList.add('name');
name.innerText = menuData.menuNameKor;
let image = document.createElement('div');
image.classList.add('image');
wrap.appendChild(name);
wrap.appendChild(image);
subContextmenuItem.appendChild(img);
subContextmenuItem.appendChild(wrap);
return subContextmenuItem;
}
function getMenuData(id) {
let result = { menuNameKor: undefined, shortcut: undefined };
if (id == 'createFolder') result.menuNameKor = '์ ํด๋', result.shortcut = 'Ctrl ';
if (id == 'uploadFolder') result.menuNameKor = 'ํด๋ ์
๋ก๋', result.shortcut = 'Ctrl ';
if (id == 'uploadFile') result.menuNameKor = 'ํ์ผ ์
๋ก๋', result.shortcut = 'Ctrl ';
// if (id == 'uploadFile') result.menuNameKor = 'ํ์ฌ ํด๋์ ํ์ผ ์
๋ก๋', result.shortcut = 'Ctrl ';
if (id == 'addOn_version') result.menuNameKor = '๋ฒ์ ํ์ผ ์ถ๊ฐ', result.shortcut = 'Ctrl ';
if (id == 'addOn_attachment') result.menuNameKor = '์ฒจ๋ถํ์ผ ์ถ๊ฐ', result.shortcut = 'Ctrl ';
if (id == 'addOn_ctb') result.menuNameKor = 'CTBํ์ผ ์ถ๊ฐ', result.shortcut = 'Ctrl ';
if (id == 'addOn_xref') result.menuNameKor = 'XREFํ์ผ ์ถ๊ฐ', result.shortcut = 'Ctrl ';
if (id == 'addOn_ctb_bulk') result.menuNameKor = 'CTBํ์ผ ์ผ๊ด ์ถ๊ฐ', result.shortcut = 'Ctrl ';
if (id == 'addOn_xref_bulk') result.menuNameKor = 'XREFํ์ผ ์ผ๊ด ์ถ๊ฐ', result.shortcut = 'Ctrl ';
if (id == 'renameTarget') result.menuNameKor = '์ด๋ฆ ๋ณ๊ฒฝ', result.shortcut = 'F2';
if (id == 'relocateTarget') result.menuNameKor = '์์น ์ด๋', result.shortcut = 'Ctrl ';
if (id == 'downloadTarget') result.menuNameKor = '๋ค์ด๋ก๋', result.shortcut = 'Ctrl ';
if (id == 'downloadTarget-folder') result.menuNameKor = 'ํด๋๋ค์ด๋ก๋(๊ด๋ฆฌ์)', result.shortcut = 'Ctrl ';
if (id == 'removeTarget') result.menuNameKor = 'ํด์งํต์ผ๋ก ์ด๋', result.shortcut = 'Del';
if (id == 'deleteTarget') result.menuNameKor = '์ญ์ ', result.shortcut = 'Del';
if (id == 'editAuthor') result.menuNameKor = '์์ฑ์ ๋ณ๊ฒฝ', result.shortcut = 'Ctrl ';
if (id == 'setPermission') result.menuNameKor = '๊ถํ ์ค์ ';
if (id == 'lev_1') result.menuNameKor = '์ฐธ๊ด์', result.menuNameEng = 'viewer';
// if (id == 'lev_2') result.menuNameKor = '์
๋ก๋';
if (id == 'lev_4') result.menuNameKor = '์ผ๋ฐ์ฐธ์ฌ์', result.menuNameEng = 'worker';
if (id == 'lev_8') result.menuNameKor = '๋ณด์์ฐธ์ฌ์', result.menuNameEng = 'security-worker';
if (id == 'lev_0') result.menuNameKor = '๋ถ๊ด๋ฆฌ์', result.menuNameEng = 'sub-master';
if (id == 'mgmtFunc_resetConvert') result.menuNameKor = '(๊ฐ๋ฐ์) ๋ณํ ์ด๊ธฐํ';
return result;
}
}
export async function renderSizeBar() {
if (checkProjectInactive()) return;
// return;
let getFolderSizeParams = { storageType: vars.storageType };
let getFolderSizeRes = await axios.get(`${vars.path_name}/getFolderSize`, { params: { params: getFolderSizeParams } });
if (getFolderSizeRes.data.message == 'getFolderSize_success') {
let result = getFolderSizeRes.data.result;
let totalSize = 0, totalCount = 0;
for(let i = 0; i < result.length; i++) {
let item = result[i];
let key = item.key;
let size = Number(item.size);
let count = Number(item.count);
item.text = getSizeText(key);
totalSize += size, totalCount += count;
}
vars.bucketSize = totalSize;
vars.remainingSize = vars.bucketMaxSize - vars.bucketSize;
vars.foldersSize = result;
//// ์ฉ๋ / ์ต๋์ฉ๋, ์ฉ๋ ๋ง๋, ํผ์ผํธ ์ ์ฉ ๋ฒ์
// let footerSizeWrap = document.querySelector('body > .footer .left .size-wrap');
// let sizeTextNumerator = footerSizeWrap.querySelector('.size-text .numerator');
// let sizeTextDenominator = footerSizeWrap.querySelector('.size-text .denominator');
// let sizeBarBase = footerSizeWrap.querySelector('.size-bar .base');
// let sizeBarValue = footerSizeWrap.querySelector('.size-bar .value');
// let sizePercent = footerSizeWrap.querySelector('.size-percent');
// // ์ฌ์ฉ์ค์ธ ์ฉ๋ / ์ต๋ ์ฉ๋ ํ
์คํธ
// sizeTextNumerator.innerHTML = formatBytes(vars.bucketSize);
// sizeTextDenominator.innerHTML = formatBytes(vars.bucketMaxSize);
// // ์ต๋ ์ฉ๋ ๋๋น ์ฌ์ฉ์ค์ธ ์ฉ๋ ๋น์จ
// let usageRatio = (vars.project) ? vars.bucketSize / vars.bucketMaxSize : 0;
// // ์ต๋ ์ฉ๋ ๋ง๋ ๊ธธ์ด
// let sizeBarBaseLength = sizeBarBase.offsetWidth;
// // ์ฌ์ฉ์ค์ธ ์ฉ๋ ๋ง๋ ๊ธธ์ด
// let sizeBarValueLength = sizeBarBaseLength * usageRatio;
// if (sizeBarValueLength > sizeBarBaseLength) sizeBarValueLength = sizeBarBaseLength;
// sizeBarValue.style.width = `${sizeBarValueLength}px`;
// // ์ต๋ ์ฉ๋ ๋๋น ์ฌ์ฉ์ค์ธ ์ฉ๋ ํผ์ผํธ
// let usagePercent = usageRatio * 100;
// sizePercent.innerText = `${formatPercent(usagePercent)} %`;
// if (usagePercent > 90) {
// sizeTextNumerator.classList.add('over');
// sizeBarValue.classList.add('over');
// sizePercent.classList.add('over');
// } else {
// sizeTextNumerator.classList.remove('over');
// sizeBarValue.classList.remove('over');
// sizePercent.classList.remove('over');
// }
//// ํผ์ผํธ ์ ์ฉ ๋ฒ์
let footerSizeWrap = document.querySelector('body > .footer .left .size-wrap');
let sizePercent = footerSizeWrap.querySelector('.size-percent');
// ์ต๋ ์ฉ๋ ๋๋น ์ฌ์ฉ์ค์ธ ์ฉ๋ ๋น์จ
let usageRatio = (vars.project) ? vars.bucketSize / vars.bucketMaxSize : 0;
// ์ต๋ ์ฉ๋ ๋๋น ์ฌ์ฉ์ค์ธ ์ฉ๋ ํผ์ผํธ
let usagePercent = usageRatio * 100;
sizePercent.innerText = `${formatPercent(usagePercent)} %`;
if (usagePercent > 90) {
sizePercent.classList.add('over');
} else {
sizePercent.classList.remove('over');
}
//// ๋ชจ๋ฌ ์ ์ฅ๊ณต๊ฐ ํ์ด๊ทธ๋ํ
let dom = document.querySelector('.archive-modal .modal-body .size-wrap .chart');
let chart = echarts.init(dom, null, {
renderer: 'canvas',
useDirtyRect: false
});
let chartColor = {
'์ฌ์ ๊ณต๊ฐ': '#ccc',
'ํด์งํต': '#777',
'์์นด์ด๋ธ ์๋ณธ': '#03AEFC',
'์์นด์ด๋ธ ๋ณํPDF': '#4DB251',
'์์นด์ด๋ธ ๋ฏธ๋ฆฌ๋ณด๊ธฐPDF': '#FF3D00',
'๊ณต๋ฌธ ์๋ณธ': '#FFBF00',
'๊ณต๋ฌธ ๋ณํPDF': '#B92ED1',
'๊ณผ์
๊ฐ์': '#4255BD'
};
// rawData ๋ฐฐ์ด์ ์์ฑํ๊ณ , rowData๋ฅผ ๋ค์ ์ฉ๋๋ณ ๋ฐ์ดํฐ ๋ฐฐ์ด๋ก ๊ฐ๊ณต
let rawData = [
{
value: (vars.remainingSize < 0) ? 0 : vars.remainingSize, // ์ฌ์ ๊ณต๊ฐ์ด 0๋ณด๋ค ์์ผ๋ฉด 0์ผ๋ก ํ์
name: `์ฌ์ ๊ณต๊ฐ (${formatBytes(vars.remainingSize)})`,
itemStyle: { color: chartColor['์ฌ์ ๊ณต๊ฐ'] }
}
];
for (let i = 0; i < vars.foldersSize.length; i++) {
let item = vars.foldersSize[i];
let obj = {};
if (item.size == 0) continue;
obj.value = item.size;
obj.name = `${item.text} (${formatBytes(item.size)} / ${item.count} ๊ฐ)`;
obj.itemStyle = { color: chartColor[item.text] };
rawData.push(obj);
}
// ํ์ด๊ทธ๋ํ์ฉ ์ค์ ๋ฐ์ดํฐ
let mainData = rawData.filter(d => d.value > 0);
// ํ์ด๊ทธ๋ํ์ฉ ๋๋ฏธ ๋ฐ์ดํฐ
let dummyData = rawData.filter(d => d.value <= 0).map(d => ({
...d,
name: `{over|${d.name}}`,
value: 1
}));
// ๋ฒ๋ก์ฉ ๋ฐ์ดํฐ (์ฌ์ ๊ณต๊ฐ์ด 0 ์ดํ์ธ ๊ฒฝ์ฐ rich ์ต์
์ฌ์ฉ์ ์ํด {style_name|} ์ถ๊ฐ)
let legendData = rawData.map(d => ({
name: (d.value <= 0) ? `{over|${d.name}}` : d.name,
icon: 'circle',
}));
// ํ์ดํ์ฉ ํ
์คํธ (์ฌ์ ๊ณต๊ฐ์ด 0 ์ดํ์ธ ๊ฒฝ์ฐ rich ์ต์
์ฌ์ฉ์ ์ํด {style_name|} ์ถ๊ฐ)
// let titleText = (vars.remainingSize <= 0)
// ? `{normal|์ ์ฒด๊ณต๊ฐ (${formatBytes(vars.bucketMaxSize)})} โ {normal|์ฌ์ฉ๊ณต๊ฐ (${formatBytes(vars.bucketSize)})} โ {over|์ฌ์ ๊ณต๊ฐ (${formatBytes(vars.remainingSize)})}`
// : `์ ์ฒด๊ณต๊ฐ (${formatBytes(vars.bucketMaxSize)}) โ ์ฌ์ฉ๊ณต๊ฐ (${formatBytes(vars.bucketSize)}) โ ์ฌ์ ๊ณต๊ฐ (${formatBytes(vars.remainingSize)})`
let titleText = (usagePercent > 90)
? `{normal|์ ์ฒด๊ณต๊ฐ} {bold|${formatBytes(vars.bucketMaxSize)}}\n{normal|์ฌ์ฉ๊ณต๊ฐ} {bold|${formatBytes(vars.bucketSize)}}\n{normal_over|์ฌ์ ๊ณต๊ฐ} {bold_over|${formatBytes(vars.remainingSize)} (${formatPercent(usagePercent)} %)}`
: `{normal|์ ์ฒด๊ณต๊ฐ} {bold|${formatBytes(vars.bucketMaxSize)}}\n{normal|์ฌ์ฉ๊ณต๊ฐ} {bold|${formatBytes(vars.bucketSize)}}\n{normal|์ฌ์ ๊ณต๊ฐ} {bold|${formatBytes(vars.remainingSize)} (${formatPercent(usagePercent)} %)}`
let option;
let fontFamily = 'Pretendard Variable, Pretendard';
let fontSize = 12;
let fontWeight = 600;
option = {
title: {
text: titleText,
// left: 'center',
// top: 10,
left: 20,
top: 12,
textStyle: {
lineHeight: 30,
rich: {
// rich ์ต์
normal: {
fontFamily: fontFamily,
fontSize: fontSize,
color: '#000000'
},
normal_over: {
fontFamily: fontFamily,
fontSize: fontSize,
color: '#ff0000'
},
bold: {
fontFamily: fontFamily,
fontSize: fontSize,
color: '#000000',
fontWeight: fontWeight
},
bold_over: {
fontFamily: fontFamily,
fontSize: fontSize,
color: '#ff0000',
fontWeight: fontWeight
},
}
},
},
textStyle: {
fontFamily: 'Pretendard Variable, Pretendard',
fontSize: 12,
},
tooltip: {
trigger: 'item',
formatter: function (params) {
return `${params.marker} ${params.name}`;
}
},
legend: {
orient: 'vertical',
left: 20,
bottom: 20,
// top: 'middle',
itemWidth: 16,
itemHeight: 16,
data: legendData,
textStyle: {
fontFamily: 'Pretendard Variable, Pretendard',
fontSize: 12,
rich: {
// rich ์ต์
over: { color: '#ccc' }
}
}
},
series: [
{
// ์ค์ ํ์ด ๊ทธ๋ํ
type: 'pie',
radius: '60%',
center: ['65%', '50%'],
data: mainData,
label: {
formatter: function (params) {
return `${params.name.split(' (')[0]}`;
},
minMargin: 5,
position: 'outer',
alignTo: 'labelLine',
bleedMargin: 20,
},
labelLine: {
show: true,
length: 80,
length2: 0,
},
minAngle: 2, // ์ต์ ๊ฐ๋ ์ค์
itemStyle: {
borderRadius: 4,
borderColor: '#ffffff',
borderWidth: 1
},
emphasis: {
// ๋ง์ฐ์ค hover ๊ฐ์กฐ ์ ์์ ์ ์ง
itemStyle: {
color: 'inherit',
shadowBlur: 10,
shadowOffsetX: 0,
shadowColor: 'rgba(0, 0, 0, 0.5)'
}
}
},
{
// ๋๋ฏธ ํ์ด๊ทธ๋ํ (ํ์ด๊ทธ๋ํ๋ ํ์ํ์ง ์๊ณ ๋ฒ๋ก๋ง ํ์)
type: 'pie',
radius: ['0%', '0%'], // ๋ณด์ด์ง ์๋๋ก ๋ฐ์ง๋ฆ 0%
center: ['70%', '50%'],
label: { show: false }, // ํ์ด๊ทธ๋ํ ์ฃผ๋ณ ๋ผ๋ฒจ ํ์ ์ํจ
labelLine: { show: false }, // ํ์ด๊ทธ๋ํ์ ํ์ด๊ทธ๋ํ ์ฃผ๋ณ ๋ผ๋ฒจ์ ์ฐ๊ฒฐํ๋ ์ ํ์ ์ํจ
data: dummyData.map(d => ({
...d,
value: 1 // ๋ฒ๋ก ํ์๋ฅผ ์ํด value ์ค์
})),
emphasis: {
disabled: true // ๋ง์ฐ์ค hover ๊ฐ์กฐ ๋นํ์ฑํ
}
}
]
};
if (option && typeof option === 'object') {
chart.setOption(option);
}
chart.resize();
function formatPercent(percent) {
let result = percent.toFixed(2);
let decimalPointNum = result.split('.')[1];
// ์์์ ์๋ ์ซ์๊ฐ 00์ธ ๊ฒฝ์ฐ
if (decimalPointNum == '00') result = result.split('.')[0];
// ์์์ ์๋ ๋๋ฒ์งธ ์ซ์๊ฐ 0์ธ ๊ฒฝ์ฐ
else if (decimalPointNum[1] == '0') result = `${result.split('.')[0]}.${decimalPointNum[0]}`;
return result;
}
function getSizeText(key) {
let result;
let keySplit = key.split('/');
if (keySplit[1]) {
let prefix, suffix;
if (keySplit[0] == 'archive') prefix = '์์นด์ด๋ธ';
if (keySplit[0] == 'official_doc') prefix = '๊ณต๋ฌธ';
if (keySplit[1] == 'origin') suffix = '์๋ณธ';
if (keySplit[1] == 'pdf') suffix = '๋ณํPDF';
if (keySplit[1] == 'pdf_thumb') suffix = '๋ฏธ๋ฆฌ๋ณด๊ธฐPDF';
result = `${prefix} ${suffix}`;
} else {
if (keySplit[0] == 'recycle_bin') result = 'ํด์งํต';
if (keySplit[0] == 'overview') result = '๊ณผ์
๊ฐ์';
}
return result;
}
}
}
export async function renderLog(isInit, addFooterLog, filterValues) {
if (checkProjectInactive()) return;
// addFooterLog : ํธํฐ ๋ก๊ทธ ์ถ๊ฐ ์ฌ๋ถ
// ๊ธฐ๋ณธ์ true, ํ๋ ๋ก๊ทธ ๋ชจ๋ฌ ์ด ๋ ์คํํ๋ renderLog์์๋ false
if (addFooterLog == undefined) addFooterLog = true;
let footerLatestLog = document.querySelector('body > .footer .left .log-wrap .latest-log');
let modalLogItemWrap = document.querySelector('.archive-modal .modal-body .log-wrap .log-item-wrap.log-body');
// ๋ก๊ทธ ๋ฐ์ดํฐ ๊ฐ์ ธ์์ ์ ์ญ ๋ณ์์ ์ ์ฅ
if (filterValues != undefined) {
vars.logData = filterValues;
}else {
let logRes = await axios.get(`${vars.path_name}/getLog`);
vars.logData = logRes.data.logData;
}
modalLogItemWrap.innerHTML = '';
// ์๋ก ๋ก๊ทธ ๋ ๋ํ๊ธฐ ์ ์ ๋ง์ง๋ง์ผ๋ก ์ถ๊ฐ๋ log-item ์ ๋๋ฉ์ด์
์ด๊ธฐํ
vars.newLogItemArr.forEach(newLogItem => {
newLogItem.style.setProperty('--log-highlight', 'none');
})
vars.newLogItemArr = [];
Object.values(vars.logData).forEach((data, idx) => {
// ๋ก๊ทธ id (์ํ์ค ๋ฒํธ)
let logId = data.log_id;
// let existingLogItem = document.querySelector(`.log-${logId}`);
// if (existingLogItem) {
// // ์ ๋๋ฉ์ด์
์ด๊ธฐํ
// // existingLogItem.style.setProperty('--log-highlight', 'none');
// } else {
// ๋ก๊ทธ ์๊ฐ (yy. MM. dd. hh:mm:ss)
let logDate = new Date(data.log_date);
logDate = `${changeDateFormat(logDate.toLocaleDateString('ko-KR'))} ${logDate.toLocaleTimeString('en-US', {hour12: false})}`;
// ์์ด๋ก ๋ ํ๋ id๋ฅผ ํ๊ธ๋ก ๋ฒ์ญ
let activity = data.activity;
let activityKor = translateActivity(activity);
let activityType = activity.split('_')[0];
// data์์ ์ ์ ๊ด๋ จ ๋ณ์๋ค ์ ์ฅ ํ ์กฐํฉํด์ ์ ์ ์ ๋ณด ๋ณ์ ์์ฑ
// let userId = data.user_id;
// let userCompany = data.user_company;
// let userDept = data.user_dept;
let userNm = data.user_nm;
let userPosition = '';
if (data.user_position) userPosition = data.user_position;
// let user = `${userCompany} ${userDept} ${userNm} ${userPosition}`;
let user = (`${userNm} ${userPosition}`).trim();
if (activity == 'removeTarget_folder_expired') user = '-';
// ํ๋ ๋ณ log ๋ฐ id ์์ฑํด์ ๊ฐ๊ฐ ๋ฐฐ์ด์ ์ถ๊ฐ
let pathArr;
try {
pathArr = typeof data.path_arr === 'string' ? JSON.parse(data.path_arr) : data.path_arr;
} catch (e) {
pathArr = Array.isArray(data.path_arr) ? data.path_arr : [data.path_arr];
}
let idArr = [], dateArr = [], userArr = [], activityArr = [], logArr = [];
if (activity == 'uploadData_file') {
// ํ์ผ ์
๋ก๋ ๊ฒฝ์ฐ ๋ค์ค ์
๋ก๋๊ฐ ๊ฐ๋ฅํ๋ฏ๋ก ์
๋ก๋ ๋ ํ์ผ๋ง๋ค ๋ก๊ทธ ์์ฑ
for (let i = 0; i < pathArr.length; i++) {
let id = `${logId}_${logDate}_${user}_${activityKor}_${pathArr[i]}`;
let log = document.createElement('div');
log.classList.add('log');
log.classList.add(activityType);
let logText = document.createElement('div');
logText.classList.add('text');
logText.innerHTML = `${pathArr[i]}`;
log.appendChild(logText);
idArr.push(id);
dateArr.push(logDate);
userArr.push(user);
activityArr.push(activityKor);
logArr.push(log);
}
} else if (activity.startsWith('renameTarget')) {
let id = `${logId}_${logDate}_${user}_${activityKor}_${pathArr[0]}`;
if (pathArr[1]) id += `_${pathArr[1]}`;
let log = document.createElement('div');
log.classList.add('log');
log.classList.add(activityType);
let logText1 = document.createElement('div');
logText1.classList.add('text');
logText1.innerHTML = `๋ณ๊ฒฝ ์ : ${pathArr[0]}`;
let logText2 = document.createElement('div');
logText2.classList.add('text');
logText2.innerHTML = `๋ณ๊ฒฝ ํ : ${pathArr[1]}`;
log.appendChild(logText1);
log.appendChild(logText2);
let width1 = getTextPixelWidth(`๋ณ๊ฒฝ ์ : `);
logText1.style.textIndent = `-${pxToRem(width1-2)}rem`;
logText1.style.paddingLeft = `${pxToRem(width1-2)}rem`;
let width2 = getTextPixelWidth(`๋ณ๊ฒฝ ํ : `);
logText2.style.textIndent = `-${pxToRem(width2-2)}rem`;
logText2.style.paddingLeft = `${pxToRem(width2-2)}rem`;
idArr.push(id);
dateArr.push(logDate);
userArr.push(user);
activityArr.push(activityKor);
logArr.push(log);
} else if (activity.startsWith('relocateTarget')) {
for (let i = 0; i < pathArr.length; i++) {
let id = `${logId}_${logDate}_${user}_${activityKor}_${pathArr[i].from}_${pathArr[i].to}`;
let log = document.createElement('div');
log.classList.add('log');
log.classList.add(activityType);
let logText1 = document.createElement('div');
logText1.classList.add('text');
logText1.innerHTML = `์ด๋ ์ : ${pathArr[i].from}`;
let logText2 = document.createElement('div');
logText2.classList.add('text');
logText2.innerHTML = `์ด๋ ํ : ${pathArr[i].to}`;
log.appendChild(logText1);
log.appendChild(logText2);
let width1 = getTextPixelWidth(`๋ณ๊ฒฝ ์ : `);
logText1.style.textIndent = `-${pxToRem(width1-2)}rem`;
logText1.style.paddingLeft = `${pxToRem(width1-2)}rem`;
let width2 = getTextPixelWidth(`๋ณ๊ฒฝ ํ : `);
logText2.style.textIndent = `-${pxToRem(width2-2)}rem`;
logText2.style.paddingLeft = `${pxToRem(width2-2)}rem`;
idArr.push(id);
dateArr.push(logDate);
userArr.push(user);
activityArr.push(activityKor);
logArr.push(log);
}
} else if (activity.startsWith('setDataPermission')) {
let path = pathArr[0].resourcePath;
let beforePermission = pathArr[0].beforePermission;
let newPermission = pathArr[0].newPermission;
let id = `${logId}_${logDate}_${user}_${activityKor}_${path}_${beforePermission}_${newPermission}`;
let log = document.createElement('div');
log.classList.add('log');
log.classList.add(activityType);
let logText1 = document.createElement('div');
logText1.classList.add('text');
logText1.innerHTML = `${path}`;
let logText2 = document.createElement('div');
logText2.classList.add('text');
logText2.innerHTML = `๊ธฐ์กด ๊ถํ : ${beforePermission} โ ์ ๊ท ๊ถํ : ${newPermission}`;
log.appendChild(logText1);
log.appendChild(logText2);
idArr.push(id);
dateArr.push(logDate);
userArr.push(user);
activityArr.push(activityKor);
logArr.push(log);
} else if (activity.startsWith('addPermission') || activity.startsWith('deletePermission')){
let id = `${logId}_${logDate}_${user}_${activityKor}_${pathArr[0]}`;
if (pathArr[1]) id += `_${pathArr[1]}`;
let log = document.createElement('div');
log.classList.add('log');
log.classList.add(activityType);
let logText = document.createElement('div');
logText.classList.add('text');
// ์ ์ ๊ถํ ๋ก๊ทธ๋ ํ๋ช
์ด๊ณผ์ ๋๊ตฌ ์ธ O๋ช
์ผ๋ก ํํ
logText.innerHTML = pathArr.length === 1 ? pathArr[0] : `${pathArr[0]} ์ธ ${pathArr.length - 1}๋ช
`;
log.appendChild(logText);
idArr.push(id);
dateArr.push(logDate);
userArr.push(user);
activityArr.push(activityKor);
logArr.push(log);
} else if (activity == 'editAuthor') {
for (let i = 0; i < pathArr.length; i++) {
let path = pathArr[i].resourcePath;
let prevAuthorNm = pathArr[i].prevAuthorNm;
let newAuthorNm = pathArr[i].newAuthorNm;
let id = `${logId}_${logDate}_${user}_${activityKor}_${path}_${prevAuthorNm}_${newAuthorNm}`;
let log = document.createElement('div');
log.classList.add('log');
log.classList.add(activityType);
let logText1 = document.createElement('div');
logText1.classList.add('text');
logText1.innerHTML = `${path}`;
let logText2 = document.createElement('div');
logText2.classList.add('text');
logText2.innerHTML = `๊ธฐ์กด ์์ฑ์ : ${prevAuthorNm} โ ์ ๊ท ์์ฑ์ : ${newAuthorNm}`;
log.appendChild(logText1);
log.appendChild(logText2);
idArr.push(id);
dateArr.push(logDate);
userArr.push(user);
activityArr.push(activityKor);
logArr.push(log);
}
} else {
for (let i = 0; i < pathArr.length; i++) {
let id = `${logId}_${logDate}_${user}_${activityKor}_${pathArr[0]}`;
if (pathArr[1]) id += `_${pathArr[1]}`;
let log = document.createElement('div');
log.classList.add('log');
log.classList.add(activityType);
let logText = document.createElement('div');
logText.classList.add('text');
logText.innerHTML = `${pathArr[i]}`;
log.appendChild(logText);
idArr.push(id);
dateArr.push(logDate);
userArr.push(user);
activityArr.push(activityKor);
logArr.push(log);
}
}
for (let i = 0; i < logArr.length; i++) {
let id = idArr[i];
let date = dateArr[i];
let user = userArr[i];
let activity = activityArr[i];
let log = logArr[i];
let dateDiv = document.createElement('div');
dateDiv.classList.add('date');
let dateText = document.createElement('div');
dateText.classList.add('text');
dateText.innerHTML = date;
dateDiv.appendChild(dateText);
let userDiv = document.createElement('div');
userDiv.classList.add('user');
let userText = document.createElement('div');
userText.classList.add('text');
userText.innerHTML = user;
userDiv.appendChild(userText);
let activityDiv = document.createElement('div');
activityDiv.classList.add('activity');
let activityText = document.createElement('div');
activityText.classList.add('text');
activityText.innerHTML = activity;
activityDiv.appendChild(activityText);
let logItem = document.createElement('div');
logItem.id = id;
logItem.classList.add('log-item');
logItem.classList.add(`log-${logId}`);
logItem.appendChild(dateDiv);
logItem.appendChild(userDiv);
logItem.appendChild(activityDiv);
logItem.appendChild(log);
// modalLogItemWrap.prepend(logItem);
modalLogItemWrap.prepend(logItem);
// vars.newLogItemArr ๋ฐฐ์ด์ ์๋ก์ด ๋ก๊ทธ ์์ดํ
์ถ๊ฐ
vars.newLogItemArr.push(logItem);
}
// }
})
// vars.newLogItemArr ๋ฐฐ์ด์ ์๋ ๋ก๊ทธ ์์ดํ
์ ์ ๋๋ฉ์ด์
์ถ๊ฐ
for (let i = 0; i < vars.newLogItemArr.length; i++) {
let newLogItem = vars.newLogItemArr[i];
if (!isInit) {
newLogItem.style.setProperty('--log-highlight', 'log-highlight 1s linear(0 0%, 1 50%, 0 100%) 0s 2 normal none running');
}
}
// ๋ชจ๋ฌ ๋ก๊ทธ ์์ดํ
์ค ์ต์ ๋ก๊ทธ ๋ณต์
if (addFooterLog) {
let modalLatestLog = modalLogItemWrap.children[0];
if (modalLatestLog) {
let modalLatestLogClone = modalLatestLog.cloneNode(true);
// ํธํฐ ๋ก๊ทธ ์์ญ ๋น์ฐ๊ณ ๋ณต์ ํ ๋ก๊ทธ ์ถ๊ฐ
if (footerLatestLog) {
let dateClone = modalLatestLogClone.querySelector('.date').cloneNode(true);
let userClone = modalLatestLogClone.querySelector('.user').cloneNode(true);
let activityClone = modalLatestLogClone.querySelector('.activity').cloneNode(true);
let logClone = modalLatestLogClone.querySelector('.log').cloneNode(true);
let separator1 = document.createElement('div');
separator1.classList.add('log-separator');
let separator2 = document.createElement('div');
separator2.classList.add('log-separator');
let separator3 = document.createElement('div');
separator3.classList.add('log-separator');
footerLatestLog.innerHTML = '';
footerLatestLog.appendChild(modalLatestLogClone);
modalLatestLogClone.innerHTML = '';
modalLatestLogClone.appendChild(dateClone);
modalLatestLogClone.appendChild(separator1);
modalLatestLogClone.appendChild(userClone);
modalLatestLogClone.appendChild(separator2);
modalLatestLogClone.appendChild(activityClone);
modalLatestLogClone.appendChild(separator3);
modalLatestLogClone.appendChild(logClone);
}
}
}
//// ํ๋๋ก๊ทธ ๋ชจ๋ฌ์์ ์๊ฐ, ์ ์ , ํ๋์ข
๋ฅ ๊ฐ๊ฐ ์ ์ผ ๊ธด ํญ๋ชฉ ๊ธฐ์ค์ผ๋ก width ์กฐ์
if (document.querySelector('.archive-modal .modal-body .log-wrap').style.display == 'flex') {
// ํ๋๋ก๊ทธ๊ฐ ์ด๋ ค์์ ๋์๋ง ์ ์ฉ
let dateDivs = modalLogItemWrap.querySelectorAll('.log-item .date');
let userDivs = modalLogItemWrap.querySelectorAll('.log-item .user');
let activityDivs = modalLogItemWrap.querySelectorAll('.log-item .activity');
resizeLogDivs(dateDivs);
resizeLogDivs(userDivs);
resizeLogDivs(activityDivs);
let firstLog = document.querySelector('.log-item-wrap.log-body').childNodes[0];
if (firstLog?.classList?.contains('log-item')) {
let dateWidth = firstLog.getElementsByClassName('date')[0].offsetWidth;
let userWidth = firstLog.getElementsByClassName('user')[0].offsetWidth;
let activityWidth = firstLog.getElementsByClassName('activity')[0].offsetWidth;
document.querySelector('.log-item-wrap.log-header .date').style.width = `${dateWidth}px`;
document.querySelector('.log-item-wrap.log-header .user').style.width = `${userWidth}px`;
document.querySelector('.log-item-wrap.log-header .activity').style.width = `${activityWidth}px`;
}
}
document.querySelector('.archive-modal .modal-body > .log-wrap').style.opacity = '1';
function getTextPixelWidth(text) {
let remPx = parseFloat(getComputedStyle(document.documentElement).fontSize);
let fontPx = remPx * 0.8;
let font = `${fontPx}px "Noto Sans KR"`;
let canvas = document.createElement('canvas');
let context = canvas.getContext('2d');
context.font = font;
let width = context.measureText(text).width;
return width;
}
function resizeLogDivs(divs) {
let maxTextWidth = 0;
divs.forEach(div => {
let text = div.querySelector('.text');
let textWidth = getTextPixelWidth(text.textContent);
if (textWidth > maxTextWidth) maxTextWidth = textWidth;
})
divs.forEach(div => {
div.style.width = `${pxToRem(maxTextWidth+8)}rem`;
})
}
}
export async function renderEditAuthorUserList(inputWrap, keyword) {
let confirmBtn = document.querySelector('.archive-modal .modal-body .btn-wrap .confirm-btn');
confirmBtn.classList.add('disabled');
// ๊ธฐ์กด ๊ฒฝ๊ณ ๋ฌธ๊ตฌ ์์ผ๋ฉด ์ญ์
if (document.querySelector('.archive-modal .input-wrap .warn')) {
inputWrap.removeChild(document.querySelector('.archive-modal .input-wrap .warn'));
}
// ๊ฒฝ๊ณ ๋ฌธ๊ตฌ dom ์์ฑ
let warn = document.createElement('div');
warn.classList.add('warn');
warn.style.top = `${inputWrap.offsetHeight}px`;
inputWrap.appendChild(warn);
// ์ด๋ฆ์ผ๋ก ํํฐ๋ง ์ดํ ์ง๊ธ์ผ๋ก ์ ๋ ฌ
let users = vars.permissionList.all;
let positionMap = {'ํ์ฅ': 1, '๋ถํ์ฅ':2, '์ฌ์ฅ':3, '์์๊ณ ๋ฌธ':4, '๊ธฐ์ ์์':5, '๋ถ์ฌ์ฅ':6, '๊ณ ๋ฌธ':7, '์ ๋ฌด์ด์ฌ':8, '์์์ฐ๊ตฌ์':9, '์๋ฌด์ด์ฌ':10, '์ด์ฌ':11, '์ฑ
์์ฐ๊ตฌ์':12, '๋ถ์ฅ':13, '์ฐจ์ฅ':14, '์ ์์ฐ๊ตฌ์':15, '๊ณผ์ฅ':16, '์ฐ๊ตฌ์':17, '๋๋ฆฌ':18, '์ฌ์':19};
let resultArr = users.filter(user => user.user_nm?.toLowerCase().includes(keyword)).sort((a,b) => {
let aPosition = positionMap[a.position] ?? 99;
let bPosition = positionMap[b.position] ?? 99;
if(aPosition !== bPosition) return aPosition - bPosition;
return a.user_id.localeCompare(b.user_id);
})
// ์ํฉ์ ๋ฐ๋ผ ๊ฒฝ๊ณ ๋ฌธ๊ตฌ ํ
์คํธ ์ถ๊ฐ ๋๋ renameTarget ์งํ
if (keyword == '') {
warn.innerText = '๊ฒ์์ฐฝ์ ์ด๋ฆ์ ์
๋ ฅํด์ฃผ์ธ์.';
} else if (resultArr.length === 0) {
warn.innerText = '๊ฒ์ ๊ฒฐ๊ณผ๊ฐ ์์ต๋๋ค.';
} else {
// ๊ฒฝ๊ณ ๋ฌธ๊ตฌ dom ์ญ์
inputWrap.removeChild(warn);
// ์ง์ ๋ฆฌ์คํธ ์์ฑ
let userListWrap = document.querySelector('.archive-modal .modal-body .user-list-wrap');
let userItemWrap = userListWrap.querySelector('.user-item-wrap');
// ์์ฑ์ ๋ณ๊ฒฝ ์ ํ ๊ฒฐ๊ณผ ์จ๊น
// let selectedUserItemWrap = userListWrap.querySelector('.selected-user-item-wrap');
// let selectedUserItem = selectedUserItemWrap.querySelector('.selected-user-item');
userListWrap.style.display = 'flex';
userListWrap.style.width = `${pxToRem(inputWrap.getBoundingClientRect().width)}rem`;
userItemWrap.innerHTML = '';
// ์์ฑ์ ๋ณ๊ฒฝ ์ ํ ๊ฒฐ๊ณผ ์จ๊น
// selectedUserItemWrap.style.display = 'none';
// selectedUserItem.innerHTML = '';
for (let result of resultArr) {
let userItem = document.createElement('div');
userItem.classList.add('user-item');
userItem.dataset.userId = result.user_id;
userItem.dataset.userNm = result.user_nm;
let userImage = document.createElement('img');
userImage.classList.add('user-image');
let defaultImageUrl = '/main/img/archive/empty-profile.svg';
let userImageUrl = defaultImageUrl;
if (/^[a-zA-Z]{1}\d{5}$/.test(result.user_id)) userImageUrl = `http://erp.hanmaceng.co.kr/erpphoto/${result.user_id}.jpg`;
userImage.src = userImageUrl;
// onerror ํธ๋ค๋ฌ ๋ฐ์ธ๋ฉ (ํ๋ฒ๋ง ๋์ํ๋๋ก)
userImage.onerror = function() {
this.onerror = null; // ๋ฌดํ๋ฃจํ ๋ฐฉ์ง
this.src = defaultImageUrl;
};
let userInfo = document.createElement('div');
userInfo.classList.add('user-info');
let userCompany = document.createElement('div');
userCompany.classList.add('user-company');
let userCompanyIcon = document.createElement('img');
userCompanyIcon.classList.add('user-company-icon');
userCompanyIcon.src = `/main/img/permission/s-icon__${result.company}-small-logo.svg`;
let userCompanyText = document.createElement('div');
userCompanyText.classList.add('user-company-text');
userCompanyText.innerHTML = result.company;
let userName = document.createElement('div');
userName.classList.add('user-name');
userName.innerHTML = (`${result.user_nm} ${result.position ?? ''}`).trim();
userItemWrap.appendChild(userItem);
userItem.appendChild(userImage);
userItem.appendChild(userInfo);
userInfo.appendChild(userCompany);
userInfo.appendChild(userName);
userCompany.appendChild(userCompanyIcon);
userCompany.appendChild(userCompanyText);
userItem.addEventListener('click', (e) => {
userItemWrap.childNodes.forEach(item => {
if (e.target == item) {
item.classList.add('selected');
} else {
item.classList.remove('selected');
}
})
// ์์ฑ์ ๋ณ๊ฒฝ ์ ํ ๊ฒฐ๊ณผ ์จ๊น
// let userItemClone = userItem.cloneNode(true);
// if (selectedUserItemWrap.style.display != 'flex') selectedUserItemWrap.style.display = 'flex';
// selectedUserItem.innerHTML = '';
// selectedUserItem.appendChild(userItemClone);
document.querySelector('.archive-modal .modal-body .btn-wrap .confirm-btn').classList.remove('disabled');
})
}
}
}
export function changeHeaderBtnStyle(headerBtn) {
// if (vars.lastHeaderBtn) vars.lastHeaderBtn.classList.remove('selected');
// document.querySelectorAll('.header-center .menu-tab .btn').forEach(e => {
document.querySelectorAll('body > .header .center .btn').forEach(e => {
e.classList.remove('selected');
});
// if (document.querySelector('.official-doc-btn')) document.querySelector('.official-doc-btn').classList.remove('selected');
if (headerBtn) vars.lastHeaderBtn = headerBtn;
if (vars.lastHeaderBtn) {
vars.lastHeaderBtn.classList.add('selected');
// let treeTitle = document.querySelector()
}
// vars.users[JSON.parse(vars.userInfoString).clientId].curPath = resourcePath;
// vars.lastMainTreeItem = undefined;
// vars.lastListItem = undefined;
// vars.lastContextTarget = undefined;
// vars.lastSelectTarget = undefined;
// document.querySelector('.archive-main-center .list-container .list-wrap.list-header').dataset.resourcePath = '';
// document.querySelector('.archive-main-center .list-container .list-wrap.list-body').dataset.resourcePath = '';
}
export function changeTreeItemStyle(treeItem, targetTree='main') {
if (targetTree == 'main') {
// if (vars.lastMainTreeItem) vars.lastMainTreeItem.style.background = '';
// vars.lastMainTreeItem = treeItem;
// vars.lastMainTreeItem.style.background = '#bccbc8';
document.querySelectorAll('.archive-main-left .tree-container .tree .tree-item-wrap.depth3').forEach(e => {
e.classList.remove('selected');
});
document.querySelector('.archive-main-left .tree-title').classList.remove('selected');
if (treeItem) vars.lastMainTreeItem = treeItem;
if (vars.lastMainTreeItem) {
vars.lastMainTreeItem.classList.add('selected');
vars.lastSelectTarget = vars.lastMainTreeItem.querySelector('.tree-item');
}
// } else {
// if (vars.lastModalTreeItem) vars.lastModalTreeItem.style.background = '';
// vars.lastModalTreeItem = treeItem;
// vars.lastModalTreeItem.style.background = '#bccbc8';
}
}
export function changeListItemStyle(listItem, from) {
let isRecycleBinModal = document.querySelector('.recycle-bin-modal').style.display == 'flex';
if (isRecycleBinModal) {
//// ์๋ธ list item ์๋ ๊ฒฝ์ฐ ๋ฐฐ๊ฒฝ ์์ ๋ณ๊ฒฝ
if (vars.lastListGroupTarget_bin) {
vars.lastListGroupTarget_bin.classList.remove('group-style');
}
if (listItem.matches('.main-list-item')) {
vars.lastListGroupTarget_bin = listItem;
}
if (listItem.matches('.sub-list-item')) {
vars.lastListGroupTarget_bin = document.querySelector(`.list-item.main-list-item[data-main-file-name="${listItem.dataset.mainFileName}"]`);
// if (listItem.matches('.grid-item')) {
// vars.lastListGroupTarget_bin = document.querySelector(`.grid-item.main-list-item[data-main-file-name="${listItem.dataset.mainFileName}"]`);
// } else {
// vars.lastListGroupTarget_bin = listItem.closest('.main-list-item');
// }
}
if (vars.lastListGroupTarget_bin) {
vars.lastListGroupTarget_bin.classList.add('group-style');
}
//// ๋จ์ผ list item ๋ฐฐ๊ฒฝ ์์ ๋ณ๊ฒฝ
if (vars.lastListItem_bin) {
vars.lastListItem_bin.classList.remove('selected');
}
vars.lastListItem_bin = listItem;
vars.lastListItem_bin.classList.add('selected');
vars.lastSelectTarget_bin = vars.lastListItem_bin;
let isExistsDataId = false;
vars.multiSelectListItemArr_bin.forEach((item) => {
if (item.dataset.dataId === listItem.dataset.dataId) isExistsDataId = true;
})
if (!isExistsDataId) vars.multiSelectListItemArr_bin.push(listItem);
} else {
//// ์๋ธ list item ์๋ ๊ฒฝ์ฐ ๋ฐฐ๊ฒฝ ์์ ๋ณ๊ฒฝ
if (vars.lastListGroupTarget) {
vars.lastListGroupTarget.classList.remove('group-style');
}
if (listItem.matches('.main-list-item')) {
vars.lastListGroupTarget = listItem;
}
if (listItem.matches('.sub-list-item')) {
vars.lastListGroupTarget = document.querySelector(`.list-item.main-list-item[data-main-file-name="${listItem.dataset.mainFileName}"]`);
// if (listItem.matches('.grid-item')) {
// vars.lastListGroupTarget = document.querySelector(`.grid-item.main-list-item[data-main-file-name="${listItem.dataset.mainFileName}"]`);
// } else {
// vars.lastListGroupTarget = listItem.closest('.main-list-item');
// }
}
if (vars.lastListGroupTarget) {
vars.lastListGroupTarget.classList.add('group-style');
}
//// ๋จ์ผ list item ๋ฐฐ๊ฒฝ ์์ ๋ณ๊ฒฝ
if (vars.lastListItem) {
vars.lastListItem.classList.remove('selected');
}
vars.lastListItem = listItem;
vars.lastListItem.classList.add('selected');
vars.lastSelectTarget = vars.lastListItem;
let isExistsDataId = false;
vars.multiSelectListItemArr.forEach((item) => {
if (item.dataset.dataId === listItem.dataset.dataId) isExistsDataId = true;
})
if (!isExistsDataId) vars.multiSelectListItemArr.push(listItem);
}
let me = JSON.parse(vars.userInfoString);
me.selected = listItem.dataset.resourcePath;
vars.socket.emit('fileSelect',{me : me});
}
// ๊ตฌ์ฑ ๋ชจ๋ฌ ๋ฐ์ดํฐ ๋ ๋๋ง
export async function renderCompositionData() {
const modal = document.querySelector('.composition-modal');
let userString = vars.userInfoString;
let user = JSON.parse(userString);
// ์ต์๋จ ํด๋ (ํญ)
const tabList = Object.keys(vars.allTreeObject.folder).sort(naturalSort);
// ๋ฆฌ์คํธ wrap
const listWrap = modal.querySelector('.modal-wrap > ul');
listWrap.innerHTML = ''; // ์ด๊ธฐํ
// ๊ฐ ์ต์๋จ ํด๋(ํญ)์ ๋ํ ์ฒ๋ฆฌ
for (const tab of tabList) {
let getTreeObjectParams = {
userInfoString: JSON.stringify(user),
storageType: vars.storageType,
resourcePath: tab
};
let getTreeObjectRes = await axios.get(`${vars.path_name}/getTreeObject`, { params: {params: getTreeObjectParams} });
if(getTreeObjectRes.data.message == 'getTreeObject_success') {
const treeData = getTreeObjectRes.data.currentTreeObject;
// ์ต์๋จ ํด๋ li ์์ฑ
const tabLi = document.createElement('li');
// ์ต์๋จ ํด๋ ์ ๋ชฉ (h3)
const tabTitle = document.createElement('h3');
tabTitle.textContent = tab;
tabLi.appendChild(tabTitle);
// ์๋จ ํด๋ (์นดํ
๊ณ ๋ฆฌ) ul ์์ฑ
const categoryUl = document.createElement('ul');
// ์๋จ ํด๋ (์นดํ
๊ณ ๋ฆฌ) ๋ฐ์ดํฐ๊ฐ ์๋ค๋ฉด ์ฒ๋ฆฌ
if (treeData && treeData.folder && Object.keys(treeData.folder).length > 0) {
const categories = Object.keys(treeData.folder).sort(naturalSort);
categories.forEach(category => {
// ์๋จ ํด๋ li ์์ฑ
const categoryLi = document.createElement('li');
// ์๋จ ํด๋ ์ ๋ชฉ (h5)
const categoryTitle = document.createElement('h5');
categoryTitle.textContent = category;
categoryLi.appendChild(categoryTitle);
// ํด๋ ul ์์ฑ
const folderUl = document.createElement('ul');
const folders = treeData.folder[category] || [];
const folderObj = folders.child?.folder || {};
const folderKeys = Object.keys(folderObj).sort(naturalSort);
// ํด๋๊ฐ ์์ ๋ ๋น ํญ๋ชฉ ํ์
if (folderKeys.length === 0) {
// const emptyFolderLi = document.createElement('li');
// const emptyIcon = document.createElement('i');
// emptyFolderLi.appendChild(emptyIcon);
// const emptyName = document.createElement('h6');
// emptyName.textContent = '-';
// emptyFolderLi.appendChild(emptyName);
// const emptyCount = document.createElement('h6');
// emptyCount.textContent = '-';
// emptyFolderLi.appendChild(emptyCount);
// folderUl.appendChild(emptyFolderLi);
} else {
// ํด๋๊ฐ ์์ ๋
folderKeys.forEach(folderName => {
const folderData = folderObj[folderName];
// ํด๋ ๋ด ํ์ผ ๊ฐ์ ๊ณ์ฐ
let fileCount = 0;
// child.file์ ํ์ผ ๊ฐ์
fileCount += Object.keys(folderData.child?.file || {}).length;
// child.folder ์์ ๋ชจ๋ ํ์ผ๋ค๋ ์นด์ดํธ (์ฒจ๋ถ, ๋ฒ์ ํ์ผ)
if (folderData.child?.folder) {
Object.keys(folderData.child.folder).forEach(subFolderName => {
const subFolder = folderData.child.folder[subFolderName];
if (subFolder.child?.file) {
fileCount += Object.keys(subFolder.child.file).length;
}
});
}
// ํด๋ li ์์ฑ
const folderLi = document.createElement('li');
// ํด๋ ์์ด์ฝ
const folderIcon = document.createElement('i');
folderLi.appendChild(folderIcon);
// ํด๋๋ช
const folderNameEl = document.createElement('h6');
folderNameEl.textContent = folderName;
folderLi.appendChild(folderNameEl);
// ํ์ผ ๊ฐ์
const folderCountEl = document.createElement('h6');
folderCountEl.textContent = fileCount > 0 ? String(fileCount) : '-';
folderLi.appendChild(folderCountEl);
folderUl.appendChild(folderLi);
});
}
categoryLi.appendChild(folderUl);
categoryUl.appendChild(categoryLi);
});
} else {
// ์นดํ
๊ณ ๋ฆฌ๊ฐ ์์ ๋ ๋น ํญ๋ชฉ ํ์
const emptyCategoryLi = document.createElement('li');
const emptyCategoryTitle = document.createElement('h5');
emptyCategoryTitle.textContent = '-';
emptyCategoryLi.appendChild(emptyCategoryTitle);
const emptyFolderUl = document.createElement('ul');
const emptyFolderLi = document.createElement('li');
const emptyIcon = document.createElement('i');
emptyFolderLi.appendChild(emptyIcon);
const emptyName = document.createElement('h6');
emptyName.textContent = '-';
emptyFolderLi.appendChild(emptyName);
const emptyCount = document.createElement('h6');
emptyCount.textContent = '-';
emptyFolderLi.appendChild(emptyCount);
emptyFolderUl.appendChild(emptyFolderLi);
emptyCategoryLi.appendChild(emptyFolderUl);
categoryUl.appendChild(emptyCategoryLi);
}
tabLi.appendChild(categoryUl);
listWrap.appendChild(tabLi);
}
}
// ๋ ๋๋ง ์๋ฃ ํ ๋์ด ๋๊ธฐํ
setTimeout(() => {
const allLis = listWrap.querySelectorAll(':scope > li');
if (allLis.length === 0) return;
// ๋ชจ๋ li์ ์ต๋ ๋์ด ์ฐพ๊ธฐ
let maxHeight = 0;
allLis.forEach(li => {
const height = li.scrollHeight;
if (height > maxHeight) maxHeight = height;
});
// ๋ชจ๋ li ์ ์ต๋ ๋์ด ์ ์ฉ
allLis.forEach(li => {
li.style.minHeight = `${maxHeight}px`;
})
}, 0);
}
// ์ ๋ ฌ ํจ์
function naturalSort(a, b) {
const regex = /(\d+)|(\D+)/g;
const aParts = a.match(regex);
const bParts = b.match(regex);
for (let i = 0; i < Math.min(aParts.length, bParts.length); i++) {
const aPart = aParts[i];
const bPart = bParts[i];
// ๋ ๋ค ์ซ์์ธ ๊ฒฝ์ฐ
if (!isNaN(aPart) && !isNaN(bPart)) {
const diff = parseInt(aPart) - parseInt(bPart);
if (diff !== 0) return diff;
} else {
// ๋ฌธ์์ด ๋น๊ต
if (aPart !== bPart) {
return aPart.localeCompare(bPart);
}
}
}
return aParts.length - bParts.length;
}