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 ํŽ˜์ด์ง€ ๋žœ๋”๋ง ๋ ๐Ÿ”ผ๐Ÿ”ผ๐Ÿ”ผ๐Ÿ”ผ๐Ÿ”ผ๐Ÿ”ผ๐Ÿ”ผ๐Ÿ”ผ๐Ÿ”ผ๐Ÿ”ผ