import { vars } from './variable.js';
// 파일 사이즈 변환
export function formatBytes(bytes) {
const abs = Math.abs(bytes);
let size, unit;
if (abs < 1024) {
size = addCommasToNumber(bytes);
unit = ' Bytes';
} else if (abs < 1048576) {
size = addCommasToNumber((bytes / 1024).toFixed(2));
unit = ' KB';
} else if (abs < 1073741824) {
size = addCommasToNumber((bytes / 1048576).toFixed(2));
unit = ' MB';
} else if (abs < 1099511627776) {
size = addCommasToNumber((bytes / 1073741824).toFixed(2));
unit = ' GB';
} else {
size = addCommasToNumber((bytes / 1099511627776).toFixed(2));
unit = ' TB';
}
if (size != 0) {
let decimalPointNum = size.split('.')[1];
if (decimalPointNum) {
// 소수점 아래 숫자가 00인 경우
if (decimalPointNum == '00') size = size.split('.')[0];
// 소수점 아래 두번째 숫자가 0인 경우
else if (decimalPointNum[1] == '0') size = `${size.split('.')[0]}.${decimalPointNum[0]}`;
}
}
return size + unit;
}
// 1000 단위 콤마 추가
// export function addCommasToNumber(num) {
// return num.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",");
// }
export function addCommasToNumber(num) {
const isNegative = Number(num) < 0;
const parts = Math.abs(Number(num)).toString().split('.');
parts[0] = parts[0].replace(/\B(?=(\d{3})+(?!\d))/g, ',');
const formatted = parts.join('.');
return isNegative ? `-${formatted}` : formatted;
}
export function getDepth(path) {
path = path.startsWith('/') ? path.slice(1) : path;
let pathSplit = path.split('/');
let result = pathSplit.length;
return result;
}
export function updatePartialPath(sourcePath, targetPath) {
let sourcePathSplit = sourcePath.split('/');
let targetPathSplit = targetPath.split('/');
for (let i = 0; i < sourcePathSplit.length; i++) {
targetPathSplit[i] = sourcePathSplit[i];
}
return targetPathSplit.join('/');
}
// 파일명, 확장자 분리
export function splitBaseAndExt(target, isLowerExt) {
let targetSplit = target.split('.');
let ext = targetSplit.pop();
if (isLowerExt) ext = ext.toLowerCase();
let base = targetSplit.join('.');
return { ext: ext, base: base }
}
// 선택한 대상이 포함된 상위 폴더 경로 추출
export function splitTopPathAndTargetName(resourcePath) {
let resourcePathSplit = resourcePath.split('/');
let targetName = resourcePathSplit.pop();
let topPath = resourcePathSplit.join('/');
if (!topPath || topPath == '' || topPath == null) topPath = '/';
return { targetName: targetName, topPath: topPath };
}
export function extractPathByLength(target, count) {
if (!Array.isArray(target)) {
target = target.split('/');
}
const parts = target.filter(Boolean).slice(0, count);
return '/' + parts.join('/');
}
// 특수문자를 체크하는 정규표현식
export function hasSpecialChar(target) {
// const pattern = /[\/\\;:?`'"<>|#%&*]/;
const pattern = /[\/\\:*?'"`<>|#]/;
return pattern.test(target);
}
// 동일한 폴더명/파일명 존재 여부 확인
export function existEqualName(type, comparisonPath, targetName) {
let result;
if (comparisonPath != '' && comparisonPath != undefined) {
result = getTypeDataFromFolderData(type, comparisonPath)[targetName];
} else {
// result = vars.currentTreeObject[type][targetName];
result = vars.allTreeObject[type][targetName];
}
// 헤더 버튼 이름 변경 시 페이지 버튼과 이름 같은 경우 변경 불가
let pageBtnNameArr = ['과업개요', '공문'];
if (comparisonPath == '/' && result == undefined) result = pageBtnNameArr.includes(targetName);
return result;
// folderData에서 타입(폴더/파일)과 경로를 사용해서 해당 경로의 타입별 데이터 가져오기
function getTypeDataFromFolderData(type, path) {
let data;
if (type == 'folder') data = vars.allTreeObject[type];
if (type == 'file') data = vars.currentTreeObject[type];
let pathSplit = path.split('/');
pathSplit.shift();
// if (pathSplit[0] == '') return data;
for (let i = 0; i < pathSplit.length; i++) {
if (data[pathSplit[i]]) {
if (type == 'folder') data = data[pathSplit[i]]['child'][type];
if (type == 'file') data = data;
} else {
data = data;
}
}
return data;
}
}
export function getNextFileName(nameArr, newName) {
const dotIdx = newName.lastIndexOf('.');
const base = dotIdx !== -1 ? newName.slice(0, dotIdx) : newName;
const ext = dotIdx !== -1 ? newName.slice(dotIdx) : '';
const set = new Set(nameArr);
let maxNum = 0;
const regex = new RegExp(`^${escapeRegExp(base)}(?: \\((\\d+)\\))?${escapeRegExp(ext)}$`);
for (const name of set) {
const match = name.match(regex);
if (match) {
const num = match[1] ? parseInt(match[1], 10) : 0;
if (num > maxNum) maxNum = num;
}
}
if (maxNum === 0 && !set.has(newName)) return newName;
return `${base} (${maxNum + 1})${ext}`;
function escapeRegExp(str) {
return str.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
}
}
export function getDataFromTreeObject(path, type, data) {
let parentData;
if (!data) data = vars.allTreeObject;
let pathSplit = path.split('/');
pathSplit.shift();
for (let i = 0; i < pathSplit.length; i++) {
if (i != pathSplit.length - 1) {
if (data['folder'][pathSplit[i]]) {
data = data['folder'][pathSplit[i]]['child'];
}
} else {
if (type == 'folder') {
parentData = data;
data = data['folder'][pathSplit[i]];
}
if (type == 'file') {
if (data['file'][pathSplit[i]]) {
parentData = data;
data = data['file'][pathSplit[i]];
}
}
}
}
return { parentData: parentData, data: data };
}
export function getCurrentTreeObject(path) {
let data = vars.allTreeObject;
let pathSplit = path.split('/');
pathSplit.shift();
for (let i = 0; i < pathSplit.length; i++) {
if (i != pathSplit.length - 1) {
if (data['folder'][pathSplit[i]]) {
data = data['folder'][pathSplit[i]]['child'];
}
} else {
if (data['folder'][pathSplit[i]]) data = data['folder'][pathSplit[i]]['child'];
}
}
return data;
}
export function targetFocus(target, behavior = 'smooth') {
target.scrollIntoView({
behavior: behavior, // 부드럽게
block: 'center', // 화면 중앙에 위치하도록 (start, end, nearest 도 가능)
inline: 'center'
});
target.focus();
}
export function pxToRem(px) {
let remPx = parseFloat(getComputedStyle(document.documentElement).fontSize);
return px / remPx;
}
export function buildResourcePathFromSegments(rows) {
if (!Array.isArray(rows)) rows = [rows];
let result = [];
rows.map(row => {
let resourcePath = '/';
let maxDepth = 8;
let arr = [];
for (let i = 0; i < maxDepth; i++) {
let num = i+1;
let segment = row[`path${num}`];
if (segment) arr.push(segment);
}
if (arr.length != 0) resourcePath += arr.join('/');
result.push(resourcePath);
})
return result;
}
export function headerBtnForceClick(headerBtn) {
headerBtn.click();
}
export function treeBtnForceClick(treeBtn) {
treeBtn.click();
}
export function closeInitProgress() {
document.querySelector('.init-progress').style.display = 'none';
}
export async function getMyDownloadList(){
let res = await axios.get(`${vars.path_name}/getMyDownloadList`, {params : {user_id : JSON.parse(vars.userInfoString).user_id}});
// console.log(res.data);
if(res.data.length > 0){
if(document.querySelector('.download-btn .download-reddot')){
document.querySelector('.download-btn .download-reddot').style.display = 'block';
}
}else{
if(document.querySelector('.download-btn .download-reddot')){
document.querySelector('.download-btn .download-reddot').style.display = 'none';
}
}
let ul = document.querySelector('.download-modal__body_list');
ul.innerHTML = '';
for(let i = 0; i < res.data.length; i++){
let li = document.createElement('li');
li.classList.add('download-modal__body_list_item');
let expireDate = new Date(res.data[i].expire_date);
let now = new Date();
let yesterday = new Date(now.getTime() - 24 * 60 * 60 * 1000);
let state = (expireDate < yesterday)? ``: (!res.data[i].made)?`준비중`:`
`
let expire =(state == '준비중')?state :(expireDate < yesterday)? '만료됨': formatDateTime(expireDate);
li.innerHTML = `
${res.data[i].project_nm}${res.data[i].path}