Skip to content
Snippets Groups Projects
CalendarWeek2.jsx 7.3 KiB
Newer Older
  • Learn to ignore specific revisions
  • import React, { useEffect, useState } from "react"
    
    import '../styles/Calendar.css'
    
    import MakeDay2 from "./MakeDay2";
    
    function CaculateWeek({ nowYear, nowMonth, week, availableSchedules, availableTimes, setAvailableTimes, isContain, startDate, endDate, startTime, endTime}){
    
        const startDay = new Date(nowYear, nowMonth - 1, 1);
        const lastDay = new Date(nowYear, nowMonth, 0);
    
        const firstDay = startDay.getDay();
        const lastDate = lastDay.getDate();
    
    
        const [dragging, setDragging] = useState();
        const [isDragging, setIsDragging] = useState(false); //드래그 여부
        
        // 여기 달력 날짜 수정해야함
    
        const fDay = new Date(nowYear, nowMonth-1, (week-1)*7-firstDay+1) - (0); 
    
        const eDay = fDay + (60*60*24*1000)*6;
    
        const handleDragStart = () => {
            setIsDragging(!isDragging);
        };
    
    
        const handleDragWhile = (newDate, idx, comp) => {
            if(!isDragging)return;
    
            const elm2 = document.getElementById(comp);
    
            if(isContain(newDate-0+idx) || elm2.classList.contains("dragging")){
    
                const elm = document.getElementById(newDate-0+idx);
                elm.classList.remove("dragging")
    
                doCheck = doCheck.filter((key)=>key!==(newDate-0+idx));
    
            }
            else {
                const elm = document.getElementById(newDate-0+idx);
                elm.classList.add("dragging")
    
        const handleClick = (newDate, idx, comp) => {
            // for(let day = fDay; day <= eDay; day+=(60*60*24*1000)){
            //     for(let indx = startTime; indx <= endTime; indx++){
            //         const elm = document.getElementById(day + indx);
            //         elm.classList.remove("dragging")
            //     }
            // }
            // setAvailableTimes([])
            
            const elm2 = document.getElementById(comp);
            // console.log(comp, elm2);
            if(isContain(newDate-0+idx) || elm2.classList.contains("dragging")){
                const elm = document.getElementById(newDate-0+idx);
                elm.classList.remove("dragging")
                doCheck = doCheck.filter((key)=>key!==(newDate-0+idx));
    
            else {
                const elm = document.getElementById(newDate-0+idx);
                elm.classList.add("dragging")
                doCheck.push(newDate-0+idx);
            }
    
            setAvailableTimes(doCheck)
    
        const weekArr = [];
        const selectArr = [];
    
        weekArr.push(<td></td>);
        // 시작 끝 값을 수정해서 일정 변경
    
            const forSelect = [];
            const minute = i*30;
            const time = (String(Math.floor(minute/60)).padStart(2,"0"))+":"+(String(minute%60).padStart(2,"0"));
    
            for(let j = 0; j < 7; j++){
    
                const newDate = new Date(nowYear, nowMonth-1, d,9);
    
    
                if(i===0){
                    let cn = "cella";
                    if(d < 1)cn = "cellb"
                    else if(d > lastDate)cn = "cellb"
                    
                    weekArr.push(<td className={cn}>{newDate.getDate()}</td>);
                }
    
                        <TableCell k={newDate - 0 + i} cn={"noDate"} newDate={newDate} i={i}/>
    
                    if(isContain(newDate-0+i)){
                        forSelect.push(
                            <TableCell k={newDate - 0 + i} cn={"dragging"} newDate={newDate} handleClick={handleClick} hds={handleDragStart} hdw={handleDragWhile} hde={handleDragEnd} i={i}/>
                        );
                    }
                    else{
                        forSelect.push(
                            <TableCell k={newDate - 0 + i} newDate={newDate} handleClick={handleClick} hds={handleDragStart} hdw={handleDragWhile} hde={handleDragEnd} i={i}/>
                        );
                    }
    
            }
    
            selectArr.push(
                <tr key={i}>{time} {forSelect}</tr>
            );
        }
    
        return(
            <tbody>
                <tr>{weekArr}</tr>
                {selectArr}
            </tbody>
        );
    }
    
    
    function CalendarWeek2({ state, availableSchedules, availableTimes, setAvailableTimes, isContain, startDate, endDate, startTime, endTime, today }){
    
        // 일요일 0 시작
    
        const nowDay = startDate.getDay();
        const nowDate = startDate.getDate();
        const [nowMonth, setNowMonth] = useState(startDate.getMonth() + 1); // zero-base
        const [nowYear, setNowYear] = useState(startDate.getFullYear());
    
    
        const getWeek = (date) => {
            const currentDate = date.getDate();
            const firstDay = new Date(date.setDate(1)).getDay();
          
            return Math.ceil((currentDate + firstDay) / 7);
        };
          
    
    
        const [nowWeek, setNowWeek] = useState(getWeek(currentDay));
    
    
    
        const firstDay = (new Date(nowYear, nowMonth - 1, 1)).getDay();
        const lastDay = (new Date(nowYear, nowMonth, 0)).getDay();
    
        let maxWeek = 5;
        if(firstDay > lastDay)maxWeek=6;
    
        const prevWeek = () => {
            let newWeek = nowWeek - 1;
            let newMonth = nowMonth;
            let newYear = nowYear;
            if(newWeek < 1){
                newWeek = maxWeek;
                newMonth = nowMonth - 1;
                if(newMonth < 1){
                    newMonth = 12;
                    newYear = nowYear - 1;
                }
            }
    
            const fd = (new Date(newYear, newMonth - 1, 1)).getDay();
            const ld = (new Date(newYear, newMonth, 0)).getDay();
    
            if(maxWeek === 6 && fd < ld)newWeek-=1;
            else if(maxWeek === 5 && fd > ld)newWeek+=1;
    
            setNowWeek(newWeek);
            setNowMonth(newMonth);
            setNowYear(newYear);
    
            // setCurrentDay(new Date(nowYear, nowMonth - 1, 1*(nowWeek-1) + nowDay));
    
        }
        const nextWeek = () => {
            let newWeek = nowWeek + 1;
            let newMonth = nowMonth;
            let newYear = nowYear;
            if(newWeek > maxWeek){
                newWeek = 1;
                newMonth = nowMonth + 1;
                if(newMonth > 12){
                    newMonth = 1;
                    newYear = nowYear + 1;
                }
            }
            setNowWeek(newWeek);
            setNowMonth(newMonth);
            setNowYear(newYear);
    
            // setCurrentDay(new Date(nowYear, nowMonth - 1, nowDate));
    
        }
    
        return(
            <div className="calendar">
                <div className="header">
                    <h1>{nowMonth}{nowWeek}주차</h1>
                    <button onClick={prevWeek}>prev</button>
                    <button onClick={nextWeek}>next</button>
                </div>
                <h1>{nowYear}</h1>
    
                {
                    state ?
                    <span>가능한 시간</span> :
                    <span>불가능한 시간</span>
                }
    
                <table className="calendarTable">
                    <MakeDay2/>
    
                    <CaculateWeek week={nowWeek} nowYear={nowYear} nowMonth={nowMonth} startDate={startDate} endDate={endDate} startTime={startTime} endTime={endTime} availableSchedules={availableSchedules} availableTimes={availableTimes} setAvailableTimes={setAvailableTimes} isContain={isContain} />
    
                </table>
            </div>
        );
    }
    
    export default CalendarWeek2;