Kalendarz z rezerwacją usług

0

Hej,
jak w tytule: mam za zadanie zrobić projekt - kalendarz z rezerwacją usług. Poszperałem po forach, skręciłem kalendarz, dodałem wyskakujące okienko do każdego z dni z godzinami i...
mam dwa pytania:

  1. Jak sądzę, to w gruncie rzeczy dla każdego dnia wyskakuje jedno i to samo okno. Jak zrobić, żeby wyskakiwało ,,indywidualne" dla każdego dnia z osobna? (Chyba, że się mylę i tak zrobione jest ok?)
  2. W projekcie stoi, że aplikacja powinna sprawdzać, czy dany termin jest wolny - jeśli jest, to ma go zapisywać (mam użyć ,,Local Storage", o którym nigdy nic nie było wcześniej), a jeśli nie - to ma to pokazywać.
    W drugim przypadku pewnie, jak zgaduję, mam skręcić alert, który wyskoczy po kliknięciu z infem, że termin zajęty, jeśli godzina w tym dniu jest zapisana w tym całym ,,Local Storage"?
    Jednak w pierwszym nie bardzo wiem, jak to tam zapisać, bo nigdy nie miałem z tym do czynienia.

Nie proszę o napisanie kodu - tylko o jakieś wskazówki.
Czy muszę jakoś zmienić wygląd kodu, żeby zapis w tym czymś był możliwy, czy mam go jakoś zmienić?
Czy ktoś jest w stanie łopatologicznie mi wytłumaczyć, jak się z tego korzysta (albo posiada linka z takowym?).

Kod kalendarza i okienka wstawiam poniżej:

Kalendarz:

<!DOCTYPE html>
<html lang="pl">
    <head>
        <meta charset="UTF-8">
        <link rel="stylesheet" href="Projekt2_java_zaaw_CSS.css">
        <title>projekt_java_zaaw_2</title>
    </head>
    <body>
        <div class="container">
            <div class="calendar">
                <div class="month">
                    <img class="arrow-prev" src="https://i.ibb.co/y89XmR9/strza-ka-kopia.png" alt="arrow" height="70px" width="100px"/>
                    <div class="date">
                        <h1></h1>
                        <p></p>
                    </div>
                    <img class="arrow-next" src="https://i.ibb.co/SRchBnx/strza-ka.png" alt="arrow" height="70px" width="100px"/>
                </div>
                <div class="weekdays">
                    <div>Niedziela</div>
                    <div>Poniedziałek</div>
                    <div>Wtorek</div>
                    <div>Środa</div>
                    <div>Czwartek</div>
                    <div>Piątek</div>
                    <div>Sobota</div>
                </div>
                <div class="days">
                </div>
            </div>
        </div>
      
        <script>
        const date = new Date();

        const renderCalendar = () =>
        {
            date.setDate(1);

const month = date.getMonth();
const monthDays = document.querySelector('.days');

const lastDay = new Date(date.getFullYear(), date.getMonth() + 1, 0).getDate();

const prevLastDay = new Date(date.getFullYear(), date.getMonth(), 0).getDate();

const firstDayOfMonth = date.getDay();

const lastDayOfMonth = new Date(date.getFullYear(), date.getMonth(), 0).getDay();

const nextDays = 7 -lastDayOfMonth - 1;

const months = ["Styczeń", "Luty", "Marzec", "Kwiecień", "Maj", "Czerwiec",
"Lipiec", "Sierpień", "Wrzesień", "Październik", "Listopad", "Grudzień"];

    document.querySelector('.date h1').innerHTML = months[date.getMonth()];

    document.querySelector('.date p').innerHTML = new Date().toDateString();

    let days = "";

    for(let x= firstDayOfMonth; x>0; x--)
    {
        days += `<div class="prev-date">${prevLastDay - x +1}</div>`;
    }

    for(let i=1; i<=lastDay; i++)
    {
        if(i === new Date().getDate() && date.getMonth() ===new Date().getMonth())
        {
            days += `<div class="today">${i}</div>`;
        }
        else
        {days += `<div>${i}</div>`;}
    }

    for (let j =1; j<=nextDays; j++)
    {
        days += `<div class="next-date">${j}</div>`;
        monthDays.innerHTML = days;
    }
        }
         document.querySelector('.arrow-prev').addEventListener('click', ()=>{
                date.setMonth(date.getMonth() -1);
                renderCalendar();
            })

            document.querySelector('.arrow-next').addEventListener('click', ()=>{
                date.setMonth(date.getMonth() +1);
                renderCalendar();
            })

            renderCalendar();

            document.querySelector('.days').addEventListener('click', ()=> {
                window.open('ćwiczenia_java_zaaw11.html', 'okno', 'height=450, width=250');
                renderCalendar();
            })
         
        </script>
    </body>
</html>

Okienko:

<!DOCTYPE html>
<html lang="pl">
    <head>
        <meta charset="UTF-8">
        <title>ćwiczenia_java_zaaw11</title>
    </head>
    <body>
        <script>

const chooseHour = document.createElement('p');
chooseHour.textContent = "Godziny:";
document.body.appendChild(chooseHour);

    const hours = '12:00,13:00,14:00,15:00,16:00,17:00,18:00,19:00,20:00'.split(',');
      for (let c in hours) {
    const newElement = document.createElement('p');
    newElement.id = hours[c]; newElement.className = "showHour";
    newElement.innerHTML = hours[c];
    document.body.appendChild(newElement);
} 

const information = document.createElement('p');
information.textContent = "Imię i Nazwisko:";
document.body.appendChild(information);
const newInput1 = document.createElement('input');
newInput1.id = "imię-i-nazwisko";
document.body.appendChild(newInput1);
const service = document.createElement('p');
service.textContent = "Typ usługi:";
document.body.appendChild(service);
const newInput2 = document.createElement('input');
newInput2.id = "typ-usługi";
document.body.appendChild(newInput2);


            </script>
    </body>
</html>
0

Hej. Możesz podesłać jeszcze plik css? Bo kalendarz nie formatuje się w postaci tabeli tylko pionowej listy. Tak miało być?

PS. Co do storage to tu masz odnośnik https://developer.mozilla.org/pl/docs/Web/API/Web_Storage_API
Nie przejmuj się jak czegoś nie rozumiesz, pytaj :)

