import { vars } from '../archive/variable.js';
import { checkProjectInactive } from '../main.js';
import { getPresignedURL, generateDeleteImgUrl, uploadImgData, sliceDate, applyUtcOffsetTime, splitStr, formatHour, calculateRemPosition, setDefaultScheduleTime, changeColor, fillPartialBlock } from './overviewCommon.js';
import { overviewVars } from './overviewVariable.js';
//๐ฝ๐ฝ๐ฝ๐ฝ๐ฝ๐ฝ๐ฝ๐ฝ๐ฝ๐ฝ Section-Left, Middle ํ์ด์ง ๋๋๋ง ์์ ๐ฝ๐ฝ๐ฝ๐ฝ๐ฝ๐ฝ๐ฝ๐ฝ๐ฝ๐ฝ
export async function drawList(data) {
if (checkProjectInactive()) return;
overviewVars.originalFilesArr = [];
overviewVars.originalFilesNameArr = [];
overviewVars.originalFilesSizeArr = [];
overviewVars.filesNameArr = [];
/* Section-Left ํ์ด์ง ๋๋๋ง */
// ์ฌ์
๋ชฉ์
const businessPurposeBox = document.querySelector('.business-purpose');
businessPurposeBox.textContent = data[0]?.business_purpose;
businessPurposeBox.title = data[0]?.business_purpose;
// ์์น๋
const locationImgKey = JSON.parse(data[0]?.location_img || '[]');
const swiperUl = document.querySelector('.overview .swiper-wrapper');
if(locationImgKey.length > 0){
// ํ์ด์ง ์ฌ๋๋๋ง์ฉ ์ด๊ธฐํ
overviewVars.filesNameArr.push(...locationImgKey);
vbSwiper.removeAllSlides();
swiperUl.innerHTML = '';
// swiper ๋์ ์์ฑ
for(let i = 0; overviewVars.filesNameArr.length > i; i++){
const li = document.createElement('li');
li.classList.add('swiper-slide');
li.dataset.save = true;
li.dataset.filepath = overviewVars.filesNameArr[i];
const img = document.createElement('img');
const { url } = await getPresignedURL(overviewVars.filesNameArr[i]);
img.src = url;
li.appendChild(img);
vbSwiper.appendSlide(li);
}
} else { // ๊ธฐ๋ณธ ์ค์
swiperUl.innerHTML = '';
const li = document.createElement('li');
li.classList.add('swiper-slide');
const img = document.createElement('img');
img.src = '/main/img/overview/non-photo-overview.svg';
li.appendChild(img);
vbSwiper.appendSlide(li);
}
vbSwiper.update();
// ์ฌ์ง์ด 2์ฅ ์ด์์ผ๋ ์ค์์ดํผ ๋ฃจํ์ต์
ํ์ฑํ
if(locationImgKey.length > 1){
vbSwiper.params.loop = true;
vbSwiper.loopCreate();
vbSwiper.update();
} else { // ์ฌ์ง์ด 1์ฅ ์ดํ์ผ๋๋ ์ค์์ดํผ ๋ฃจํ์ต์
๋นํ์ฑํ
vbSwiper.params.loop = false;
vbSwiper.loopDestroy();
vbSwiper.update();
}
// ๋๋ฅ
const continentBox = document.querySelector('.continent');
continentBox.textContent = data[0]?.continent;
// ๊ตญ๊ฐ
const nationNmBox = document.querySelector('.nation-nm');
nationNmBox.textContent = data[0]?.nation_nm;
nationNmBox.dataset.iso = data[0]?.nation_code;
nationNmBox.dataset.utcOffset = data[0]?.nation_offset;
// ์ํ์ง์ญ
const performanceAreaBox = document.querySelector('.performance-area');
performanceAreaBox.textContent = data[0]?.performance_area;
// ์ฐธ๊ณ ์ง์ญ
const referenceAreaBox = document.querySelector('.reference-area');
referenceAreaBox.textContent = data[0]?.reference_area;
// ๋์ ์ค๋ณต์ ์ํ ์ด๊ธฐํ
overviewVars.filesSizeArr = [];
// ํ์ผ ์ฌ์ด์ฆ DB default๊ฐ 0์ผ๋ ๋ฐฐ์ด๋ก ์ด๊ธฐํ
if(data[0]?.data_size === '0')data[0].data_size = '[0]';
const filesSize = JSON.parse(data[0]?.data_size || '[0]');
overviewVars.filesSizeArr.push(...filesSize);
/* ์์ค๊ท๋ชจ */
// ๊ฐ์
const facilityOverviewBox = document.querySelector('.facility-overview');
facilityOverviewBox.textContent = data[0]?.facility_size_overview;
facilityOverviewBox.title = data[0]?.facility_size_overview;
// ํ์ด์ง ๋๋๋ง ์ดํ์ ์๋ณธ๋ฐฐ์ด์ ๋ณต์ฌ
overviewVars.originalFilesNameArr = [...overviewVars.filesNameArr];
overviewVars.originalFilesSizeArr = [...overviewVars.filesSizeArr];
await makeFacilitySizeTable();
// ์์ค๊ท๋ชจ ํก์คํฌ๋กค
document.querySelector('.overview .scroll-box').addEventListener('wheel', (event) => {
event.preventDefault();
document.querySelector('.overview .scroll-box').scrollLeft += event.deltaY;
});
/* Section-Middle ํ์ด์ง ๋๋๋ง */
// ์ฝ์นญ
const abbreviatedNameBox = document.querySelector('.abbreviated-name');
abbreviatedNameBox.textContent = data[0]?.abbreviated_name;
// Project Code ํ๋ก์ ํธ ์ฝ๋
const projectNoBox = document.querySelector('.project-no');
projectNoBox.textContent = data[0]?.project_no;
// ๊ณผ์
๋ช
(๊ตญ)
const taskNmKrBox = document.querySelector('.task-nm-kr');
taskNmKrBox.textContent = data[0]?.task_nm_kr;
// ๊ณผ์
๋ช
(์)
const taskNmEnBox = document.querySelector('.task-nm-en');
taskNmEnBox.textContent = data[0]?.task_nm_en;
// ๊ณผ์
๋ชฉ์
const taskPurposeBox = document.querySelector('.task-purpose');
taskPurposeBox.textContent = data[0]?.task_purpose;
// ๊ณผ์
์ข
๋ฅ
const taskTypeBox = document.querySelector('.task-type');
taskTypeBox.textContent = data[0]?.task_type;
// ์ธํ๊ตฌ๋ถ์ฝ๋
const currencyCode = document.querySelector('.currency-code');
currencyCode.textContent = data[0]?.currency_code ?? 'USD';
// ๋ฐ์ฃผ๊ท๋ชจ(USD)
const orderSizeUsdBox = document.querySelector('.order-size-usd');
orderSizeUsdBox.textContent = data[0]?.order_size_usd;
// ๋ฐ์ฃผ๊ท๋ชจ(USD)
const orderSizeKrwBox = document.querySelector('.order-size-krw');
orderSizeKrwBox.textContent = data[0]?.order_size_krw;
// ์์ ์ฐฉ๊ณต์ผ๊ณผ ์ฐฉ์์ผ์ ๋์ผํ ์ปฌ๋ผ(tb_overview.commencement_date) ๊ฐ์ ์ฌ์ฉ
const scheuledCommencementDateBox = document.querySelector('.scheuled-commencement-date');
// ๊ณ์ฝ๊ธฐ๊ฐ
const contractPeriodBox = document.querySelector('.contract-period');
// ๋ฐ์ฃผ์ฒ
const clientBox = document.querySelector('.client');
clientBox.textContent = data[0]?.client;
// ์๋ฐ์ฃผ์ฒ
const clientOriginBox = document.querySelector('.client-origin');
clientOriginBox.textContent = data[0]?.client_origin;
// ์ฌ์
const financialBox = document.querySelector('.financial');
financialBox.textContent = data[0]?.financial;
// ์
์ฐฐ๋ฐฉ์
const bidBox = document.querySelector('.bid');
bidBox.textContent = data[0]?.bid;
// ์ฌ์๊ตญ๊ฐ
const financialCountryBox = document.querySelector('.financial-country');
financialCountryBox.textContent = data[0]?.financial_country;
// ์ ์ ๋ฐฉ์
const selectionMethodBox = document.querySelector('.selection-method');
selectionMethodBox.textContent = data[0]?.selection_method;
/* ๊ณต๋๋๊ธ */
await makeJointTable(data);
/* ๊ณผ์
๊ธฐ๊ฐ */
// ๊ณ์ฝ์ผ
const contractDateBox = document.querySelector('.contract-date');
// ์ฐฉ์์ผ
const commencementDateBox = document.querySelector('.commencement-date');
// ์ข
๋ฃ์์ ์ผ
const changedCompletionDateBox = document.querySelector('.scheduled-completion-date');
// overseas์ฉ ๋ถ๊ธฐ
if(!overviewVars.overseas){
scheuledCommencementDateBox.textContent = data[0]?.scheuled_commencement_date;
contractPeriodBox.textContent = data[0]?.contract_period != null ? data[0]?.contract_period : '';
changedCompletionDateBox.textContent = data[0]?.original_completion_date;
commencementDateBox.textContent = data[0]?.commencement_date;
contractDateBox.textContent = data[0]?.contract_date;
} else{
scheuledCommencementDateBox.textContent = sliceDate(data[0]?.commencement_date);
changedCompletionDateBox.textContent = sliceDate(data[0]?.original_completion_date);
contractPeriodBox.textContent = data[0]?.contract_period != null ? data[0]?.contract_period + '๊ฐ์' : '';
commencementDateBox.textContent = sliceDate(data[0]?.commencement_date);
contractDateBox.textContent = sliceDate(data[0]?.contract_date);
}
// ์ข
๋ฃ์ผ
const completionDateBox = document.querySelector('.completion-date');
completionDateBox.textContent = data[0]?.completion_date;
/* ์ฌ๋ด๋ด๋น */
// ๋ด๋น๋ถ์
const departmentBox = document.querySelector('.department');
departmentBox.textContent = data[0]?.department;
// ์ฑ
์์
const projectmanagerNmBox = document.querySelector('.projectmanager-nm');
projectmanagerNmBox.textContent = data[0]?.projectmanager_nm;
// ๋ด๋น์
const managerNmBox = document.querySelector('.manager-nm');
managerNmBox.textContent = data[0]?.manager_nm;
// ์ง์๋ถ์
const supportDepartmentBox = document.querySelector('.support-department');
supportDepartmentBox.textContent = data[0]?.support_department;
// ๋ด๋น์
const supportManagerNmBox = document.querySelector('.support-manager-nm');
supportManagerNmBox.textContent = data[0]?.support_manager_nm;
// ์ฃผ์ ํ์ ๋ฐ ์ด์
const Issue = document.querySelector('.overview .issue-content');
Issue.value = data[0]?.issue ?? '';
overviewVars.issueData = data[0]?.issue ?? '';
// overview-main ํ์
document.querySelector('.overview-main').style.display = 'flex';
}
// ๐ผ๐ผ๐ผ๐ผ๐ผ๐ผ๐ผ๐ผ๐ผ๐ผ Section-Left, Middle ํ์ด์ง ๋๋๋ง ๋ ๐ผ๐ผ๐ผ๐ผ๐ผ๐ผ๐ผ๐ผ๐ผ๐ผ
//๐ฝ๐ฝ๐ฝ๐ฝ๐ฝ๐ฝ๐ฝ๐ฝ๐ฝ๐ฝ Section-Left ํ์ด์ง ๋๋๋ง ์์ ๐ฝ๐ฝ๐ฝ๐ฝ๐ฝ๐ฝ๐ฝ๐ฝ๐ฝ๐ฝ
// ์์น๋ ๊ฐ์๋ ์ค์์ดํผ
export const vbSwiper = new Swiper('.vb-swiper .swiper', {
slidesPerView: 1,
spaceBetween: 0,
centeredSlides: true,
speed: 400,
loop: false,
navigation: {
nextEl: '.vb-swiper .swiper-button-next',
prevEl: '.vb-swiper .swiper-button-prev',
},
pagination: {
el: ".vb-swiper .swiper-pagination",
clickable: true,
},
});
// ์์ค๊ท๋ชจ ์ผ๋ถ ๋ฆฌ์คํธ (4๊ฐ)
async function makeFacilitySizeTable() {
try {
const res = await axios.get(`/${vars.project_id}/overview/getFacilitySizeData`, { params: { projectId: vars.project_id } });
if (res.data.message === '200') {
const scrollBox = document.querySelector('.overview .scroll-box.facility-size');
scrollBox.innerHTML = '';
const dataArr = res.data.data;
// ๊ธฐ์กด์ ๊ฐ๊ณ ์๋ sectionTabData๋ฅผ ์ด๊ธฐํ
if(overviewVars.originalSectionTabData)overviewVars.originalSectionTabData = {};
// section-left ๋ชจ๋ฌ ์ด์์๋ ํญ๊ณผ ์
๊ทธ๋ฆฌ๊ธฐ ์ํ ์ ์ญ๋ณ์์ ์ ์ฅ
dataArr.forEach(item => {
if (!overviewVars.originalSectionTabData[item.title]) {
overviewVars.originalSectionTabData[item.title] = [];
}
overviewVars.originalSectionTabData[item.title].push({
key: item.key,
value: item.value,
id: item.facility_id,
projectId: vars.project_id
});
});
overviewVars.sectionTabData = JSON.parse(JSON.stringify(overviewVars.originalSectionTabData));
let currentTitle = '';
let currentBoxBody = null;
let typeWrapCount = 0;
for (let i = 0; i < dataArr.length; i++) {
if (dataArr[i].title !== currentTitle) {
currentTitle = dataArr[i].title;
typeWrapCount = 0;
const sectionBox = document.createElement('div');
sectionBox.className = 'section-box';
const header = document.createElement('div');
header.className = 'section-box--header';
const h3 = document.createElement('h3');
h3.textContent = dataArr[i].title;
header.appendChild(h3);
currentBoxBody = document.createElement('div');
currentBoxBody.className = 'box-body';
sectionBox.appendChild(header);
sectionBox.appendChild(currentBoxBody);
scrollBox.appendChild(sectionBox);
}
if (typeWrapCount < 4) {
const typeWrap = document.createElement('div');
typeWrap.className = 'type--wrap';
const left = document.createElement('div');
left.className = 'type--wrap-left';
const p = document.createElement('p');
p.textContent = dataArr[i].key;
left.appendChild(p);
const right = document.createElement('div');
right.className = 'type--wrap-right';
const h4 = document.createElement('h4');
h4.textContent = dataArr[i].value;
right.appendChild(h4);
typeWrap.appendChild(left);
typeWrap.appendChild(right);
currentBoxBody.appendChild(typeWrap);
typeWrapCount++;
}
}
}
} catch (err) {
console.log(err);
}
}
// ๐ผ๐ผ๐ผ๐ผ๐ผ๐ผ๐ผ๐ผ๐ผ๐ผ section-Left ํ์ด์ง ๋๋๋ง ๋ ๐ผ๐ผ๐ผ๐ผ๐ผ๐ผ๐ผ๐ผ๐ผ๐ผ
//๐ฝ๐ฝ๐ฝ๐ฝ๐ฝ๐ฝ๐ฝ๐ฝ๐ฝ๐ฝ Section-Middle ํ์ด์ง ๋๋๋ง ์์ ๐ฝ๐ฝ๐ฝ๐ฝ๐ฝ๐ฝ๐ฝ๐ฝ๐ฝ๐ฝ
// ๊ณต๋๋๊ธ ํ ๋ง๋ค๊ธฐ
function makeJointTable(data) {
// ํ์ฌ๋ช
const companyNames = splitStr(data[0]?.joint_contract_nm);
const companyLength = (companyNames?.length - 1) || 0;
// ์ง๋ถ์จ
const shares = splitStr(data[0]?.joint_contract_shareratio);
// ๊ณ์ฝ๊ธ(์)
const contract1 = splitStr(data[0]?.contract_amount);
// ๊ณ์ฝ๊ธ(๋ฌ๋ฌ)
const contract2 = splitStr(data[0]?.foreign_currency_amount);
for (let i = 0; i < companyLength; i++) {
overviewVars.companyArr.push({
companyNames: companyNames[i],
shares: shares[i],
contract1: contract1[i],
contract2: contract2[i]
});
}
overviewVars.companyArr.sort((a, b) => {
// ํฉ๊ณ์ ๋ค์ด๊ฐ ๊ณต๋ฐฑ์ด ์ต์ฐ์
if (a.companyNames === "" && b.companyNames !== "") return -1;
if (a.companyNames !== "" && b.companyNames === "") return 1;
// ๋ํ์ฌ์ ๋์ผํ๊ฒ ์ ์ผ ๋จผ์ ์์ผ๋ก
if (a.companyNames === data[0]?.representative_company && b.companyNames !== data[0]?.representative_company) return -1;
if (a.companyNames !== data[0]?.representative_company && b.companyNames === data[0]?.representative_company) return 1;
// ๋ํ์ฌ ๋ค์์ผ๋ก ์ผ์์ด ์ค๋๋ก
if (a.companyNames === '์ผ์' && b.companyNames !== '์ผ์') return -1;
if (a.companyNames !== '์ผ์' && b.companyNames === '์ผ์') return 1;
// ๊ทธ ๋ค์์ ์์ฐ์ ์ ๋ ฌ
let aNum = parseFloat(a.shares);
let bNum = parseFloat(b.shares);
return bNum - aNum;
});
let tableHTML = document.createElement('table');
// ํ
์ด๋ธ ํค๋
let tableHead = document.createElement('thead');
const tableTr = document.createElement('tr');
const stickyTh = document.createElement('th');
stickyTh.classList.add('sticky');
const totalTh = document.createElement('th');
totalTh.innerText = '์ด๊ณ'
tableTr.appendChild(stickyTh);
tableTr.appendChild(totalTh);
if (companyLength > 0) {
const subjectMatterTh = document.createElement('th');
subjectMatterTh.innerText = '์ฃผ๊ด์ฌ';
tableTr.appendChild(subjectMatterTh);
}
for (let i = 1; companyLength > i; i++) {
const tableTh = document.createElement('th');
tableTh.innerText = `๊ณต๋๋๊ธ${i}`;
tableTr.appendChild(tableTh);
}
tableHead.appendChild(tableTr);
tableHTML.appendChild(tableHead);
// ํ์ฌ๋ช
let companyRow = document.createElement('tr');
companyRow.innerHTML = `
ํ์ฌ๋ช
| ${companyLength} | `;
overviewVars.companyArr.forEach((company) => {
if (company.companyNames) {
let td = document.createElement('td');
td.textContent = company.companyNames;
if (company.companyNames === '์ผ์') {
td.style.color = '#111';
td.style.fontWeight = '700';
};
td.classList.add('joint-contract-company-name');
companyRow.appendChild(td);
}
});
tableHTML.appendChild(companyRow);
// ์ง๋ถ์จ
let shareRow = document.createElement('tr');
shareRow.innerHTML += `์ง๋ถ์จ(%) | | `;
let totalShares = 0;
overviewVars.companyArr.forEach((share) => {
if (share.shares) {
let td = document.createElement('td');
td.textContent = share.shares;
if (share.companyNames === '์ผ์') {
td.style.color = '#111';
td.style.fontWeight = '700';
};
if (!isNaN(share.shares)) totalShares += parseFloat(share.shares);
td.classList.add('joint-contract-company-shares');
shareRow.appendChild(td);
}
});
shareRow.children[1].innerText = totalShares;
tableHTML.appendChild(shareRow);
// ๊ณ์ฝ๊ธ(์)
let contractRow1 = document.createElement('tr');
contractRow1.innerHTML += `๊ณ์ฝ๊ธ(KRW) | | `;
let totalContract1 = 0;
overviewVars.companyArr.forEach((amount) => {
// ํ์ฌ๊ฐ ์ผ์์ผ ๋ ๊ฐ์กฐ์ฒ๋ฆฌ
if (amount.contract1) {
let td = document.createElement('td');
if (amount.companyNames === '์ผ์') {
td.style.color = '#111';
td.style.fontWeight = '700';
};
td.textContent = parseFloat(amount.contract1).toLocaleString();
if (!isNaN(amount.contract1)) totalContract1 += parseFloat(amount.contract1);
td.classList.add('joint-contract-krw');
contractRow1.appendChild(td);
}
});
contractRow1.children[1].innerText = totalContract1.toLocaleString();
tableHTML.appendChild(contractRow1);
// ๊ณ์ฝ๊ธ(์ธํ)
let contractRow2 = document.createElement('tr');
contractRow2.innerHTML += `๊ณ์ฝ๊ธ(${data[0]?.currency_code ?? 'USD'}) | | `;
let totalContract2 = 0;
overviewVars.companyArr.forEach((amount) => {
if (amount.contract2) {
let td = document.createElement('td');
if (amount.companyNames === '์ผ์') {
td.style.color = '#111';
td.style.fontWeight = '700';
};
td.textContent = parseFloat(amount.contract2).toLocaleString();
if (!isNaN(amount.contract2)) totalContract2 += parseFloat(amount.contract2);
td.classList.add('joint-contract-usd');
contractRow2.appendChild(td);
}
});
contractRow2.children[1].innerText = totalContract2.toLocaleString();
tableHTML.appendChild(contractRow2);
const container = document.querySelector('#overview-table-container');
container.innerHTML = '';
container.appendChild(tableHTML);
container.addEventListener('wheel', (event) => {
event.preventDefault();
container.scrollLeft += event.deltaY;
});
// ๊ณต๋๋๊ธ ์ค๋ณต์์ฑ ๋ฐฉ์ง๋ฅผ ์ํ ์ด๊ธฐํ
overviewVars.companyArr = [];
}
// ๊ณผ์
์ค์ง ์ด๋ ฅ ๋ฆฌ์คํธ ์์ฑ
export async function makeTaskHistory() {
const res = await axios.get(`/${vars.project_id}/overview/getTaskPeriodData`, { params: { projectId: vars.project_id } })
try {
if (res.data.message === '200') {
document.querySelector('.overview-modal.task-period .overview-modal-body ul').innerHTML = '';
const ul = document.querySelector('.overview-modal.task-period .overview-modal-body ul');
res.data.data.forEach(item => {
const li = document.createElement('li');
// ์ฐจ์
const numberDiv = document.createElement('div');
numberDiv.className = 'work-list-number';
const orderH4 = document.createElement('h4');
orderH4.className = 'order';
orderH4.textContent = item.task_order;
numberDiv.appendChild(orderH4);
// ์ค์ง์ผ์
const dateDiv = document.createElement('div');
dateDiv.className = 'work-list-date';
const dateH4 = document.createElement('h4');
dateH4.className = 'suspension-date';
dateH4.textContent = item.suspension_date;
dateDiv.appendChild(dateH4);
// ์ค์ง์ฌ์
const reasonDiv = document.createElement('div');
reasonDiv.className = 'work-list-script';
const reasonH4 = document.createElement('h4');
reasonH4.className = 'suspension-reason';
reasonH4.textContent = item.suspension_reason;
reasonH4.title = item.suspension_reason;
reasonDiv.appendChild(reasonH4);
// ์ฌ๊ฐ์ผ์
const redateDiv = document.createElement('div');
redateDiv.className = 'work-list-redate';
const redateH4 = document.createElement('h4');
redateH4.className = 'resumption-date';
redateH4.textContent = item.resumption_date;
redateDiv.appendChild(redateH4);
// ํ์๋ด์ฉ
const detailDiv = document.createElement('div');
detailDiv.className = 'work-list-detail';
const consultH4 = document.createElement('h4');
consultH4.className = 'consuletation-content';
consultH4.textContent = item.consultation_content;
consultH4.title = item.consultation_content;
detailDiv.appendChild(consultH4);
// ๋ณ๊ฒฝ ์ผ์
const changeDiv = document.createElement('div');
changeDiv.className = 'work-list-changedate';
const changeH4 = document.createElement('h4');
changeH4.className = 'change-date';
changeH4.textContent = item.change_date;
changeDiv.appendChild(changeH4);
// ๊ณผ์
์ค์ง์ด๋ ฅ ๋ฆฌ์คํธ ๊ฐ๋ณ ์ญ์ ๋ฒํผ
const btn = document.createElement('button');
btn.className = 'xs-btn-type';
btn.setAttribute('data-id', item.task_history_id);
const img = document.createElement('img');
img.className = 'icon';
img.src = '/main/img/overview/icon-close-111.svg';
img.alt = 'icon-close-111';
btn.appendChild(img);
btn.addEventListener('click', async (e) => {
overviewVars.deleteTaskHistory.push(e.target.getAttribute('data-id'))
li.remove();
});
li.append(numberDiv, dateDiv, reasonDiv, redateDiv, detailDiv, changeDiv, btn);
if(!vars.permission.checkPermission('overview-task-history-delete')) btn.remove();
ul.appendChild(li);
});
}
} catch (err) {
console.log(err);
}
}
// ๐ผ๐ผ๐ผ๐ผ๐ผ๐ผ๐ผ๐ผ๐ผ๐ผ Section-Middle ํ์ด์ง ๋๋๋ง ๋ ๐ผ๐ผ๐ผ๐ผ๐ผ๐ผ๐ผ๐ผ๐ผ๐ผ
//๐ฝ๐ฝ๐ฝ๐ฝ๐ฝ๐ฝ๐ฝ๐ฝ๐ฝ๐ฝ Section-Right ํ์ด์ง ๋๋๋ง ์์ ๐ฝ๐ฝ๐ฝ๐ฝ๐ฝ๐ฝ๐ฝ๐ฝ๐ฝ๐ฝ
// ๋ฌ๋ ฅ ์์ฑ ํจ์
export async function generateCalendar(year, month) {
const calendarContainer = document.getElementById('calendar');
const monthNames = ['1์', '2์', '3์', '4์', '5์', '6์', '7์', '8์', '9์', '10์', '11์', '12์'];
//html์์ ์์ฑ
const nextMonthBtn = document.querySelector('.overview .calendar-btn.next-month');
const prevMonthBtn = document.querySelector('.overview .calendar-btn.prev-month');
const addScheduleBtn = document.querySelector('.overview .calendar .add-schedule-btn');
// ์ด๋ฒคํธ ๋ฐ์ธ๋ฉ์ ํ๋ฒ๋ง ํ๊ธฐ์ํด dataset์ ์ฌ์ฉ
if(nextMonthBtn && !nextMonthBtn.dataset.event){
nextMonthBtn.addEventListener('click', () => {
overviewVars.currentMonth++;
if (overviewVars.currentMonth > 11) {
overviewVars.currentMonth = 0;
overviewVars.currentYear++;
}
generateCalendar(overviewVars.currentYear, overviewVars.currentMonth);
});
nextMonthBtn.dataset.event = 'true';
}
if(prevMonthBtn && !prevMonthBtn.dataset.event){
prevMonthBtn.addEventListener('click', () => {
overviewVars.currentMonth--;
if (overviewVars.currentMonth < 0) {
overviewVars.currentMonth = 11;
overviewVars.currentYear--;
}
generateCalendar(overviewVars.currentYear, overviewVars.currentMonth);
});
prevMonthBtn.dataset.event = 'true';
}
if(addScheduleBtn && !addScheduleBtn.dataset.event){
addScheduleBtn.addEventListener('click', () => {
const modal = document.querySelector('.overview-modal.schedule');
const modalWrapper = document.querySelector('.overview-modal-wrapper');
// ์ฃผ์์ผ์ ๋ชจ๋ฌ ์ด๊ธฐํ
modal.querySelector('.schedule-title').value = '';
modal.querySelector('.schedule-content').value = '';
modal.querySelectorAll('input[type=radio][name=country]').forEach(country => {
if(country.value === '๋ํ๋ฏผ๊ตญ'){
country.checked = true;
} else {
country.checked = false;
}
});
modal.querySelector('.custom-checkbox.all-day input').checked = false;
modal.querySelector('.schedule-delete.btn-delete').style.display = 'none';
modal.querySelectorAll('.color .label-color').forEach(label => {
label.classList.remove('on');
});
modal.querySelector('.color .label-color').classList.add('on');
if (modal.style.display === 'block') {
modal.style.display = 'none';
return;
}
if (modal.dataset.scheduleId) {
delete modal.dataset.scheduleId;
}
setDefaultScheduleTime();
modal.style.display = 'block';
modalWrapper.style.display = 'block';
});
addScheduleBtn.dataset.event = 'true';
}
const monthHeader = document.querySelector('.overview .month-header');
if (monthHeader) monthHeader.innerText = `${year}๋
${monthNames[month]}`;
// ์์ผ ์์ฑ
const existDaysOfWeek = document.querySelector('.overview .days-of-week');
if (!existDaysOfWeek) {
const daysOfWeek = document.createElement('div');
daysOfWeek.classList.add('days-of-week');
const weekdays = ['์ผ์์ผ', '์์์ผ', 'ํ์์ผ', '์์์ผ', '๋ชฉ์์ผ', '๊ธ์์ผ', 'ํ ์์ผ'];
weekdays.forEach((day, index) => {
const dayElement = document.createElement('div');
dayElement.classList.add('days-of-week-day');
dayElement.innerText = day;
if (index === 0) dayElement.classList.add('sunday');
daysOfWeek.appendChild(dayElement);
});
calendarContainer.appendChild(daysOfWeek);
}
const existDays = document.querySelector('.overview .days');
// days๊ฐ ์ด๋ฏธ ์๋ค๋ฉด ์ญ์ ํ๊ณ ์ฌ์์ฑ
if (existDays) existDays.remove();
const daysContainer = document.createElement('div');
daysContainer.classList.add('days');
const daysInMonth = new Date(year, month + 1, 0).getDate();
const firstDay = new Date(year, month).getDay();
for (let i = 0; i < firstDay; i++) {
const emptyDay = document.createElement('div');
emptyDay.classList.add('day', 'empty');
daysContainer.appendChild(emptyDay);
}
for (let i = 1; i <= daysInMonth; i++) {
const day = document.createElement('div');
day.classList.add('day');
const mm = (month + 1).toString().padStart(2, '0');
const dd = i.toString().padStart(2, '0');
day.dataset.date = `${year}-${mm}-${dd}`;
const dayOfWeek = new Date(year, month, i).getDay();
if (dayOfWeek === 0) day.classList.add('sunday');
if (dayOfWeek === 6) day.classList.add('saturday');
// ๋น์ผ ์กฐ๊ฑด
if (year === new Date().getFullYear() && month === new Date().getMonth() && i === new Date().getDate())day.classList.add('today');
day.innerHTML = `${i}
`;
daysContainer.appendChild(day);
}
calendarContainer.appendChild(daysContainer);
// ๊ณตํด์ผ, ์ผ์ ๋ก๋
getCalendarEventData(overviewVars.currentYear, overviewVars.currentMonth);
}
// ์ฟผ๋ฆฌ๋ฌธ ํ๋ฒ์ผ๋ก holiday์ ์ผ์ ์ ๊ฐ์ ธ์ ์ผ์ ํ์ ํ์ํ๋ค.
async function getCalendarEventData(currentYear, currentMonth) {
let nationName = document.querySelector('.overview .nation-nm').innerText;
let nationCode = document.querySelector('.overview .nation-nm').dataset.iso.toLowerCase();
try {
const res = await axios.get(`/${vars.project_id}/overview/getCalendarEventData`, { params: { nationName: nationName, projectId: vars.project_id, currentYear: overviewVars.currentYear, currentMonth: overviewVars.currentMonth + 1 } })
// ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์จ ์ดํ type์ ๋ฐ๋ผ์ ๋ถ๊ธฐ๋ฅผ ๋๋๋ค type : holiday / type : schedule
if (res.data.message === '200') {
const calendarEvent = res.data.data;
calendarEvent.sort((a, b) => {
// ํด์ผ ์ผ์ ์ ์์ผ๋ก
if (a.type === 'holiday' && b.type !== 'holiday') return -1;
if (a.type !== 'holiday' && b.type === 'holiday') return 1;
// ์ฐ์์ผ์ ํ๋ณ
const aDate = a.start_date !== a.end_date;
const bDate = b.start_date !== b.end_date;
if (aDate && !bDate) return -1;
if (!aDate && bDate) return 1;
// ์ฐ์์ผ์ ๋ณ๋ก ๊ธฐ๊ฐ์ ๊ธธ์ด ํ๋ณ
const aPeriod = new Date(a.end_date) - new Date(a.start_date);
const bPeriod = new Date(b.end_date) - new Date(b.start_date);
if (aPeriod > bPeriod) return -1;
if (aPeriod < bPeriod) return 1;
return 0;
});
calendarEvent.forEach(event => {
if (event.type === 'holiday') {
const holidayDate = event.start_date;
const holidayTitle = event.title;
const country = event.nation_nm;
const dayEl = document.querySelector(`.day[data-date="${holidayDate}"]`);
if (dayEl) {
if (dayEl.dataset.date === holidayDate && country == 'ํ๊ตญ') {
if (dayEl.classList.contains('saturday')) dayEl.classList.remove('saturday');
dayEl.classList.add('sunday');
const holidayDiv = document.createElement('div');
holidayDiv.classList.add('holiday');
const holidayImg = document.createElement('img');
holidayImg.src = `https://flagcdn.com/kr.svg`;
holidayDiv.appendChild(holidayImg);
const holidayText = document.createElement('p');
holidayText.textContent = holidayTitle;
holidayText.title = holidayTitle;
holidayText.style.color = '#1F7C5D';
holidayDiv.appendChild(holidayText);
dayEl.appendChild(holidayDiv);
} else {
if (dayEl.classList.contains('saturday')) dayEl.classList.remove('saturday');
dayEl.classList.add('sunday');
const holidayDiv = document.createElement('div');
holidayDiv.classList.add('holiday');
const holidayImg = document.createElement('img');
holidayImg.src = `https://flagcdn.com/${nationCode}.svg`;
holidayDiv.appendChild(holidayImg);
const holidayText = document.createElement('p');
holidayText.textContent = holidayTitle;
holidayText.title = holidayTitle;
holidayText.style.color = '#FF3D00';
holidayDiv.appendChild(holidayText);
dayEl.appendChild(holidayDiv);
}
}
} else if (event.type === 'schedule') {
const startDateStr = event.start_date.split('T')[0];
const endDateStr = event.end_date.split('T')[0];
const startDate = new Date(startDateStr);
const endDate = new Date(endDateStr);
let currentDate = new Date(startDate);
while (currentDate <= endDate) {
const dateStr = currentDate.toISOString().split('T')[0];
const dayEl = document.querySelector(`.day[data-date="${dateStr}"]`);
const holidayEl = document.querySelector(`.day[data-date="${dateStr}"] .holiday`);
if (dayEl) {
// ๊ธฐ์กด ๋ฐฐ์ด ์ด๊ธฐํ ๋ฐ ๋์
if (!dayEl.dataset.schedules) dayEl.dataset.schedules = JSON.stringify([]);
const schedules = JSON.parse(dayEl.dataset.schedules);
schedules.push(event);
dayEl.dataset.schedules = JSON.stringify(schedules);
const scheduleDiv = document.createElement('div');
scheduleDiv.classList.add('schedule');
const scheduleTimeDiv = document.createElement('div');
scheduleTimeDiv.classList.add('time');
const scheduleTitleDiv = document.createElement('div');
scheduleTitleDiv.classList.add('title');
scheduleTitleDiv.style.color = '#000';
// ๋จ์ผ ์ผ์
if (dateStr === startDateStr) {
scheduleTitleDiv.innerText = event.title;
// ์ฐ์ ์ผ์
if (startDateStr !== endDateStr) {
const dataColor = changeColor(event.color)
scheduleDiv.style.backgroundColor = dataColor;
scheduleDiv.classList.add('start_date', 'continuous');
}
// ์ผ์ ๋ง์ง๋ง
} else if (dateStr === endDateStr) {
const dataColor = changeColor(event.color)
scheduleDiv.style.backgroundColor = dataColor;
scheduleDiv.classList.add('end_date', 'continuous');
// ์ผ์ ์ค๊ฐ
} else {
const dataColor = changeColor(event.color)
scheduleDiv.style.backgroundColor = dataColor;
scheduleDiv.classList.add('continuous');
}
if (dateStr === startDateStr) {
scheduleTitleDiv.innerText = event.title;
}
const scheduleColorDiv = document.createElement('div');
scheduleColorDiv.classList.add('color');
if (dateStr === startDateStr) {
if (startDateStr === endDateStr) {
scheduleColorDiv.innerText = 'โฆ';
} else {
scheduleColorDiv.innerHTML = ' ';
}
scheduleColorDiv.style.color = event.color;
} else {
scheduleColorDiv.innerHTML = ' ';
}
scheduleDiv.append(scheduleColorDiv, scheduleTitleDiv, scheduleTimeDiv);
const existinSchedules = dayEl.querySelectorAll('.schedule').length;
// ์ผ์ ์ต๋ ๋๊ฐ๊น์ง๋ง ์์ฑ
if (existinSchedules < 2) {
// ๊ณตํด์ผ ์ผ์ ๊ณผ ์ฐ์์ผ์ ์ผ๋ ๊ณตํด์ผ ์ผ์ ์์ผ๋ก ์ฐ์์ผ์ ์์ฑ
if (holidayEl && scheduleDiv.classList.contains('continuous')) {
dayEl.insertBefore(scheduleDiv, holidayEl);
} else {
dayEl.appendChild(scheduleDiv);
}
}
}
currentDate.setDate(currentDate.getDate() + 1);
}
// ์ผ์ 3๊ฐ ์ดํ๋ก๋ ๊ฐ์ ํ์
document.querySelectorAll('.day[data-schedules]').forEach(dayEl => {
const schedules = JSON.parse(dayEl.dataset.schedules);
// ์ด๋ฏธ ์ถ๊ฐ๋ ๊ฒฝ์ฐ ์ญ์
if (dayEl.querySelector('.remain-schedules')) dayEl.querySelector('.remain-schedules').remove();
if (schedules.length > 2) {
const remainDiv = document.createElement('p');
remainDiv.innerText = `๋ฐ ${schedules.length - 2}๊ฐ...`;
remainDiv.classList.add('remain-schedules');
dayEl.appendChild(remainDiv);
}
});
}
});
// ์ผ์ ๋ฆฌ์คํธ ๋ชจ๋ฌ
document.querySelectorAll('.overview .days .day[data-schedules]').forEach(schedule => {
const schedules = JSON.parse(schedule.dataset.schedules);
schedule.addEventListener('click', () => {
const modal = document.querySelector('.overview-modal');
const modalWrapper = document.querySelector('.overview-modal-wrapper');
if (modal.style.display === 'block') {
modal.style.display = 'none';
return;
}
const modalBody = modal.querySelector('.overview-modal-body');
modalBody.innerHTML = '';
schedules.forEach(schedule => {
const scheduleStartDate = schedule.start_date.split('T')[0];
const scheduleStartTime = schedule.start_date.split('T')[1];
const scheduleEndDate = schedule.end_date.split('T')[0];
const scheduleEndTime = schedule.end_date.split('T')[1];
const scheduleDiv = document.createElement('div');
scheduleDiv.classList.add('calendar-list');
const scheduleWrap = document.createElement('div');
const subDiv = document.createElement('div');
subDiv.className = 'schedule-title';
scheduleWrap.appendChild(subDiv);
const scheduleColor = document.createElement('div');
scheduleColor.innerText = 'โฆ'
scheduleColor.style.color = schedule.color;
subDiv.appendChild(scheduleColor);
const scheduleTitle = document.createElement('h3');
scheduleTitle.textContent = schedule.title;
subDiv.appendChild(scheduleTitle);
const scheduleContent = document.createElement('h6');
scheduleContent.textContent = schedule.content;
scheduleWrap.appendChild(scheduleContent);
const scheduleTime = document.createElement('p');
if (scheduleStartTime != '' && scheduleEndTime != '') {
scheduleTime.textContent = `${scheduleStartDate} ${scheduleStartTime} ~ ${scheduleEndDate} ${scheduleEndTime}`
} else {
scheduleTime.textContent = 'ํ๋ฃจ์ข
์ผ'
scheduleTime.style.color = '#FF3D00';
}
scheduleWrap.appendChild(scheduleTime);
const editbtn = document.createElement('button');
editbtn.className = 'xs-btn-type-icon';
editbtn.innerHTML = 'ํธ์ง
';
scheduleDiv.appendChild(scheduleWrap);
scheduleDiv.appendChild(editbtn)
modalBody.appendChild(scheduleDiv);
// ์ด๋ฒคํธ ํธ์ง ํ์ด์ง
editbtn.addEventListener('click', () => {
document.querySelector('.overview-modal.schedule-list').style.display = 'none';
const modal = document.querySelector('.overview-modal.schedule');
const modalWrapper = document.querySelector('.overview-modal-wrapper');
if (modal.style.display === 'block') {
modal.style.display = 'none';
return;
}
if(scheduleStartTime === '' && scheduleEndTime === ''){
modal.querySelector('.all-day input').checked = true;
modal.querySelector('.startTime').disabled = true;
modal.querySelector('.endTime').disabled = true;
}
modal.querySelector('.schedule-title').value = schedule.title;
modal.querySelector('.schedule-content').value = schedule.content;
modal.querySelectorAll('.color .label-color').forEach(btn => {
btn.classList.remove('on');
});
if (modal.querySelector(`.color .label-color[data-color="${schedule.color}"]`)) {
modal.querySelector(`.color .label-color[data-color="${schedule.color}"]`).classList.add('on');
}
modal.querySelector('.startDate').value = scheduleStartDate;
modal.querySelector('.startTime').value = scheduleStartTime;
modal.querySelector('.endDate').value = scheduleEndDate;
modal.querySelector('.endTime').value = scheduleEndTime;
modal.dataset.scheduleId = schedule.calendar_event_id;
if (modal.querySelector(`input[type="radio"][name="country"][value="${schedule.nation_nm}"]`)) {
modal.querySelector(`input[type="radio"][name="country"][value="${schedule.nation_nm}"]`).checked = true;
};
modal.querySelector('.schedule-delete').style.display = 'flex';
modal.style.display = 'block';
modalWrapper.style.display = 'block';
});
// ๊ถํ ์ดํ์ผ๋ ํธ์ง๋ฒํผ ์ญ์
if(!vars.permission.checkPermission('overview-schedule-edit')) editbtn.remove();
});
modal.style.display = 'block';
modalWrapper.style.display = 'block';
});
})
}
} catch {
}
}
export function startTimer(nation) {
// nation์ ๊ฐ์ด ์๊ฑฐ๋ ๋ํ๋ฏผ๊ตญ ์ผ๋ ๊ต๋ฅ์๊ฐ ํ์ฑํ x
if (nation === '๋ํ๋ฏผ๊ตญ' || nation === '' || nation === 'ใ
ก') {
document.querySelector('.overview .overview-box-3 .box.exchange-time').style.display = 'none';
return;
} else {
// ์ด๊ธฐ ๋ก๋ ์ดํ ๋จ์ ์๊ฐ ๊ณ์ฐํด์ setTimeOut ์ดํ์ setInterval๋ก 1๋ถ์ ํ๋ฒ์ฉ ๋์
updateTimeBar();
const currentTime = new Date();
const remainingSecond = 60 - currentTime.getSeconds();
setTimeout(() => {
updateTimeBar();
setInterval(updateTimeBar, 60 * 1000);
}, remainingSecond * 1000);
}
}
// ๊ต๋ฅ์๊ฐ ๊ธฐ๋ฅ ๊ฐ๋ฐ
export async function updateTimeBar() {
// overseas์์๋ง ์ฌ์ฉ
if(!overviewVars.overseas) return;
const otherCountry = document.querySelector('.overview .nation-nm').innerText.trim();
const otherCountryIso = document.querySelector('.overview .nation-nm').dataset.iso.toUpperCase();
const otherUtcOffset = document.querySelector('.overview .nation-nm').dataset.utcOffset;
const krUtcOffset = 32400;
const offsetHours = otherUtcOffset / 3600;
// ํ๋ก์ ํธ ๊ตญ๊ฐ๊ฐ ๋ํ๋ฏผ๊ตญ์ด๋ผ๋ฉด ์์ฑX
if (otherCountry && otherCountry !== '๋ํ๋ฏผ๊ตญ' && otherCountry !== 'ํ๊ตญ') {
document.querySelector('.overview .overview-box-3 .box.exchange-time').style.display = 'block';
// ์์ฐจ๊ณ์ฐํ์ฌ ํ์ฌ ์๊ฐ ์ถ๋ ฅ timebar์ ์ฌ์ฉ
const kstTime = applyUtcOffsetTime(krUtcOffset);
const otherCountryTime = applyUtcOffsetTime(otherUtcOffset);
// ๊ต๋ฅ์๊ฐ 3์๊ฐ ๋์ ์์ฑ
for (let i = 0; i <= 8; i++) {
const hour = (i * 3) + (offsetHours - 9);
document.querySelector(`.overview .bottom-section-4 .other-country-time${i + 1}`).textContent = formatHour(hour)
}
// ๊ต๋ฅ์๊ฐ ์ผ๊ณผ ์๊ฐ ์์ฑ
const workTime = document.querySelectorAll('.overview .bottom-section-3 .timetable-block');
// ํ๊ตญ ๊ธฐ์ค + ๋์ ๊ตญ๊ฐ offset ์์ฐจ ๋ณด์
let startTime = 9 + (9 - offsetHours);
let endTime = 9 + (17 - offsetHours);
// 0~24 ๋ฒ์๋ก ๋ณด์
startTime = (startTime + 24) % 24;
endTime = (endTime + 24) % 24;
const startHour = Math.floor(startTime);
const endHour = Math.floor(endTime);
const startFraction = startTime - startHour;
const endFraction = endTime - endHour;
// ์ธ๊ตญ ๊ทผ๋ฌด์๊ฐ 9~18 ๋์ ์์ฑ
for (let i = 0; workTime.length > i; i++) {
if (startTime <= endTime) {
// ๊ฐ์ ๋
if (i >= startTime && i <= endTime) {
workTime[i].classList.add('work-hour');
}
} else {
// ์์ ๋๋ ๊ฒฝ์ฐ
if (i >= startTime || i <= endTime) {
workTime[i].classList.add('work-hour');
}
}
}
// 15๋ถ 30๋ถ 45๋ถ ์์ฐจ ๋ถ๋ถ์์น
if(startFraction && endFraction){
fillPartialBlock(workTime[startHour], startFraction, true);
fillPartialBlock(workTime[endHour+1], endFraction, false);
}
// ๊ต๋ฅ์๊ฐ ์๊ฐ๊ณผ ๋๋ผ
document.querySelector('.overview .time-bar .kst-time').innerText = 'KR : ' + kstTime;
document.querySelector('.overview .other-country').innerText = otherCountry;
document.querySelector('.overview .time-bar .other-country-time').innerText = ` ${otherCountryIso} : ` + otherCountryTime;
// ๋ํ๋ฏผ๊ตญ ์๊ฐ ๊ธฐ์ค left ๊ณ์ฐ
const moveRem = calculateRemPosition(kstTime); // 9์๋ถํฐ ์์
document.querySelector('.overview .time-bar').style.left = `${moveRem}rem`;
} else {
document.querySelector('.overview .overview-box-3 .box.exchange-time').style.display = 'none';
}
}
// ๐ผ๐ผ๐ผ๐ผ๐ผ๐ผ๐ผ๐ผ๐ผ๐ผ Section-Right ํ์ด์ง ๋๋๋ง ๋ ๐ผ๐ผ๐ผ๐ผ๐ผ๐ผ๐ผ๐ผ๐ผ๐ผ