Files
PM_test/views/main/jsm/main.js
2026-06-12 17:14:03 +09:00

856 lines
36 KiB
JavaScript

import { AntiDebug } from '../../anti_debugging.js';
let antiDebug = new AntiDebug();
import { vars } from './archive/variable.js';
import { Permission } from './archive/userPermission.js';
import { docVars } from './officialDoc/docVariable.js';
import { overviewVars } from './overview/overviewVariable.js';
import {getMyDownloadList} from './archive/common.js';
// import iconv from 'https://cdn.jsdelivr.net/npm/iconv-lite@0.6.3/lib/index.min.js';
import { initProjectSetting } from './archive/projectSetting.js';
document.addEventListener('DOMContentLoaded', async function() {
//// .env파일에 저장된 배포 타입, 클라우드 타입 가져와서 전역변수에 storageType, cloudType 으로 저장
let getEnvDataRes = await axios.get('/common/getEnvData');
vars.storageType = getEnvDataRes.data.deploymentType;
vars.cloudType = getEnvDataRes.data.cloudType;
vars.serviceName = getEnvDataRes.data.serviceName;
docVars.storageType = getEnvDataRes.data.deploymentType;
//// 프로젝트 정보 가져와서 전역변수에 저장
let projectRes = await axios.get('/common/getProject');
for (let project of projectRes.data.data) {
vars.allProject[project.project_id] = project;
}
vars.project = vars.allProject[vars.project_id];
//// 타이틀 설정
await setTitle();
//// 프로젝트별 최대 용량 설정
vars.bucketMaxSize = (vars.project) ? parseInt(vars.project.storage_byte) * 1024 * 1024 * 1024 : 0;
//// 유저 정보 객체 가져와서 스트링으로 전역 변수에 저장
let authStatusRes = await axios.get('/auth/status',{ params: { project_id: vars.project_id } });
let userInfo = authStatusRes.data.user;
vars.userInfoString = JSON.stringify(userInfo);
//////// pm-bcmf 연결용 테스트 코드 - BCMF 유저 정보 생성, 타이틀 커서 스타일 변경, 자동 경로 이동용 변수 설정
let getBcmfUrlQueryRes = await axios.get('/auth/getBcmfUrlQuery');
if (getBcmfUrlQueryRes.data.bcmfId && getBcmfUrlQueryRes.data.bcmfId.includes('bcmf-')) {
// BCMF 유저 정보 생성
let permission = (getBcmfUrlQueryRes.data.bcmfId.split('-')[1] == 'viewer') ? 1 : 7
userInfo = {
user_id: getBcmfUrlQueryRes.data.bcmfId,
user_nm: "BCMF",
company: "BCMF",
dept: "대산당진 2공구",
position: "",
group: "bcmf",
is_resigned: false,
permission: permission,
bookmark: null,
}
vars.userInfoString = JSON.stringify(userInfo);
// 타이틀에 마우스 올렸을 때 기본 커서로 표시
document.querySelector('body > .header .left .title').style.cursor = 'default';
// bcmf에서 iframe으로 pm 화면 연결하는 경우 헤더, 푸터 숨김
document.querySelector('body > .header').style.display = 'none';
document.querySelector('body > .footer').style.display = 'none';
// 헤더가 숨겨져 있으므로 높이에서 footer height(2.25rem)만 빼고, top은 0으로 설정
document.querySelectorAll('body > .main').forEach(main => {
main.style.height = '100dvh';
main.style.top = '0';
})
// 시작경로를 파라미터로 전달한 경우 해당 경로로 자동 이동을 위한 변수 설정
if (getBcmfUrlQueryRes.data.startPath) {
let startPath = getBcmfUrlQueryRes.data.startPath;
let startPathSplit = startPath.split('/');
vars.startPathDepth1 = startPathSplit[0];
vars.startPathDepth2 = startPathSplit[1];
vars.startPathDepth3 = startPathSplit[2];
}
}
if (checkProjectInactive()) setProjectInactive('lock');
// vars.allProject에서 각 프로젝트별 배너 공지(banner_notice) 사용해서 배너 공지 표시/해제 설정
toggleBannerNoticeArea();
//// 접속 인원 모달창에 프로젝트 담당자 표시
// let projectManagerName = document.querySelector('.archive-modal .modal-header > .title .right-wrap .project-manager-name');
let projectManagerName = document.querySelector('.archive-modal .modal-wrap .modal-body .connected-users-wrap .project-setting-wrap .project-manager-wrap .project-manager-name');
projectManagerName.textContent = (vars.project) ? `${vars.project.user_nm} ${vars.project.position}` : '-';
if (vars.project && !vars.project.user_nm) projectManagerName.textContent = '-';
// 유저 정보로 permission 객체 생성
vars.permission = new Permission();
//permission 객체 수정 못하도록 freeze
Object.freeze(vars.permission);
Object.freeze(Object.prototype);
// 조건 위치를 permission 객체 함수를 사용하기 위해 객체 생성 이후로 위치 조정 main.js/33 -> main.js/47
// 개발자 계정인 경우
if (vars.permission.checkPermission('project-inactive-sign')) {
// 프로젝트가 비활성화 상태이면 project-inactive-sign on
if (!vars.project.is_active) {
document.querySelector('.project-inactive-sign').style.display = 'flex';
}
}
//// 각 페이지별 index.js 임포트
const archiveIndex = await import(`./archive/index.js`);
if (!archiveIndex.isLoaded) {
archiveIndex.loadArchive();
}
// 과업개요 index.js 임포트
if(vars.project && vars.project.overview) await import(`./overview/index.js`);
//// 유저 권한에 따라 초기 dom객체 표시 or 삭제
await removeDomByPermission(userInfo);
//// 컴포넌트 초기 설정
await componentsInit();
//// 실시간 마우스 표시
document.addEventListener('mousemove', throttle((event) => {
vars.socket.emit('setMouseInfo', {
x: event.clientX / window.innerWidth,
y: event.clientY / window.innerHeight,
});
}, 10));
vars.socket.on('setMouse', (data) => {
// 자신의 커서는 생성하거나 업데이트하지 않음
if (data.clientId === vars.socket.id) {
return;
}
if (!vars.cursors[data.clientId]) {
// 새로운 클라이언트 ID에 대한 커서 생성
let cursor = document.createElement('div');
cursor.className = 'cursor';
let wrap = document.createElement('div');
wrap.className = 'wrap';
let userInfo = data;
let userColor = data.userColor;
let userText = document.createElement('div');
userText.className = 'user-text';
userText.textContent = `${userInfo.user_nm} ${userInfo.position}`;
// userText.style.color = userColor;
userText.style.background = userColor;
let cursorSvg = `
<svg width="30" height="30" viewBox="0 0 50 52" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M14.6279 2L14.611 43.1659L26.1686 30.0568L43.605 31.2398L14.6279 2Z"
stroke="#cccccc" stroke-width="4" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M15.7041 4.61523L15.6894 40.3646L25.7263 28.9804L40.8684 30.0077L15.7041 4.61523Z"
fill="${userColor}" stroke="#ffffff" stroke-width="2" stroke-linecap="round"/>
</svg>
`;
// let cursorSvg = `
// <svg width="30" height="30" viewBox="0 0 50 52" fill="none" xmlns="http://www.w3.org/2000/svg">
// <path d="M15.7041 4.61523L15.6894 40.3646L25.7263 28.9804L40.8684 30.0077L15.7041 4.61523Z"
// fill="${userColor}"/>
// </svg>
// `;
cursor.innerHTML = cursorSvg;
wrap.appendChild(userText);
cursor.appendChild(wrap);
document.body.appendChild(cursor);
vars.cursors[data.clientId] = cursor;
vars.cursors[data.clientId].id = data.clientId;
vars.cursors[data.clientId].timer = setTimeout(() => {
if (vars.cursors[clientId]) {
vars.cursors[clientId].remove();
delete vars.cursors[clientId];
}
}, 3000);
}
// 커서 위치 업데이트
vars.cursors[data.clientId].style.left = (data.x * window.innerWidth - 7) + 'px';
vars.cursors[data.clientId].style.top = data.y * window.innerHeight + 'px';
//타이머 재설정
if (vars.cursors[data.clientId].timer) {
clearTimeout(vars.cursors[data.clientId].timer);
}
vars.cursors[data.clientId].timer = setTimeout(() => {
if (vars.cursors[data.clientId]) {
vars.cursors[data.clientId].remove();
delete vars.cursors[data.clientId];
}
}, 3000);
});
vars.socket.on('userDisconnected', (clientId) => {
// 연결이 끊긴 클라이언트의 커서 제거
if (vars.cursors[clientId]) {
vars.cursors[clientId].remove();
delete vars.cursors[clientId];
}
});
save_user();
});
// ** 권한 관련
async function removeDomByPermission(userInfo) {
if (userInfo.permission != undefined || userInfo.permission != null || userInfo.permission != '') {
// 기능별 권한이 변경될 경우를 고려해서 각자 개별 분리 시켜주었습니다.
// 개발자도구 모달
const devMenuModal = document.querySelector('.dev-menu-modal');
// 개발자도구 모달은 키는 함수가 따로 있기 때문에 권한이 없다면 DOM 삭제만 진행
if(devMenuModal){
if(!vars.permission.checkPermission('dev-menu')) devMenuModal.remove();
}
// 헤더 폴더 추가 버튼 (부관리자 이상)
const headerMenuAddBtn = document.querySelector('.menu-add');
if(headerMenuAddBtn){
if(vars.permission.checkPermission('set-user-permission')){
headerMenuAddBtn.style.setProperty('display', 'flex', 'important');
} else {
headerMenuAddBtn.remove();
}
}
// 유저 권한 설정 버튼 (부관리자 이상)
const setUserPermissionBtn = document.querySelector('.set-user-permission-btn');
if(setUserPermissionBtn){
if(vars.permission.checkPermission('set-user-permission')){
setUserPermissionBtn.style.setProperty('display', 'flex', 'important');
} else {
setUserPermissionBtn.remove();
}
}
// 과업개요 왼쪽 영역 수정 버튼 (부관리자 이상)
const overviewSectionLeftBtn = document.querySelector('.overview .section-left-edit');
if(overviewSectionLeftBtn){
if(vars.permission.checkPermission('overview-left-edit')){
overviewSectionLeftBtn.style.setProperty('display', 'flex', 'important');
} else {
overviewSectionLeftBtn.remove();
}
}
// 과업개요 가운데 영역 수정 버튼 (부관리자 이상)
const overviewSectionMiddleBtn = document.querySelector('.overview .section-middle-edit');
if(overviewSectionMiddleBtn){
if(vars.permission.checkPermission('overview-middle-edit')){
overviewSectionMiddleBtn.style.setProperty('display', 'flex', 'important');
} else {
overviewSectionMiddleBtn.remove();
}
}
// 과업개요 주요 현안 및 이슈 수정 버튼 (부관리자 이상)
const overviewIssueBtn = document.querySelector('.overview .issue-edit');
if(overviewIssueBtn){
if(vars.permission.checkPermission('overview-issue-edit')){
overviewIssueBtn.style.setProperty('display', 'flex', 'important');
} else {
overviewIssueBtn.remove();
}
}
// 과업개요 - 과업기간 - 변동내역 모달 - 리스트 추가 버튼 (부관리자 이상)
const overviewTaskHistoryAddBtn = document.querySelector('.overview-modal .task-history-add');
if(overviewTaskHistoryAddBtn){
if(vars.permission.checkPermission('overview-task-history-add')){
overviewTaskHistoryAddBtn.style.setProperty('display', 'flex', 'important');
} else {
overviewTaskHistoryAddBtn.remove();
}
}
// 과업개요 - 과업기간 - 변동내역 모달 - 저장 버튼 (부관리자 이상)
const overviewTaskHistorySaveBtn = document.querySelector('.overview-modal .task-history-save');
if(overviewTaskHistorySaveBtn){
if(vars.permission.checkPermission('overview-task-history-save')){
overviewTaskHistorySaveBtn.style.setProperty('display', 'flex', 'important');
} else {
overviewTaskHistorySaveBtn.remove();
}
}
// 과업개요 - 주요일정 - 일정 추가버튼 (일반 참여자 이상)
const overviewScheduleAddBtn = document.querySelector('.overview .add-schedule-btn');
if(overviewScheduleAddBtn){
if(vars.permission.checkPermission('overview-schedule-add')){
overviewScheduleAddBtn.style.setProperty('display', 'flex', 'important');
} else {
overviewScheduleAddBtn.remove();
}
}
// 아카이브 - 메모 - AI버튼 (일반 참여자 이상)
const memoAiBtn = document.querySelector('.memo .ai-btn');
if(memoAiBtn){
if(vars.permission.checkPermission('memo-ai')){
memoAiBtn.style.setProperty('display', 'flex', 'important');
} else {
memoAiBtn.remove();
}
}
// 아카이브 - 메모 - 수정버튼 (일반 참여자 이상)
const memoEditBtn = document.querySelector('.memo .edit-btn');
if(memoEditBtn){
if(vars.permission.checkPermission('memo-edit')){
memoEditBtn.style.setProperty('display', 'flex', 'important');
} else {
memoEditBtn.remove();
}
}
// 폴더 다운로드 버튼 - 관리자 이상
const downloadFolderBtn = document.querySelector('.header .download-btn');
if(downloadFolderBtn){
if(vars.permission.checkPermission('download-folder')){
await getMyDownloadList();
downloadFolderBtn.style.setProperty('display', 'flex', 'important');
} else {
downloadFolderBtn.remove();
}
}
// 프로젝트 step, type, name 변경 - 관리자 이상
const projectStepBtn = document.getElementById('project-step-btn');
const projectStepCapsule = document.getElementById('project-step-capsule');
const projectTypeBtn = document.getElementById('project-type-btn');
const projectTypeCapsule = document.getElementById('project-type-capsule');
if(projectStepBtn && projectStepCapsule && projectTypeBtn && projectTypeCapsule) {
if(vars.project.category === 'overseas') {
initProjectSetting('overseas');
} else if (vars.project.category === 'bimproject') {
initProjectSetting('bimproject');
} else {
initProjectSetting();
}
}
// if(projectStepBtn && projectStepCapsule && projectTypeBtn && projectTypeCapsule && (window.location.href.toLowerCase().includes('bim.') || window.location.href.toLowerCase().includes('overseas.'))){
// if(projectStepBtn && projectStepCapsule && projectTypeBtn && projectTypeCapsule && (window.location.href.toLowerCase().includes('172.') || window.location.href.toLowerCase().includes('overseas.'))){
// initProjectSetting();
// }
//#임시# 프로젝트 step, type 변경 - 관리자 이상
//step
// const projectStepBtn = document.getElementById('project-step-btn');
// const projectStepCapsule = document.getElementById('project-step-capsule');
// if(projectStepBtn && projectStepCapsule && (window.location.href.toLowerCase().includes('bim.') || window.location.href.toLowerCase().includes('overseas.'))){
// if(vars.permission.checkPermission('change-project-step')) {
// projectStepCapsule.remove();
// projectStepBtn.innerHTML = `
// <h5 class="project-step__label --step__${vars.project.step}">${typeStep2Kor(vars.project.step)}</h5>
// <i class="project-step__icon"></i>`;
// } else {
// projectStepBtn.remove();
// projectStepCapsule.innerHTML = typeStep2Kor(vars.project.step);
// projectStepCapsule.classList.add(`--step-capsule__${vars.project.step}`);
// }
// }else{
// projectStepCapsule.remove();
// projectStepBtn.remove();
// }
// //type
// const projectTypeBtn = document.getElementById('project-type-btn');
// const projectTypeCapsule = document.getElementById('project-type-capsule');
// if(projectTypeBtn && projectTypeCapsule && window.location.href.toLowerCase().includes('bim.')){
// if(vars.permission.checkPermission('change-project-type')) {
// projectTypeCapsule.remove();
// projectTypeBtn.innerHTML = `
// <h5 class="project-type__label --type__${vars.project.project_type}">${typeStep2Kor(vars.project.project_type)}</h5>
// <i class="project-type__icon"></i>`;
// } else {
// projectTypeBtn.remove();
// projectTypeCapsule.innerHTML = typeStep2Kor(vars.project.project_type);
// }
// }else{
// projectTypeCapsule.remove();
// projectTypeBtn.remove();
// }
// //// 권한이 개발자인 경우
// document.querySelectorAll('.permission-min-dev').forEach(elem => {
// if (vars.permission.checkPermission('dev-menu')) { // 나중에 개발자 코드 변경될 예정 // Permission Class Test 250621
// if (elem.classList.contains('dev-menu-modal')) return; // 개발자 메뉴 모달은 바로 flex로 설정할 필요 없으므로 제외
// elem.style.setProperty('display', 'flex', 'important');
// } else {
// elem.remove();
// }
// })
//// 권한이 부관리자 이상인 경우
// document.querySelectorAll('.permission-min-sub-master').forEach(elem => {
// if (vars.permission.checkPermission('permission-btn') || vars.permission.checkPermission('overview-left-edit')) {
// elem.style.setProperty('display', 'flex', 'important');
// } else {
// elem.remove();
// }
// })
// //// 권한이 보안참여자 미만인 경우
// document.querySelectorAll('.permission-min-security-worker').forEach(elem => {
// if (userInfo.permission < 15) {
// elem.remove();
// } else {
// elem.style.setProperty('display', 'flex', 'important');
// }
// })
// //// 권한이 일반참여자 미만인 경우
// document.querySelectorAll('.permission-min-worker').forEach(elem => {
// // 현재 main.html에서 .ai-btn, .edit-btn (메모 ai, 수정 버튼)클래스에 permission-min-worker 추가
// if (userInfo.permission < 7) {
// elem.remove();
// } else {
// elem.style.setProperty('display', 'flex', 'important');
// }
// })
}
}
//type, step 한글화
export function typeStep2Kor(param){
let result = undefined;
switch(param){
case 'done':
result = '완료';
break;
case 'active':
result = '진행';
break;
case 'stop':
result = '중지';
break;
case 'wait':
result = '대기';
break;
case 'construction':
result = '시공';
break;
case 'design':
result = '설계';
break;
case 'surgest':
result = '제안';
break;
case 'research':
result = '연구';
break;
case 'support':
result = '지원';
break;
case 'center':
result = '센터';
break;
case 'survey':
result = '측량';
break;
// case 'ETC':
// result = '기타';
// break;
case 'MP':
result = 'MP (기본계획)';
break;
case 'DD':
result = 'DD (실시설계)';
break;
case 'FS':
result = 'FS (타당성조사)';
break;
case 'PD':
result = 'PD (기본설계)';
break;
case 'DS':
result = 'DS (설계감리)';
break;
case 'CS':
result = 'CS (시공감리)';
break;
case 'PMC':
result = 'PMC (실시설계)';
break;
case 'IDC':
result = 'IDC (타당성조사)';
break;
case 'DR':
result = 'DR (설계검토)';
break;
case 'ETC':
result = 'ETC (기타)';
break;
default:
result = '없음';
break;
}
return result;
}
async function setTitle() {
// 타이틀 카테고리 이미지 및 프로젝트명 설정 후 마르퀴효과 적용
// document.querySelector('.header .left .title .marquee-track .category').src = `/main/img/header/header-logo-${vars.project.category}.svg`;
let category = '-';
let projectNm = '-';
if (vars.project) {
category = vars.project.category.toUpperCase();
projectNm = vars.project.project_nm;
}
document.querySelector('.header .left .title .marquee-track .category').innerHTML = category;
document.querySelector('.header .left .title .marquee-track .project-name').innerHTML = projectNm;
if (vars.project) await startMarquee('title');
}
async function componentsInit() {
// 헤더 - 프로젝트에 포함되지 않은 계정인 경우 헤더 버튼 삭제
// 헤더 - 프로젝트 db에서 과업개요, 공문, 위치기반모델 사용 여부에 따라 헤더 버튼 삭제
// 푸터 - 프로젝트에 포함되지 않은 계정인 경우 푸터 저장공간/활동로그 삭제
// 프로젝트가 비활성화 상태면 리턴
if (checkProjectInactive()) return;
let overviewMain = document.querySelector('.overview-main');
let overviewBtn = document.querySelector('.header .overview-btn');
let overviewModalWrapper = document.querySelector('.overview-modal-wrapper');
let officialDocMain = document.querySelector('.official-doc-main');
let officialDocBtn = document.querySelector('.header .official-doc-btn');
let officialDocModalBackground = document.querySelector('.official-doc-modal-background');
let officialDocModalAll = document.querySelectorAll('.official-doc-modal');
let modelBtn = document.querySelector('.header .model-btn');
let mainNotice = document.querySelector('.main-notice');
let userInfo = JSON.parse(vars.userInfoString);
if ((userInfo.permission == null && typeof userInfo.permission != 'number')) {
// 프로젝트에 포함되어 있지 않은 사용자는 프로젝트 비활성화
setProjectInactive('permission');
} else {
// ** 권한 관련
// 참관자 권한일 때 활동로그 삭제
// if (userInfo.permission == 1) logWrap.remove();
// 프로젝트 db에서 과업개요, 공문, 위치기반모델 사용 여부에 따라 버튼 삭제
if (vars.project.overview) {
overviewBtn.style.display = 'flex';
} else {
if (overviewMain) overviewMain.remove();
if (overviewBtn) overviewBtn.remove();
if (overviewModalWrapper) overviewModalWrapper.remove();
}
if (vars.project.official_doc) {
officialDocBtn.style.display = 'flex';
} else {
if (officialDocMain) officialDocMain.remove();
if (officialDocBtn) officialDocBtn.remove();
if (officialDocModalBackground) officialDocModalBackground.remove();
if (officialDocModalAll.length != 0) {
officialDocModalAll.forEach(elem => {
elem.remove();
})
}
}
if (vars.project.gsim) modelBtn.style.display = 'flex';
else modelBtn.remove();
}
}
async function startMarquee(type) {
let trackContainer;
if (type == 'title') trackContainer = document.querySelector('body > .header .left .title');
if (type == 'bannerNotice') trackContainer = document.querySelector('body > .banner-notice-area .content');
let originalTrack = trackContainer.querySelector('.marquee-track');
if(window.location.origin.includes('gtb.')){
// gtb 임시코드
// document.querySelectorAll('.marquee-track-wrap .pm, .marquee-track-wrap .symbol, .marquee-track-wrap .category').forEach(e=>e.style.display='none');
originalTrack.querySelector('.pm').style.display = 'none';
originalTrack.querySelectorAll('.symbol').forEach(e => e.style.display = 'none');
originalTrack.querySelector('.category').style.display = 'none';
}
const createMarqueeInstance = async (container, originalTrack) => {
const wrap = document.createElement('div');
wrap.classList.add('marquee-track-wrap');
const cloneTrack1 = originalTrack.cloneNode(true);
const cloneTrack2 = originalTrack.cloneNode(true);
wrap.appendChild(originalTrack.cloneNode(true));
wrap.appendChild(cloneTrack1);
wrap.appendChild(cloneTrack2);
container.innerHTML = '';
container.appendChild(wrap);
const setMarquee = (entries, wrap) => {
const pixelsPerSecond = 40;
const firstTrack = wrap.querySelector('.marquee-track:first-child');
if (!firstTrack) return;
const trackWidth = firstTrack.getBoundingClientRect().width;
if (trackWidth === 0) return;
const duration = trackWidth / pixelsPerSecond;
wrap.style.setProperty('--duration', `${duration}s`);
wrap.style.setProperty('--translateX', `-${trackWidth}px`);
};
// 초기 마르퀴 설정
// setTimeout(async function () {
// await setMarquee(null, wrap);
// }, 500);
// 타이틀/배너 공지 크기 변화 감지되면 다시 마르퀴 설정
setTimeout(async function () {
let observer = new ResizeObserver(async (entries, observer) => {
await setMarquee(entries, wrap);
});
observer.observe(container);
}, 500);
//// 초기 마르퀴 설정 안해도 정상 작동?
};
createMarqueeInstance(trackContainer, originalTrack);
}
//user정보 저장
function save_user() {
if (vars.lastHeaderBtn) {
let me = JSON.parse(vars.userInfoString);
me.project_id = vars.project_id;
me.userColor = getRandomColor();
me.curPath = vars.lastHeaderBtn.dataset.resourcePath;
me.origin = window.location.origin;
vars.socket.emit('setUser', { me: me, stat: 'first', origin: window.location.origin});
}
}
export function checkProjectInactive() {
// vars.project.is_active는 프로젝트가 활성화 되어 있으면 true, 비활성화 되어 있으면 false
// checkProjectInactive() 함수는 프로젝트가 비활성화 상태인지를 체크하는 함수이므로
// 활성화 되어 있으면 true, 비활성화 되어 있으면 false를 리턴해야됨 (vars.project.is_active와 반대)
// 비활성화 된 프로젝트 배열 안에 현재 프로젝트 아이디가 포함되어 있으면 비활성화 상태(true)로 리턴
let result = (vars.project) ? !vars.project.is_active : false;
// 관리자 계정인 경우 무조건 활성화 상태(false)로 리턴
if (JSON.parse(vars.userInfoString).group == 'dev') result = false;
return result;
}
export async function toggleBannerNoticeArea() {
let userInfo = JSON.parse(vars.userInfoString);
let userId = userInfo.user_id;
// if (userId.includes('bcmf-')) {
// } else {
let bannerNoticeArea = document.querySelector('body > .banner-notice-area');
let bannerNoticeContent = bannerNoticeArea.querySelector('.content');
let header = document.querySelector('body > .header');
let mainAll = document.querySelectorAll('body > .main');
bannerNoticeArea.style.justifyContent = 'center';
bannerNoticeContent.innerHTML = '';
let textWrap = document.createElement('div');
textWrap.classList.add('text-wrap');
let text = document.createElement('div');
text.classList.add('text');
textWrap.appendChild(text);
bannerNoticeContent.appendChild(textWrap);
let noticeText = (vars.project) ? vars.project.banner_notice : '';
if (noticeText == '' || noticeText == undefined || noticeText == null) {
bannerNoticeArea.style.display = 'none';
text.innerHTML = '';
header.style.top = '0';
mainAll.forEach(main => {
if (userId.includes('bcmf-')) {
// bcmf에서 iframe으로 pm 화면 연결하는 경우 헤더, 푸터가 숨겨져 있으므로 높이는 100dvh로, top은 0으로 설정
main.style.height = '100dvh';
main.style.top = '0';
} else {
main.style.height = 'calc(100dvh - 2.25rem - 2.25rem)';
main.style.top = '2.25rem';
}
})
} else {
bannerNoticeArea.style.display = 'flex';
text.innerHTML = noticeText;
header.style.top = '2.25rem';
mainAll.forEach(main => {
if (userId.includes('bcmf-')) {
// bcmf에서 iframe으로 pm 화면 연결하는 경우 헤더, 푸터가 숨겨져 있으므로 높이에서 banner-notice-area height(2.25rem) 빼고, top은 2.25rem으로 설정
main.style.height = 'calc(100dvh - 2.25rem)';
main.style.top = '2.25rem';
} else {
main.style.height = 'calc(100dvh - 2.25rem - 2.25rem - 2.25rem)';
main.style.top = '4.5rem';
}
})
if (textWrap.getBoundingClientRect().width > bannerNoticeArea.getBoundingClientRect().width - 10) {
textWrap.classList.add('marquee-track');
bannerNoticeArea.style.justifyContent = 'flex-start';
await startMarquee('bannerNotice');
}
}
// }
}
export function setProjectInactive(type, text) {
// 프로젝트 비활성화 된 경우 초기 프로그레스 종료
document.querySelector('.init-progress').style.display = 'none';
let archiveMain = document.querySelector('.archive-main');
let permissionModal = document.querySelector('.permission-modal');
let overviewMain = document.querySelector('.overview-main');
let overviewBtn = document.querySelector('.header .overview-btn');
let overviewModalWrapper = document.querySelector('.overview-modal-wrapper');
let officialDocMain = document.querySelector('.official-doc-main');
let officialDocBtn = document.querySelector('.header .official-doc-btn');
let officialDocModalBackground = document.querySelector('.official-doc-modal-background');
let officialDocModalAll = document.querySelectorAll('.official-doc-modal');
let headerCenterLeft = document.querySelector('.header > .center .left.wrap');
let headerCenterRight = document.querySelector('.header > .center .right.wrap');
let sizeWrap = document.querySelector('.footer .size-wrap');
let logWrap = document.querySelector('.footer .log-wrap');
let setUserPermissionBtn = document.querySelector('.archive-modal .set-user-permission-btn');
let mainNotice = document.querySelector('.main-notice');
if (archiveMain) archiveMain.remove();
if (permissionModal) permissionModal.remove();
if (overviewMain) overviewMain.remove();
if (overviewBtn) overviewBtn.remove();
if (overviewModalWrapper) overviewModalWrapper.remove();
if (officialDocMain) officialDocMain.remove();
if (officialDocBtn) officialDocBtn.remove();
if (officialDocModalBackground) officialDocModalBackground.remove();
if (officialDocModalAll.length != 0) {
officialDocModalAll.forEach(elem => {
elem.remove();
})
}
if (headerCenterLeft) headerCenterLeft.remove();
if (headerCenterRight) headerCenterRight.remove();
if (sizeWrap) sizeWrap.remove();
if (logWrap) logWrap.remove();
if (setUserPermissionBtn) setUserPermissionBtn.remove();
let mainNoticeText = '';
if (type == 'permission') {
// mainNoticeText = `
// <div>${JSON.parse(vars.userInfoString).user_nm} 님은 ${vars.project.project_nm} 프로젝트에 포함되어 있지 않습니다.</div>
// <div>프로젝트 참가 신청 또는 문의사항은 프로젝트 담당자에게 연락해 주시기 바랍니다.</div>
// <div>프로젝트 담당자 : ${vars.project.user_nm} ${vars.project.position}</div>
// `;
mainNoticeText = `
<div>${JSON.parse(vars.userInfoString).user_nm} 님은 프로젝트에 포함되어 있지 않습니다.</div>
`;
}
if (type == 'lock') {
if (text) {
mainNoticeText = text;
} else {
mainNoticeText = `
<div>프로젝트가 비활성화 상태입니다.</div>
`;
}
}
mainNotice.style.display = 'flex';
mainNotice.innerHTML = mainNoticeText;
}
export function getRandomColor() {
let r, g, b;
let brightness;
while (true) {
r = Math.floor(Math.random() * 256);
g = Math.floor(Math.random() * 256);
b = Math.floor(Math.random() * 256);
// 밝기 계산 (0 ~ 255)
brightness = (r * 299 + g * 587 + b * 114) / 1000;
// 너무 밝거나 어두운 색상 필터링
if (brightness > 0 && brightness < 150) {
// 각 색상 채널의 차이가 너무 작으면 필터링
if (Math.abs(r - g) > 20 || Math.abs(r - b) > 20 || Math.abs(g - b) > 20) {
break; // 조건을 만족하면 루프 종료
}
}
}
// 16진수 문자열로 변환
const hexR = r.toString(16).padStart(2, '0');
const hexG = g.toString(16).padStart(2, '0');
const hexB = b.toString(16).padStart(2, '0');
return `#${hexR}${hexG}${hexB}`;
}
// 임시 스로틀
export function throttle(func, limit) {
let lastFunc;
let lastRan;
return function (...args) {
const context = this;
if (!lastRan) {
func.apply(context, args);
lastRan = Date.now();
} else {
clearTimeout(lastFunc);
lastFunc = setTimeout(function () {
if ((Date.now() - lastRan) >= limit) {
func.apply(context, args);
lastRan = Date.now();
}
}, limit - (Date.now() - lastRan));
}
};
}
window.dtest = async function() {
let res = await axios.post(`${vars.path_name}/dtest`);
console.log(res.data.message);
}
window.otest = async function() {
let res = await axios.post(`${vars.path_name}/otest`);
console.log(res.data.message);
}