diff --git a/homework/homework.css b/homework/homework.css deleted file mode 100644 index e9ee450..0000000 --- a/homework/homework.css +++ /dev/null @@ -1,754 +0,0 @@ -* { - box-sizing: border-box; - margin: 0; - padding: 0; -} - -body { - margin: 0; - padding: 0; - color: var(--text-primary); - background-color: var(--background) !important; - font-family: "Montserrat", serif !important; - min-height: 100vh; - font-size: 16px; -} - -@media (max-width: 768px) { - body { - font-size: 14px; - } -} - -.kreta-container { - min-height: 100vh; - display: flex; - flex-direction: column; -} - -.kreta-header { - padding: clamp(1rem, 3vw, 2rem); - display: grid; - grid-template-columns: minmax(300px, 400px) 1fr minmax(200px, 300px); - align-items: center; - gap: 1rem; -} - -@media (max-width: 1200px) { - .kreta-header { - grid-template-columns: minmax(250px, 350px) 1fr minmax(180px, 250px); - } -} - -@media (max-width: 768px) { - .kreta-header { - grid-template-columns: 1fr auto auto; - grid-template-areas: - "school toggle user" - "nav nav nav"; - padding: 1rem; - gap: 0.5rem; - } -} - -.school-info { - margin: 0; -} - -@media (max-width: 768px) { - .school-info { - grid-area: school; - max-width: none; - display: flex; - align-items: center; - gap: 0.5rem; - } -} - -.logo-text { - color: var(--text-primary); - font-size: 24px; - font-weight: 600; - margin: 0 0 0.5rem; - display: flex; - align-items: center; -} - -@media (max-width: 768px) { - .logo-text { - margin: 0; - font-size: 20px; - } -} - -.logo { - width: 24px; - border-radius: 8px; - margin-right: 0.5rem; -} - -.school-details { - color: var(--text-secondary); - font-size: 14px; -} - -.school-details span { - display: block; - white-space: nowrap; - overflow: hidden; - text-overflow: ellipsis; - max-width: 300px; -} - -@media (max-width: 768px) { - .school-details span { - max-width: 200px; - } - - .school-details { - font-size: 12px; - } -} - -.user-profile { - position: relative; - justify-self: flex-end; -} - -@media (max-width: 768px) { - .user-profile { - grid-area: user; - } -} - -.user-dropdown-btn { - display: flex; - align-items: center; - gap: 1rem; - background: none; - border: none; - cursor: pointer; - padding: 0.5rem; - color: var(--text-primary); -} - -.user-info { - display: flex; - flex-direction: column; - align-items: flex-end; - gap: 0.25rem; -} - -.user-dropdown { - position: absolute; - top: 100%; - right: 0; - margin-top: 0.5rem; - background: var(--card-card); - border-radius: 12px; - box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1); - width: 200px; - display: none; - z-index: 1000; -} - -.user-dropdown.show { - display: block; - animation: dropdownShow 0.2s ease; -} - -.dropdown-item { - display: flex; - align-items: center; - gap: 0.5rem; - padding: 0.75rem 1rem; - color: var(--text-primary); - text-decoration: none; - transition: background-color 0.2s ease; -} - -.dropdown-item:hover { - background-color: var(--accent-15); - text-decoration: none; -} - - -.kreta-main { - flex: 1; - padding: clamp(1rem, 3vw, 2rem); - max-width: 1400px; - margin: 0 auto; - width: 100%; -} - - -.filter-card { - background: var(--card-card); - border-radius: 24px; - padding: 20px; - margin-bottom: 24px; - box-shadow: 0px 1px var(--shadow-blur) 0px var(--accent-shadow); -} - -.filter-header { - margin-bottom: 16px; -} - -.filter-header h2 { - font-size: 18px; - font-weight: 600; - color: var(--text-primary); - background-color: var(--card-card); -} - -/* Checkbox oszlop stílusai */ -.checkbox-header { - width: 50px; - text-align: center; - font-size: 16px; -} - -.checkbox-cell { - width: 50px; - text-align: center; - padding: 8px !important; -} - -.homework-checkbox { - width: 20px; - height: 20px; - cursor: pointer; - appearance: none; - border: 2px solid var(--accent-30); - border-radius: 4px; - background-color: var(--card-card); - position: relative; - transition: all 0.2s ease; - display: flex; - align-items: center; - justify-content: center; -} - -.homework-checkbox:hover { - border-color: var(--accent); - background-color: var(--accent-15); - transform: scale(1.05); -} - -.homework-checkbox:checked { - background-color: var(--accent); - border-color: var(--accent); -} - -.homework-checkbox:checked::after { - content: '✓'; - color: white; - font-size: 14px; - font-weight: bold; - position: absolute; - top: 50%; - left: 50%; - transform: translate(-50%, -50%); -} - -.homework-checkbox:focus { - outline: 2px solid var(--accent); - outline-offset: 2px; -} - -.homework-checkbox:active { - transform: scale(0.95); -} - -/* Megjelölt házi feladatok stílusai */ -.table-row.user-completed { - opacity: 0.6; - background-color: var(--accent-15) !important; -} - -.table-row.user-completed .table-cell { - color: var(--text-secondary); -} - -.table-row.user-completed .status-badge.completed { - background-color: var(--success); - color: white; -} - - - -/* Mobil nézet checkbox stílusai */ -@media (max-width: 768px) { - .checkbox-header { - width: 40px; - font-size: 14px; - } - - .checkbox-cell { - width: 40px; - padding: 6px !important; - } - - .homework-checkbox { - width: 18px; - height: 18px; - } - - .homework-checkbox:checked::after { - font-size: 12px; - } - - .table-row.user-completed { - opacity: 0.7; - } -} - -.filter-content { - display: grid; - grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); - gap: 16px; -} - -.filter-group { - display: flex; - flex-direction: column; - gap: 8px; -} - -.filter-group label { - display: flex; - align-items: center; - gap: 8px; - color: var(--text-secondary); - font-size: 14px; -} - -.filter-group select, -.filter-group input { - padding: 10px; - border: none; - border-radius: 8px; - background: var(--button-secondaryFill); - color: var(--text-primary); - font-family: inherit; - font-size: 14px; - transition: all 0.2s ease; -} - -.filter-group select:focus, -.filter-group input:focus { - outline: none; - box-shadow: 0 0 0 2px var(--accent-accent); -} - -.filter-actions { - display: flex; - justify-content: flex-end; - gap: 1rem; - margin-top: 1rem; -} - -.filter-button { - padding: 0.5rem 1rem; - border-radius: 8px; - border: none; - font-family: inherit; - font-weight: 500; - cursor: pointer; - transition: all 0.2s ease; -} - -.filter-button.primary { - background-color: var(--accent-accent); - color: white; -} - -.filter-button.secondary { - background-color: var(--accent-15); - color: var(--text-primary); -} - -.filter-button:hover { - opacity: 0.9; -} - -.stats-overview { - display: grid; - grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); - gap: 16px; - margin-bottom: 24px; -} - -.stat-card { - background: var(--card-card); - border-radius: 16px; - padding: 20px; - text-align: center; - box-shadow: 0px 1px var(--shadow-blur) 0px var(--accent-shadow); - transition: transform 0.2s ease; -} - -.stat-card:hover { - transform: translateY(-2px); -} - -.stat-number { - font-size: 32px; - font-weight: 700; - color: var(--accent-accent); - margin-bottom: 8px; -} - -.stat-label { - font-size: 14px; - color: var(--text-secondary); - font-weight: 500; -} - -.stat-card.urgent .stat-number { - color: #ff4757; -} - -.stat-card.completed .stat-number { - color: #2ed573; -} - -.homework-container { - background: var(--card-card); - border-radius: 24px; - overflow: hidden; - box-shadow: 0px 1px var(--shadow-blur) 0px var(--accent-shadow); -} - -.homework-table { - width: 100%; - border-collapse: collapse; -} - -.table-header { - background: var(--accent-15); - font-weight: 600; - color: var(--text-primary); -} - -.table-header th { - padding: 16px; - text-align: left; - font-size: 14px; - border-bottom: 1px solid var(--accent-15); -} - -.table-row { - border-bottom: 1px solid var(--accent-15); - transition: background-color 0.2s ease; -} - -.table-row:hover { - background-color: var(--accent-15); -} - -.table-row.due-tomorrow { - background-color: rgba(255, 71, 87, 0.1); -} - -.table-row.due-tomorrow:hover { - background-color: rgba(255, 71, 87, 0.2); -} - -.table-cell { - padding: 16px; - vertical-align: top; - border-bottom: 1px solid var(--accent-15); -} - -.date-cell { - font-weight: 600; - color: var(--text-primary); - min-width: 120px; -} - -.subject-cell { - font-weight: 500; - color: var(--accent-accent); - min-width: 120px; -} - -.description-cell { - max-width: 300px; - word-wrap: break-word; - line-height: 1.4; -} - -.teacher-cell { - color: var(--text-secondary); - font-style: italic; - min-width: 120px; -} - -.status-cell { - text-align: center; - min-width: 100px; -} - -.status-badge { - padding: 4px 12px; - border-radius: 12px; - font-size: 12px; - font-weight: 500; - text-transform: uppercase; -} - -.status-badge.pending { - background-color: rgba(255, 193, 7, 0.2); - color: #ffc107; -} - -.status-badge.urgent { - background-color: rgba(255, 71, 87, 0.2); - color: #ff4757; -} - -.status-badge.completed { - background-color: rgba(46, 213, 115, 0.2); - color: #2ed573; -} - -.homework-list-items { - padding: 16px; - display: flex; - flex-direction: column; - gap: 12px; -} - -.date-header h3 { - font-size: 16px; - font-weight: 600; - color: var(--text-primary); - margin: 0; -} - -.homework-item { - display: flex; - flex-direction: column; - gap: 8px; - padding: 12px; - margin: 0 16px 12px 16px; - background: var(--accent-15); - border-radius: 12px; - transition: transform 0.2s ease; -} - -.homework-item:hover { - transform: translateX(4px); -} - -.homework-item.due-tomorrow { - background: var(--accent-accent); - color: white; -} - -.homework-item.due-tomorrow .homework-subject, -.homework-item.due-tomorrow .homework-content, -.homework-item.due-tomorrow .homework-teacher { - color: white; -} - -.homework-details { - display: flex; - flex-direction: column; - gap: 4px; -} - -.homework-subject { - font-weight: 600; - font-size: 16px; - color: var(--text-primary); - margin-bottom: 4px; -} - -.homework-content { - color: var(--text-primary); - font-size: 14px; - margin-bottom: 8px; - line-height: 1.4; - word-wrap: break-word; - overflow-wrap: break-word; - white-space: pre-wrap; -} - -.homework-teacher { - color: var(--text-secondary); - font-size: 12px; - font-style: italic; -} - - - -.empty-state { - text-align: center; - padding: 2rem; - color: var(--text-secondary); - display: none; - background: var(--card-card); - border-radius: 24px; - box-shadow: 0px 1px var(--shadow-blur) 0px var(--accent-shadow); -} - -.empty-state p { - margin-bottom: 1rem; - font-size: 16px; -} - - -@media (max-width: 768px) { - .filter-content { - grid-template-columns: 1fr; - } - - .homework-header { - flex-direction: column; - gap: 0.25rem; - } - - .stats-overview { - grid-template-columns: repeat(2, 1fr); - } - - .table-cell { - padding: 12px; - font-size: 14px; - } - - .description-cell { - max-width: 200px; - } -} - -@media (max-width: 480px) { - .homework-container { - overflow-x: hidden; - } - - .homework-table, - .table-header, - .table-row, - .table-cell { - display: block; - } - - .table-header { - display: none; - } - - .date-group { - margin-bottom: 24px; - } - - .date-group-header { - background: var(--accent-accent); - color: white; - padding: 12px 16px; - font-weight: 600; - font-size: 16px; - border-radius: 12px 12px 0 0; - margin-bottom: 0; - } - - .date-group-content { - background: var(--card-card); - border: 1px solid var(--accent-15); - border-radius: 0 0 12px 12px; - overflow: hidden; - } - - .table-row { - display: block; - width: 100%; - margin-bottom: 0; - padding: 16px; - border-bottom: 1px solid var(--accent-15); - background: var(--card-card); - } - - .table-row:last-child { - border-bottom: none; - } - - .table-cell { - display: flex; - justify-content: space-between; - align-items: flex-start; - padding: 8px 0; - border-bottom: 1px solid var(--accent-15); - } - - .table-cell:last-child { - border-bottom: none; - } - - .table-cell::before { - content: attr(data-label); - font-weight: 600; - color: var(--text-secondary); - font-size: 12px; - text-transform: uppercase; - flex-shrink: 0; - } - - .description-cell { - max-width: none; - white-space: normal; - text-overflow: initial; - overflow: visible; - text-align: right; - flex: 1; - } - - .stats-overview { - grid-template-columns: 1fr; - } -} - -@keyframes fadeIn { - from { - opacity: 0; - transform: translateY(-10px); - } - to { - opacity: 1; - transform: translateY(0); - } -} - -@keyframes dropdownShow { - from { - opacity: 0; - transform: translateY(-10px); - } - to { - opacity: 1; - transform: translateY(0); - } -} - -@keyframes spin { - to { transform: rotate(360deg); } -} - -::-webkit-scrollbar { - width: clamp(4px, 1vw, 8px); - height: clamp(4px, 1vw, 8px); -} - -::-webkit-scrollbar-track { - background: var(--background); -} - -::-webkit-scrollbar-thumb { - background: var(--text-secondary); - border-radius: 4px; -} - -::-webkit-scrollbar-thumb:hover { - background: var(--text-primary); -} \ No newline at end of file diff --git a/homework/homework.js b/homework/homework.js deleted file mode 100644 index 135f832..0000000 --- a/homework/homework.js +++ /dev/null @@ -1,712 +0,0 @@ -async function fetchHomeworkData() { - try { - const currentDomain = window.location.hostname; - const apiUrl = `https://${currentDomain}/api/TanuloHaziFeladatApi/GetTanulotHaziFeladatGrid?sort=HaziFeladatHatarido-asc&page=1&pageSize=100&group=&filter=&data=%7B%22RegiHaziFeladatokElrejtese%22%3Afalse%7D&_=${Date.now()}`; - - const response = await fetch(apiUrl, { - method: "GET", - credentials: "include", - headers: { - Accept: "application/json", - "Content-Type": "application/json", - }, - }); - - if (!response.ok) { - throw new Error("Network response was not ok"); - } - - const data = await response.json(); - return data; - } catch (error) { - console.error("Error fetching homework data:", error); - return { Data: [], Total: 0 }; - } -} - -async function collectHomeworkData() { - const apiData = await fetchHomeworkData(); - - const basicData = { - schoolInfo: { - name: await storageManager.get("schoolName", "OM azonosító - Iskola neve"), - id: await storageManager.get("schoolCode", ""), - }, - userData: { - name: await storageManager.get("userName", "Felhasználónév"), - time: - document.querySelector(".usermenu_timer")?.textContent?.trim() || - "45:00", - }, - }; - - const homeworkItems = []; - - if (apiData.Data && Array.isArray(apiData.Data)) { - apiData.Data.forEach((item) => { - homeworkItems.push({ - id: item.ID, - subject: item.TantargyNev || "", - teacher: item.TanarNeve || "", - description: item.HaziFeladatSzoveg || "", - createdDate: formatApiDate(item.HaziFeladatRogzitesDatuma), - deadline: formatApiDate(item.HaziFeladatHatarido), - completed: item.MegoldottHF_BOOL || false, - classGroup: item.OsztalyCsoport || "", - }); - }); - } - - const groupedHomework = {}; - homeworkItems.forEach((homework) => { - const deadlineDate = homework.deadline.split(" ")[0]; - if (!groupedHomework[deadlineDate]) { - groupedHomework[deadlineDate] = []; - } - groupedHomework[deadlineDate].push(homework); - }); - - return { basicData, homeworkItems, groupedHomework }; -} - -function formatApiDate(dateString) { - if (!dateString) return ""; - - try { - const date = new Date(dateString); - const month = String(date.getMonth() + 1).padStart(2, "0"); - const day = String(date.getDate()).padStart(2, "0"); - - const dayNames = [ - LanguageManager.t("common.sunday"), - LanguageManager.t("common.monday"), - LanguageManager.t("common.tuesday"), - LanguageManager.t("common.wednesday"), - LanguageManager.t("common.thursday"), - LanguageManager.t("common.friday"), - LanguageManager.t("common.saturday"), - ]; - const dayName = dayNames[date.getDay()]; - - return `${month}.${day}. (${dayName})`; - } catch (error) { - return dateString; - } -} - -function isTomorrow(dateStr) { - if (!dateStr) return false; - - const parts = dateStr.split("."); - if (parts.length < 3) return false; - - const year = parseInt(parts[0].trim()); - const month = parseInt(parts[1].trim()) - 1; - const day = parseInt(parts[2].trim()); - - const homeworkDate = new Date(year, month, day); - - const tomorrow = new Date(); - tomorrow.setDate(tomorrow.getDate() + 1); - tomorrow.setHours(0, 0, 0, 0); - - const dayAfterTomorrow = new Date(tomorrow); - dayAfterTomorrow.setDate(dayAfterTomorrow.getDate() + 1); - - return homeworkDate >= tomorrow && homeworkDate < dayAfterTomorrow; -} - -async function transformHomeworkPage() { - const { basicData, homeworkItems, groupedHomework } = - await collectHomeworkData(); - document.body.innerHTML = ''; - const kretaContainer = document.createElement('div'); - kretaContainer.className = 'kreta-container'; - const headerDiv = document.createElement('div'); - const parser = new DOMParser(); - const headerDoc = parser.parseFromString(await createTemplate.header(), 'text/html'); - const headerContent = headerDoc.body; - while (headerContent.firstChild) { - headerDiv.appendChild(headerContent.firstChild); - } - kretaContainer.appendChild(headerDiv); - const main = document.createElement('main'); - main.className = 'kreta-main'; - - const filterCard = document.createElement('div'); - filterCard.className = 'filter-card'; - - const filterHeader = document.createElement('div'); - filterHeader.className = 'filter-header'; - const filterTitle = document.createElement('h2'); - filterTitle.textContent = LanguageManager.t('homework.filter_title'); - filterHeader.appendChild(filterTitle); - - const filterContent = document.createElement('div'); - filterContent.className = 'filter-content'; - - const subjectGroup = document.createElement('div'); - subjectGroup.className = 'filter-group'; - const subjectLabel = document.createElement('label'); - subjectLabel.textContent = LanguageManager.t('homework.subject'); - const subjectSelect = document.createElement('select'); - subjectSelect.id = 'subjectFilter'; - - const allSubjectsOption = document.createElement('option'); - allSubjectsOption.value = ''; - allSubjectsOption.textContent = LanguageManager.t('homework.all_subjects'); - subjectSelect.appendChild(allSubjectsOption); - - [...new Set(homeworkItems.map((item) => item.subject))] - .sort() - .forEach((subject) => { - const option = document.createElement('option'); - option.value = subject; - option.textContent = subject; - subjectSelect.appendChild(option); - }); - - subjectGroup.appendChild(subjectLabel); - subjectGroup.appendChild(subjectSelect); - - const teacherGroup = document.createElement('div'); - teacherGroup.className = 'filter-group'; - const teacherLabel = document.createElement('label'); - teacherLabel.textContent = LanguageManager.t('homework.teacher'); - const teacherSelect = document.createElement('select'); - teacherSelect.id = 'teacherFilter'; - - const allTeachersOption = document.createElement('option'); - allTeachersOption.value = ''; - allTeachersOption.textContent = LanguageManager.t('homework.all_teachers'); - teacherSelect.appendChild(allTeachersOption); - - [...new Set(homeworkItems.map((item) => item.teacher))] - .sort() - .forEach((teacher) => { - const option = document.createElement('option'); - option.value = teacher; - option.textContent = teacher; - teacherSelect.appendChild(option); - }); - - teacherGroup.appendChild(teacherLabel); - teacherGroup.appendChild(teacherSelect); - - const deadlineGroup = document.createElement('div'); - deadlineGroup.className = 'filter-group'; - const deadlineLabel = document.createElement('label'); - deadlineLabel.textContent = LanguageManager.t('homework.due_date'); - const deadlineSelect = document.createElement('select'); - deadlineSelect.id = 'deadlineFilter'; - - const deadlineOptions = [ - { value: '', text: LanguageManager.t('homework.all_deadlines') }, - { value: 'tomorrow', text: LanguageManager.t('homework.tomorrow_deadline') }, - { value: 'thisWeek', text: LanguageManager.t('homework.this_week') }, - { value: 'nextWeek', text: LanguageManager.t('homework.next_week') } - ]; - - deadlineOptions.forEach(({ value, text }) => { - const option = document.createElement('option'); - option.value = value; - option.textContent = text; - deadlineSelect.appendChild(option); - }); - - deadlineGroup.appendChild(deadlineLabel); - deadlineGroup.appendChild(deadlineSelect); - - filterContent.appendChild(subjectGroup); - filterContent.appendChild(teacherGroup); - filterContent.appendChild(deadlineGroup); - - filterCard.appendChild(filterHeader); - filterCard.appendChild(filterContent); - - const statsOverview = document.createElement('div'); - statsOverview.className = 'stats-overview'; - statsOverview.id = 'statsOverview'; - - const statCards = [ - { id: 'totalHomework', label: LanguageManager.t('homework.total_homework'), className: '' }, - { id: 'urgentHomework', label: LanguageManager.t('homework.urgent_homework'), className: 'urgent' }, - { id: 'completedHomework', label: LanguageManager.t('homework.completed_homework'), className: 'completed' }, - { id: 'pendingHomework', label: LanguageManager.t('homework.pending_homework'), className: '' } - ]; - - statCards.forEach(({ id, label, className }) => { - const statCard = document.createElement('div'); - statCard.className = `stat-card ${className}`.trim(); - - const statNumber = document.createElement('div'); - statNumber.className = 'stat-number'; - statNumber.id = id; - statNumber.textContent = '0'; - - const statLabel = document.createElement('div'); - statLabel.className = 'stat-label'; - statLabel.textContent = label; - - statCard.appendChild(statNumber); - statCard.appendChild(statLabel); - statsOverview.appendChild(statCard); - }); - - const homeworkContainer = document.createElement('div'); - homeworkContainer.className = 'homework-container'; - - const homeworkTable = document.createElement('table'); - homeworkTable.className = 'homework-table'; - homeworkTable.id = 'homeworkTable'; - - const thead = document.createElement('thead'); - thead.className = 'table-header'; - const headerRow = document.createElement('tr'); - - const headers = [ - '✓', - LanguageManager.t('homework.due_date'), - LanguageManager.t('homework.subject'), - LanguageManager.t('homework.description'), - LanguageManager.t('homework.teacher'), - LanguageManager.t('homework.status') - ]; - - headers.forEach((headerText, index) => { - const th = document.createElement('th'); - th.textContent = headerText; - if (index === 0) { - th.className = 'checkbox-header'; - } - headerRow.appendChild(th); - }); - - thead.appendChild(headerRow); - - const tbody = document.createElement('tbody'); - tbody.id = 'homeworkTableBody'; - const homeworkHTML = generateHomeworkHTML(homeworkItems); - - if (homeworkHTML.trim()) { - const parser = new DOMParser(); - const doc = parser.parseFromString(`