
File name
Commit message
Commit date
05-22
File name
Commit message
Commit date
File name
Commit message
Commit date
File name
Commit message
Commit date
import { save } from "../../resources/api/cntnStats";
import { getGlobalStore } from "../../views/pages/AppStore";
/**
* 공통 처리 플러그인
*/
function prefixZero(number, length) {
var zero = '';
number = number.toString();
if (number.length < length) {
for (let i = 0; i < length - number.length; i++) {
zero += '0';
}
}
return zero + number;
}
/**
* 다운로드 이력 등록
*/
async function cntnSave(data){
const store = getGlobalStore(); // 전역 스토어 가져오기
const isLogin = store.state.loginAt; // 로그인 유무 정보 확인
axios({
url: "/stats/saveProc.json",
method: "post",
headers: {
'Content-Type': 'application/json; charset=UTF-8',
Authorization: isLogin
},
data: data,
}).then(async (response) => {
return
}).catch(async (error) => {
return
})
}
import Vue from "vue";
import axios from "axios";
import {cmmnFindByCdSystem} from "../../resources/api/codeManage";
import COMMON_UTIL from '../../resources/js/commonUtil';
import useStore from "vuex";
export default {
install(Vue) {
// 공통메세지
let messageList = [];
let alertRef = {};
Vue.config.globalProperties.$setAlertRef = function (ref) {
alertRef = ref;
}
// 공통코드 등록
Vue.config.globalProperties.$getCmmnMessage = async function(code) {
try {
const params = { cdId: code};
const res = await cmmnFindByCdSystem(params);
if (res.status == 200) {
return res.data.data.code.childCdList;
// messageList = res.data.data.code.childCdList;
}
} catch (error) {
alert(error.response.data.message);
}
},
// 모달 호출
Vue.config.globalProperties.$showAlert = async function (message) {
alertRef.setMessage(message);
const resultData = await alertRef.showModal();
return resultData;
}
// confirm 창 호출
Vue.config.globalProperties.$showConfirm = async function (message) {
// alertRef.setTitle(title);
// this.$store.commit('setModalFlag', {'open' : true, 'message' : message, 'confirm' : 'true' });
alertRef.setMessage(message);
const resultData = await alertRef.showConfirm();
return resultData;
}
//시간 구하기
Vue.config.globalProperties.$getFullTime = function (hour, minute, seconds) {
var date = new Date();
var h = date.getHours();
var m = date.getMinutes();
var s = date.getSeconds();
if (this.$isEmpty(hour) == false) {
h += hour;
} if (this.$isEmpty(minute) == false) {
m += minute;
} if (this.$isEmpty(seconds) == false) {
s += seconds;
}
return prefixZero(h, 2) + ":" + prefixZero(m, 2) + ":" + prefixZero(s, 2);
}
// 공통코드 호출
Vue.config.globalProperties.$getCommonCode = async function (GroupCode) {
// const promise = new Promise((resolve, reject) => {
// axios({
// url: '/cmmn/code/findByCdSystem.json',
// method: 'post',
// headers: {
// 'Content-Type': 'application/json; charset=UTF-8'
// },
// data: JSON.stringify({ 'cdId': GroupCode })
// }).then(function (response) {
// resolve(response.data.data.code.childCdList)
// }).catch(function (error) {
// resolve('cancle')
// });
// });
// return promise.then(
// (data) => {
// return data;
// }
// ).catch(function (err) {
// console.log(err)
// return [];
// });
}
// 공통코드 값 매핑
Vue.config.globalProperties.$getCommonCodeValue = function (cmmnCode, code) {
for(let i = 0 ; i < cmmnCode.length; i++){
if(cmmnCode[i].cdId == code){
return cmmnCode[i].cdNm;
}
}
return code;
}
// 빈값체크
Vue.config.globalProperties.$isEmpty = function (data) {
if (data === undefined || data === null || data === "" || data.length === 0 || (data.constructor == Object && Object.keys(data).length === 0)) {
if ((typeof data) === "number") {
return false
} else {
return true;
}
} else {
return false;
}
}
/**
* 일시에서 연월일 추출
*/
Vue.config.globalProperties.$yyyymmdd = function (data) {
if (data === null || data === "") {
return "-";
} else {
let date = data.substr(0, 10);
return date;
}
}
/**
* 일시에서 연도 추출
*/
Vue.config.globalProperties.$yyyy = function (data) {
if (data === null || data === "") {
return "-";
} else {
let date = data.substr(0, 4);
return date;
}
}
/**
* 전화번호 출력 시 '-'을 추가하여 출력
*/
Vue.config.globalProperties.$HyphenMinus = function (phoneNumber) {
if (!phoneNumber) return phoneNumber;
phoneNumber = phoneNumber.replace(/[^0-9]/g, "");
let tmp = "";
if (phoneNumber.length < 4) {
return phoneNumber;
} else if (phoneNumber.length < 7) {
tmp += phoneNumber.substr(0, 3);
tmp += "-";
tmp += phoneNumber.substr(3);
return tmp;
} else if (phoneNumber.length == 8) {
tmp += phoneNumber.substr(0, 4);
tmp += "-";
tmp += phoneNumber.substr(4);
return tmp;
} else if (phoneNumber.length < 10) {
if (phoneNumber.substr(0, 2) == "02") {
//02-123-5678
tmp += phoneNumber.substr(0, 2);
tmp += "-";
tmp += phoneNumber.substr(2, 3);
tmp += "-";
tmp += phoneNumber.substr(5);
return tmp;
}
} else if (phoneNumber.length < 11) {
if (phoneNumber.substr(0, 2) == "02") {
//02-1234-5678
tmp += phoneNumber.substr(0, 2);
tmp += "-";
tmp += phoneNumber.substr(2, 4);
tmp += "-";
tmp += phoneNumber.substr(6);
return tmp;
} else {
//010-123-4567
tmp += phoneNumber.substr(0, 3);
tmp += "-";
tmp += phoneNumber.substr(3, 3);
tmp += "-";
tmp += phoneNumber.substr(6);
return tmp;
}
} else {
//010-1234-5678
tmp += phoneNumber.substr(0, 3);
tmp += "-";
tmp += phoneNumber.substr(3, 4);
tmp += "-";
tmp += phoneNumber.substr(7);
return tmp;
}
}
/**
* 사업자등록번호 xxx-xx-xxxx 양식으로 출력
*/
Vue.config.globalProperties.$hyphenBrno = function (brno) {
if (!brno) return brno;
brno = brno.replace(/[^0-9]/g, "");
if (brno.length !== 10) return brno;
let formattedBrno = "";
formattedBrno += brno.substr(0, 3);
formattedBrno += "-";
formattedBrno += brno.substr(3, 2);
formattedBrno += "-";
formattedBrno += brno.substr(5, 5);
return formattedBrno;
}
/**
* 오늘 년-월-일 구하기
*/
Vue.config.globalProperties.$today = function () {
let date = new Date();
let today = new Date(date.getTime() - (date.getTimezoneOffset() * 60000)).toISOString().substring(0, 10);
return today;
}
/**
* 일주일전 년-월-일 구하기
*/
Vue.config.globalProperties.$oneWeekAgo = function () {
let date = new Date();
// 현재 날짜에서 7일을 빼줍니다.
let oneWeekAgoDate = new Date(date.getTime() - (6 * 24 * 60 * 60 * 1000) - (date.getTimezoneOffset() * 60000)).toISOString().substring(0, 10);
return oneWeekAgoDate;
}
/**
* N달전 년-월-일 구하기
*/
Vue.config.globalProperties.$nMonthAgo = function (today, nMonth) {
let date = new Date(today);
let oneMonthAgo = new Date(date.setMonth(date.getMonth() - nMonth) - (date.getTimezoneOffset() * 60000)).toISOString().substring(0, 10);
return oneMonthAgo;
},
/**
* N년전 년-월-일 구하기
*/
Vue.config.globalProperties.$nYearAgo = function (today, nYear) {
let date = new Date(today);
let nYearAgo = new Date(date.setFullYear(date.getFullYear() - nYear) - (date.getTimezoneOffset() * 60000)).toISOString().substring(0, 4);
return nYearAgo;
},
/* 유효성 검사 */
// 아이디 정규식(5~20자의 영문 소문자, 숫자와 특수기호(_),(-)만 사용)
Vue.config.globalProperties.$idCheck = function (data) {
let validateId = /^(?=.*[a-z])[a-z0-9_-]{5,20}$/;
if (validateId.test(data) === true) return true;
return false;
}
// 비밀번호 정규식(8~16자의 영문 대문자, 소문자, 숫자, 특수문자를 사용)
Vue.config.globalProperties.$pwCheck = function (data) {
let validatePw = /^(?=.*[A-Za-z])(?=.*\d)(?=.*[!@#$%^&*])[A-Za-z\d!@#$%^&*]{8,16}$/
if (validatePw.test(data) === true) return true;
return false;
}
// 이메일 형식 검사
Vue.config.globalProperties.$email = function (email) {
const emailPattern = /^[A-Za-z0-9_\\.\\-]+@[A-Za-z0-9\\-]+\.[A-Za-z0-9\\-\\.]+$/;
try {
return emailPattern.test(email);
} catch (e) {
return false;
}
}
// 홈페이지 형식 검사
Vue.config.globalProperties.$checkHomePage = function (data) {
let pattern = /^(https?:\/\/)?(www\.)?([a-zA-Z0-9-]+\.)+[a-zA-Z]{2,}(\/[^\s]*)?$/;
if (pattern.test(data) === true) return true;
return false;
}
//사용자명 정규식
Vue.config.globalProperties.$checkName = function (data) {
let validateEmail = /^[가-힣a-zA-Z]{1,20}$/;
if (validateEmail.test(data) === true) return true;
return false;
}
//닉네임 정규식
Vue.config.globalProperties.$checkNknm = function (data) {
let validateEmail = /^[a-zA-Z가-힣0-9-_]{1,20}$/;
if (validateEmail.test(data) === true) return true;
return false;
}
// IPv4 정규식
Vue.config.globalProperties.$ipv4 = function (ip) {
let validateIPv4 = /^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$/;
if (validateIPv4.test(ip) === true) return true;
return false;
}
// 3글자 마다 콤마 찍기 (돈)
Vue.config.globalProperties.$comma = function (text) {
try {
return text.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",");
} catch (e) {
if (text === undefined || text === null || text === "" || text.length === 0) {
return "0";
} else {
return text;
}
}
}
// 사업자번호 정규식(10자리)
Vue.config.globalProperties.$businessNumber = function (data) {
let validateBusinessNumber = /^\d{10}$/;
if (validateBusinessNumber.test(data) === true) return true;
return false;
}
// 이메일 마스킹 처리
Vue.config.globalProperties.$email_format_WithMasking = function (mail) {
if (mail != null && mail != '' && mail.length > 3) {
return mail.replace(/(?<=.{3})./gi, '*');
}else{
return mail;
}
}
// 전화번호 마스킹 처리
Vue.config.globalProperties.$number_format_WithMasking = function (number) {
if (number != null && number != '') {
let maskNumber = '';
let phone = COMMON_UTIL.getMask(number);
let phoneParts = phone.split('-');
if (phoneParts.length === 3) {
let middlePartMasked = phoneParts[1].replace(/[0-9]/g, '*');
maskNumber = phoneParts[0] + '-' + middlePartMasked + '-' + phoneParts[2];
} else {
return phone;
}
return maskNumber;
} else {
return "";
}
}
// 첨부파일 다운로드 로직
Vue.config.globalProperties.$getImageDown = async function (fileId) {
try {
const response = await axios({
url: '/file/fileDownload.json', // URL 경로 확인
method: 'post',
headers: {
'Content-Type': 'application/json; charset=UTF-8',
Authorization: this.$store.state.authorization,
},
data: fileId,
responseType: 'blob',
});
const url = window.URL.createObjectURL(new Blob([response.data]));
return url;
} catch (error) {
// alert('파일 다운로드 중 오류가 발생했습니다.');
}
}
// 첨부파일 다운로드 로직
Vue.config.globalProperties.$imageDown = async function (file , srcId) {
try {
const response = await axios({
url: '/file/fileDownload.json', // URL 경로 확인
method: 'post',
headers: {
'Content-Type': 'application/json; charset=UTF-8',
Authorization: this.$store.state.authorization,
},
data: file.fileId,
responseType: 'blob',
});
const url = window.URL.createObjectURL(new Blob([response.data]));
document.getElementById(srcId).src= url;
} catch (error) {
// alert('파일 다운로드 중 오류가 발생했습니다.');
}
}
// 첨부파일 다운로드 로직(파일아이디, 파일명 )
Vue.config.globalProperties.$imageDownByid = async function (fileId, srcId) {
try {
const response = await axios({
url: '/file/fileDownload.json', // URL 경로 확인
method: 'post',
headers: {
'Content-Type': 'application/json; charset=UTF-8',
Authorization: this.$store.state.authorization,
},
data: fileId,
responseType: 'blob',
});
const url = window.URL.createObjectURL(new Blob([response.data]));
document.getElementById(srcId).src= url;
} catch (error) {
// alert('파일 다운로드 중 오류가 발생했습니다.');
}
}
//첨부파일 다운로드 로직
Vue.config.globalProperties.$downloadFile = async function (file,auth) {
if(auth.fileDwnldAuthrtYn != 'Y'){
alert('파일다운로드 권한이 없습니다.');
return false;
}
try {
this.$store.commit('setLoading', true);
if(!this.$route.path.startsWith('/kdm')) {
let menuId = this.$store.state.currentMenu
let bbsMngId = this.$route.meta.typeId;
let bbsId= null;
const roles = this.$store.state.roles.map(auth => auth.authority);
if(bbsMngId === 'CONTS_0000000063') {
bbsMngId = 'BBS_MNG_0000000004';
}
if(this.$route.query.pageId) {
bbsId = this.$route.query.pageId;
}
let data = { 'typeId' : 'FILE', 'menuId' : menuId, 'fileMngId': file.fileMngId, 'fileId': file.fileId
,'bbsMngId' : bbsMngId, 'bbsId' : bbsId, 'mbrAuthList' : roles }
// await save(data)
await cntnSave(data)
}
const response = await axios({
url: '/file/fileDownload.json', // URL 경로 확인
method: 'post',
headers: {
'Content-Type': 'application/json; charset=UTF-8',
Authorization: this.$store.state.authorization,
},
data: file.fileId,
responseType: 'blob',
});
const url = window.URL.createObjectURL(new Blob([response.data]));
const link = document.createElement('a');
link.href = url;
link.setAttribute('download', file.fileNm+'.'+file.extnNm);
document.body.appendChild(link);
link.click();
document.body.removeChild(link);
window.URL.revokeObjectURL(url);
// if(!this.$route.path.startsWith('/kdm')) {
// let menuId = this.$store.state.currentMenu
// let bbsMngId = this.$route.meta.typeId;
// let bbsId= null;
// const roles = this.$store.state.roles.map(auth => auth.authority);
// if(bbsMngId === 'CONTS_0000000063') {
// bbsMngId = 'BBS_MNG_0000000004';
// }
// if(this.$route.query.pageId) {
// bbsId = this.$route.query.pageId;
// }
// let data = { 'typeId' : 'FILE', 'menuId' : menuId, 'fileMngId': file.fileMngId, 'fileId': file.fileId
// ,'bbsMngId' : bbsMngId, 'bbsId' : bbsId, 'mbrAuthList' : roles }
// try {
// // await save(data)
// await save1(data)
// } catch(error){
// alert(error)
// }
// }
} catch (error) {
alert('파일 다운로드 중 오류가 발생했습니다.')
}finally{
this.$store.commit('setLoading', false);
}
},
//첨부파일 다운로드 로직
Vue.config.globalProperties.$downloadFileById = async function (fileid, fileMngID, fileNm,bbsId,auth) {
if(auth.fileDwnldAuthrtYn != 'Y'){
alert('파일다운로드 권한이 없습니다.');
return false;
}
try {
this.$store.commit('setLoading', true);
const response = await axios({
url: '/file/fileDownload.json', // URL 경로 확인
method: 'post',
headers: {
'Content-Type': 'application/json; charset=UTF-8',
Authorization: this.$store.state.authorization,
},
data: fileid,
responseType: 'blob',
});
const url = window.URL.createObjectURL(new Blob([response.data]));
const link = document.createElement('a');
link.href = url;
link.setAttribute('download', fileNm);
document.body.appendChild(link);
link.click();
document.body.removeChild(link);
window.URL.revokeObjectURL(url);
if(!this.$route.path.startsWith('/kdm')) {
let menuId = this.$store.state.currentMenu
// 공통관리파일
let bbsMngId = 'BBS_MNG_0000000007'
const roles = this.$store.state.roles.map(auth => auth.authority);
let data = { 'typeId' : 'FILE', 'menuId' : menuId, 'fileMngId': fileMngID , 'fileId': fileid
,'bbsMngId' : bbsMngId, 'bbsId' : bbsId, 'mbrAuthList' : roles }
await save(data)
}
} catch (error) {
// alert('파일 다운로드 중 오류가 발생했습니다.');
alert(this.$getCmmnMessage("err024"))
}finally{
this.$store.commit('setLoading', false);
}
}
// PDF 뷰어오픈
Vue.config.globalProperties.$openPdfViewr= async function (file, object, modal) {
try {
const response = await axios({
url: '/file/fileDownload.json', // URL 경로 확인
method: 'post',
headers: {
'Content-Type': 'application/json; charset=UTF-8',
Authorization: this.$store.state.authorization,
},
data: file.fileId,
responseType: 'blob',
});
const url = window.URL.createObjectURL(new Blob([response.data]));
object = url;
modal = true;
} catch (error) {
// alert('파일 다운로드 중 오류가 발생했습니다.');
}
}
// PDF 뷰어오픈
Vue.config.globalProperties.$openPdfViewrWindwow = async function (fileid, pageAuth) {
if(pageAuth.fileDwnldAuthrtYn != 'Y'){
alert('파일확인 권한이 없습니다.');
return false;
}
try {
this.$store.commit('setPdfId', fileid);
window.open(
"/cmmn/pdfView.page",
'_blank'
);
} catch (error) {
// alert('파일 다운로드 중 오류가 발생했습니다.');
}
}
//첨부파일 다운로드 로직(권한체크 제외)
Vue.config.globalProperties.$downloadFileByIdNoAuthCheck = async function (fileid, fileMngID, fileNm,bbsId) {
try {
this.$store.commit('setLoading', true);
const response = await axios({
url: '/file/fileDownload.json', // URL 경로 확인
method: 'post',
headers: {
'Content-Type': 'application/json; charset=UTF-8',
Authorization: this.$store.state.authorization,
},
data: fileid,
responseType: 'blob',
});
const url = window.URL.createObjectURL(new Blob([response.data]));
const link = document.createElement('a');
link.href = url;
link.setAttribute('download', fileNm);
document.body.appendChild(link);
link.click();
document.body.removeChild(link);
window.URL.revokeObjectURL(url);
if(!this.$route.path.startsWith('/kdm')) {
let menuId = this.$store.state.currentMenu
// 공통관리파일
let bbsMngId = 'BBS_MNG_0000000007'
const roles = this.$store.state.roles.map(auth => auth.authority);
let data = { 'typeId' : 'FILE', 'menuId' : menuId, 'fileMngId': fileMngID , 'fileId': fileid
,'bbsMngId' : bbsMngId, 'bbsId' : bbsId, 'mbrAuthList' : roles }
await save(data)
}
} catch (error) {
// alert('파일 다운로드 중 오류가 발생했습니다.');
alert(this.$getCmmnMessage("err024"))
}finally{
this.$store.commit('setLoading', false);
}
}
//첨부파일 다운로드(권한검사 X) - 회원가입
Vue.config.globalProperties.$downloadFileNoAuthCheck = async function (file) {
try {
this.$store.commit('setLoading', true);
const response = await axios({
url: '/file/fileDownload.json', // URL 경로 확인
method: 'post',
headers: {
'Content-Type': 'application/json; charset=UTF-8',
Authorization: this.$store.state.authorization,
},
data: file.fileId,
responseType: 'blob',
});
const url = window.URL.createObjectURL(new Blob([response.data]));
const link = document.createElement('a');
link.href = url;
link.setAttribute('download', file.fileNm+'.'+file.extnNm);
document.body.appendChild(link);
link.click();
document.body.removeChild(link);
window.URL.revokeObjectURL(url);
} catch (error) {
// alert('파일 다운로드 중 오류가 발생했습니다.');
alert(this.$getCmmnMessage("err024"))
}finally{
this.$store.commit('setLoading', false);
}
}
// PDF 뷰어오픈
Vue.config.globalProperties.$openPdfViewrWindwowNoAuthCheck = async function (fileid) {
if(pageAuth.fileDwnldAuthrtYn != 'Y'){
alert('파일확인 권한이 없습니다.');
return false;
}
try {
this.$store.commit('setPdfId', fileid);
window.open(
"/cmmn/pdfView.page",
'_blank'
);
} catch (error) {
// alert('파일 다운로드 중 오류가 발생했습니다.');
}
}
// PDF 뷰어오픈
Vue.config.globalProperties.$reportViwer = function () {
try {
window.open(
"/cmmn/ReportViewer.page",
'_blank'
);
} catch (error) {
// alert('파일 다운로드 중 오류가 발생했습니다.');
}
}
// 메뉴 상단 베너 정보
Vue.config.globalProperties.$getMenuInfo = function () {
return this.$store.state.menuInfo;
}
// PageNavigation 정보
Vue.config.globalProperties.$getPageNaviInfo = function () {
return this.$store.state.pageNaviInfo;
}
// PageNavigation 정보
Vue.config.globalProperties.$setLoading = function (bool) {
this.$store.commit('setLoading', bool);
}
// 최상단 이동
Vue.config.globalProperties.$scrollToTop = function (bool) {
window.scrollTo({
top: 0,
behavior: 'smooth' // 부드럽게 스크롤
});
}
// 최상단 이동
Vue.config.globalProperties.$replaceImagePath = function (val) {
if(val != null){
return val.replace(/\\/gi, "/").replace(/c\:/gi,"");
}else{
return val;
}
}
//unix -> date 변환
Vue.config.globalProperties.$formatUnixToDate = function (val) {
const date = new Date(val);
const year = date.getFullYear();
const month = String(date.getMonth() + 1).padStart(2, '0');
const day = String(date.getDate()).padStart(2, '0');
return `${year}-${month}-${day}`;
}
//이름 마스킹 처리
Vue.config.globalProperties.$name_format_WithMasking = function (name) {
if (name != null && name != '') {
if (name.length === 2) {
return name.charAt(0) + '*';
} else if (name.length === 3) {
return name.charAt(0) + '*' + name.charAt(2);
} else if (name.length >= 4) {
return name.charAt(0) + '*'.repeat(name.length - 2) + name.charAt(name.length - 1);
}
}
return name;
}
//이름 마스킹 처리
Vue.config.globalProperties.$id_format_WithMasking = function (name) {
if (name != null && name != '') {
if (name.length === 2) {
return name.charAt(0) + '*';
} else if (name.length === 3) {
return name.charAt(0) + '*' + name.charAt(2);
} else if (name.length >= 4) {
return name.charAt(0) + name.charAt(1) + '*'.repeat(name.length - 4) + name.charAt(name.length - 2) + name.charAt(name.length - 1);
}
}
return name;
}
//타이틀 변경
Vue.config.globalProperties.$set_title = function (newTitle) {
const title = document.getElementById('dynamic-title');
title.innerText = newTitle
}
//토큰 저장
Vue.config.globalProperties.$setToken = function (setAuthorization, setRefresh) {
this.$store.commit("setAuthorization", setAuthorization);
//this.$store.commit("setRefresh", setRefresh.refresh);
// this.$cookies.set('refresh',res.headers.refresh)
/** jwt토큰 복호화 **/
const base64String = setAuthorization.split('.')[1];
const base64 = base64String.replace(/-/g, '+').replace(/_/g, '/');
const mbr = JSON.parse(decodeURIComponent(window.atob(base64).split('').map(function (c) {
return '%' + ('00' + c.charCodeAt(0).toString(16)).slice(-2);
}).join('')));
this.$store.commit("setMbrId", mbr.mbrId);
this.$store.commit("setMbrNm", mbr.mbrEncptFlnm);
this.$store.commit("setAuthrtNm", mbr.authrtNm);
this.$store.commit("setAuthrtTypeLvl", mbr.authrtTypeLvl);
this.$store.commit('setRoles', mbr.roles);
return mbr.roles;
}
//파일 크기 처리
Vue.config.globalProperties.$formatFileSize = function (size) {
if (size < 1024) return `${size} bytes`;
if (size < 1024 * 1024) return `${(size / 1024).toFixed(2)} KB`;
if (size < 1024 * 1024 * 1024) return `${(size / (1024 * 1024)).toFixed(2)} MB`;
return `${(size / (1024 * 1024 * 1024)).toFixed(2)} GB`;
}
}
}