Czyli tak:
Wystarczy Ci magazyn lokalny dla sesji. Wyczyści się on po zamknięciu przeglądarki.
Używasz obiektu sessionStorage i nadajesz mu nowe właściwości (przez operator .)

Przykład:

sessionStorage.mojaJakastamDana = "tekst";
sessionStorage.mojaJakastamTablica = [1, 2, 3];
sessionStorage.mojJakistamObiekt = {abc : "cba"};

Po utworzeniu w jednym pliku takich (np) właściwości, możesz ich używać na innej podstronie do czasu zamknięcia przeglądarki.

Czyli np.:

alert(sessionStorage.mojJakistamObiekt["abc"]);
0

Arkusz CSS do powyższego. Sry, nie ogarnąłem :<.

*
{
    margin: 0;
    padding: 0;
    box-sizing: border-box;
}

.container
{
    width: 100%;
    height: 100%;
    background-color: rgb(71, 241, 142);
    color: rgb(3, 3, 100);
    display: flex;
    justify-content: center;
    align-items: center;
}

.calendar
{
    width: 45rem;
    height: 52rem;
    background-color: rgb(110, 218, 245);
}

.month
{
    width: 100%;
    height: 12rem;
    background-color: darkgreen;
    display: flex;
    justify-content: space-between;
    align-items: center;
}

.weekdays
{
    width: 100%;
    height: 5rem;
    display: flex;
    align-items: center;
    justify-content: space-between;
}

.weekdays div
{
    width: 100%;
    height: 5rem;
    display: flex;
    align-items: center;
}

.days
{
    width: 100%;
    display: flex;
    flex-wrap: wrap;
    padding: 0.2rem;
}

.days div
{
font-size: 1.4rem;
margin: 0.3rem;
width: calc(40.2rem/7);
}

.prev-date,
.next-date
{
color: rgb(197, 212, 212);
}

.today
{
    background-color: firebrick;
}

.days div:hover
{
    background-color: firebrick;
    cursor: pointer;
}

.arrow-next:hover
{
cursor: pointer;
}
.arrow-prev:hover
{
cursor: pointer;
}
1

@mpaw:
Dzięki,
ogólnie teraz tylko nie wiem, co zrobić z tym cholernym okienkiem i czy nie wykombinować czegoś innego: bo jak rozumiem z zadania, to po kliknięciu na dany dzień miała się pojawić opcja wyboru godziny, usługi i wpisania danych.
Potem do paragrafów z godzinami pewnie trzeba dorobić jakąś zmianę koloru po kliknięciu (a może zamiast paragrafów stworzyć element ,,radio" z formularza? Da się tak?),
a potem dorobić button ,,rezerwuj" - i po naciśnięciu tego buttonu całość powinna się zapisać w ,,Local Storage". Tylko czy da się to zrobić tak, żeby pobierało zarówno dane z wyskakującego okna, jak i datę z naciśniętego wcześniej DIVa (dnia)?
Napierniczyłem się z tym kalendarzem i boję się go zepsuć :p.

1

@TotalNewbie: Nie mów proszę o sobie kołek, jesteś mądry i ambitny :)

var sessionStorage = window.sessionStorage;
        
        document.querySelector('.days').addEventListener('click', ()=> {
        sessionStorage.day = event.target.innerHTML;
        setTimeout(() => {window.open('pl2.html', 'okno', 'height=450, width=250');}, 500);
        renderCalendar();
    });

zapisujesz w listenerze w sessionStorage numer dnia. A w listenerach odpowiedzialnych za wybór miesiąca, zapisujesz numer miesiąca i numer roku. Po zapisaniu odczytujesz w nowym okienku i odpowiednio zapisujesz rezerwacje. Też w sessionStorage

Ten setTimeout jest zbędny, tylko dla testów. Możesz zrobić też tak:

var sessionStorage = window.sessionStorage;
        
        document.querySelector('.days').addEventListener('click', ()=> {
        sessionStorage.day = event.target.innerHTML;
        window.open('pl2.html', 'okno', 'height=450, width=250');
        renderCalendar();
    });
0

@mpaw: Dzięki za wsparcie mentalne ;). Ambitny może jestem, ale z tą mądrością to bym nie przesadzał.
Niestety kurs idzie dla mnie za szybko i strasznie się plączę z materiałem - a terminy projektów gonią :/.

Niestety i z tym projektem utkwiłem w martwym punkcie i nie wiem, co dalej robić - a że jestem z natury podatną na stres personą, to tylko dalej się nakręcam :p.

Ok. Czyli przy użyciu session storage, robię coś w stylu tymczasowej kopii danych do tego otwieranego okna (i tam mogę ich użyć)? Dobrze rozumiem?
Powiedz mi jeszcze tylko, czym jest 'p12.html' w Twoim kodzie (ja podstawiłem tam po prostu z powrotem html tego okienka, które skręciłem wcześniej, ale wolę spytać :p).

0

@TotalNewbie: p12 tak nazwałem plik, którego źródło podałeś. (Kod okna rezerwacji). Nie chciało mi się nadawać takiej długiej nazwy przy tworzeniu kopii na dysku :P

1 użytkowników online, w tym zalogowanych: 0, gości: 1