diff --git a/icons/online.svg b/icons/online.svg new file mode 100644 index 0000000..5dd255e --- /dev/null +++ b/icons/online.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/timetable/timetable.js b/timetable/timetable.js index 5707a9c..15b3104 100644 --- a/timetable/timetable.js +++ b/timetable/timetable.js @@ -313,7 +313,16 @@ } } - async function loadTestDetailsFromAPI(testId) { + let cachedTestData = null; + let testDataTimestamp = 0; + const TEST_DATA_CACHE_DURATION = 60000; + + async function loadAllTestDataFromAPI() { + const now = Date.now(); + if (cachedTestData && (now - testDataTimestamp) < TEST_DATA_CACHE_DURATION) { + return cachedTestData; + } + try { const timestamp = Date.now(); const apiUrl = `https://${window.location.hostname}/api/TanuloBejelentettSzamonkeresekApi/GetBejelentettSzamonkeresekGrid?sort=SzamonkeresDatuma-asc~Oraszam-asc&page=1&pageSize=1000&group=&filter=&data=%7B%22RegiSzamonkeresekElrejtese%22%3Afalse%7D&_=${timestamp}`; @@ -327,15 +336,30 @@ }); if (!response.ok) { - throw new Error( - `Számonkérés API hiba: ${response.status}`, - ); + throw new Error(`Számonkérés API hiba: ${response.status}`); } const data = await response.json(); - const testData = data.Data || []; + cachedTestData = data.Data || []; + testDataTimestamp = now; + return cachedTestData; + } catch (error) { + console.error("Számonkérés adatok betöltési hiba:", error); + return []; + } + } + + async function getTestTypeById(testId) { + const testData = await loadAllTestDataFromAPI(); + const testDetail = testData.find(test => test.ID === testId.toString()); + return testDetail ? testDetail.ErtekelesModNev : null; + } + + async function loadTestDetailsFromAPI(testId) { + try { + const testData = await loadAllTestDataFromAPI(); const testDetail = testData.find(test => test.ID === testId.toString()); - + if (testDetail) { return { name: testDetail.SzamonkeresMegnevezes || 'Nincs megnevezés', @@ -343,7 +367,7 @@ announceDate: testDetail.BejelentesDatuma ? new Date(testDetail.BejelentesDatuma).toLocaleDateString('hu-HU') : 'Nincs dátum' }; } - + return null; } catch (error) { console.error("Számonkérés adatok betöltési hiba:", error); @@ -499,6 +523,15 @@ } } + const testTypeMap = {}; + const lessonsWithTests = lessons.filter(l => l.testId); + if (lessonsWithTests.length > 0) { + await loadAllTestDataFromAPI(); + for (const lesson of lessonsWithTests) { + testTypeMap[lesson.testId] = await getTestTypeById(lesson.testId); + } + } + const times = [...new Set(regularLessons.map((l) => l.startTime))].sort( (a, b) => { const timeA = helper.convertTimeToMinutes(a); @@ -620,11 +653,21 @@ } ${ lesson.testInfo - ? ` - - Teszt + ? (() => { + const testType = lesson.testId ? testTypeMap[lesson.testId] : null; + if (testType === "KONTAKT ÓRA") { + return ""; + } + const isProjektOra = testType === "PROJEKT ÓRA"; + const indicatorClass = isProjektOra ? "homework-indicator" : "test-indicator"; + const iconPath = isProjektOra ? "icons/online.svg" : "icons/assigment.svg"; + const titleText = isProjektOra ? "Online óra" : LanguageManager.t("timetable.test_indicator"); + return ` + + ${isProjektOra ? 'Online óra' : 'Teszt'} - ` + `; + })() : "" } ${ @@ -1202,206 +1245,201 @@ } if (lesson.testInfo) { - const testSection = document.createElement('div'); - testSection.className = 'modal-section test-section'; - - const testH4 = document.createElement('h4'); - const testIcon = document.createElement('img'); - testIcon.src = chrome.runtime.getURL('icons/assigment.svg'); - testIcon.alt = 'Teszt'; - testIcon.style.width = '20px'; - testIcon.style.height = '20px'; - testH4.appendChild(testIcon); - testH4.appendChild(document.createTextNode(LanguageManager.t('timetable.test_indicator'))); - - const testContent = document.createElement('div'); - testContent.className = 'test-content'; - + let testDetails = null; if (lesson.testId) { - const loadingDiv = document.createElement('div'); - loadingDiv.className = 'test-details-loading'; - loadingDiv.textContent = 'Részletek betöltése...'; - testContent.appendChild(loadingDiv); + testDetails = await loadTestDetailsFromAPI(lesson.testId); + } + + const isKontaktOra = testDetails && testDetails.type === "KONTAKT ÓRA"; + const isProjektOra = testDetails && testDetails.type === "PROJEKT ÓRA"; - loadTestDetailsFromAPI(lesson.testId).then(testDetails => { - loadingDiv.remove(); - - if (testDetails) { - const detailsDiv = document.createElement('div'); - detailsDiv.className = 'test-details'; - - const nameP = document.createElement('p'); - const nameStrong = document.createElement('strong'); - nameStrong.textContent = 'Megnevezés: '; - nameP.appendChild(nameStrong); - nameP.appendChild(document.createTextNode(testDetails.name)); - detailsDiv.appendChild(nameP); - - const typeP = document.createElement('p'); - const typeStrong = document.createElement('strong'); - typeStrong.textContent = 'Típus: '; - typeP.appendChild(typeStrong); - typeP.appendChild(document.createTextNode(testDetails.type)); - detailsDiv.appendChild(typeP); - - const dateP = document.createElement('p'); - const dateStrong = document.createElement('strong'); - dateStrong.textContent = 'Bejelentés dátuma: '; - dateP.appendChild(dateStrong); - dateP.appendChild(document.createTextNode(testDetails.announceDate)); - detailsDiv.appendChild(dateP); - - testContent.appendChild(detailsDiv); - } else { - const errorP = document.createElement('p'); - errorP.className = 'test-details-error'; - errorP.textContent = 'Nem sikerült betölteni a számonkérés részleteit.'; - testContent.appendChild(errorP); - } - }).catch(error => { - loadingDiv.remove(); + if (!isKontaktOra) { + const testSection = document.createElement('div'); + testSection.className = isProjektOra ? 'modal-section homework-section' : 'modal-section test-section'; + + const testH4 = document.createElement('h4'); + const testIcon = document.createElement('img'); + testIcon.src = chrome.runtime.getURL(isProjektOra ? 'icons/online.svg' : 'icons/assigment.svg'); + testIcon.alt = isProjektOra ? 'Online óra' : 'Teszt'; + testIcon.style.width = '20px'; + testIcon.style.height = '20px'; + testH4.appendChild(testIcon); + testH4.appendChild(document.createTextNode(isProjektOra ? 'Online óra' : LanguageManager.t('timetable.test_indicator'))); + if (isProjektOra) { + testH4.style.color = 'var(--accent-accent)'; + } + + const testContent = document.createElement('div'); + testContent.className = 'test-content'; + + if (testDetails) { + const detailsDiv = document.createElement('div'); + detailsDiv.className = 'test-details'; + + const nameP = document.createElement('p'); + const nameStrong = document.createElement('strong'); + nameStrong.textContent = 'Megnevezés: '; + nameP.appendChild(nameStrong); + nameP.appendChild(document.createTextNode(testDetails.name)); + detailsDiv.appendChild(nameP); + + const typeP = document.createElement('p'); + const typeStrong = document.createElement('strong'); + typeStrong.textContent = 'Típus: '; + typeP.appendChild(typeStrong); + typeP.appendChild(document.createTextNode(testDetails.type)); + detailsDiv.appendChild(typeP); + + const dateP = document.createElement('p'); + const dateStrong = document.createElement('strong'); + dateStrong.textContent = 'Bejelentés dátuma: '; + dateP.appendChild(dateStrong); + dateP.appendChild(document.createTextNode(testDetails.announceDate)); + detailsDiv.appendChild(dateP); + + testContent.appendChild(detailsDiv); + } else if (lesson.testId) { const errorP = document.createElement('p'); errorP.className = 'test-details-error'; - errorP.textContent = 'Hiba történt a számonkérés részletek betöltése során.'; + errorP.textContent = 'Nem sikerült betölteni a számonkérés részleteit.'; testContent.appendChild(errorP); - }); - } - - - const lessonKey = getLessonKey(lesson); - const customTests = await getCustomTests(); - const customTestItems = customTests[lessonKey] || []; - - if (customTestItems.length > 0) { - const customTestsDiv = document.createElement('div'); - customTestsDiv.className = 'custom-tests-in-section'; - customTestsDiv.style.marginTop = '1rem'; - customTestsDiv.style.paddingTop = '1rem'; - customTestsDiv.style.borderTop = '1px solid var(--background-0)'; - - const customTestsTitle = document.createElement('h5'); - customTestsTitle.textContent = 'Saját számonkérések:'; - customTestsTitle.style.fontSize = '14px'; - customTestsTitle.style.fontWeight = '600'; - customTestsTitle.style.color = 'var(--warning-accent)'; - customTestsTitle.style.marginBottom = '0.5rem'; - customTestsDiv.appendChild(customTestsTitle); - - const customTestsList = document.createElement('div'); - customTestsList.className = 'custom-tests-list-integrated'; - - customTestItems.forEach(test => { - const testItem = document.createElement('div'); - testItem.className = `custom-test-item-integrated ${test.completed ? 'completed' : ''}`; - testItem.style.display = 'flex'; - testItem.style.alignItems = 'center'; - testItem.style.justifyContent = 'space-between'; - testItem.style.padding = '0.5rem'; - testItem.style.marginBottom = '0.5rem'; - testItem.style.background = 'var(--background)'; - testItem.style.borderRadius = '6px'; - testItem.style.border = '1px solid var(--background-0)'; - - const testText = document.createElement('span'); - testText.className = 'test-text-integrated'; - testText.textContent = test.text; - testText.style.flex = '1'; - testText.style.color = 'var(--text-primary)'; - if (test.completed) { - testText.style.textDecoration = 'line-through'; - testText.style.opacity = '0.6'; - } - - const testActions = document.createElement('div'); - testActions.className = 'test-actions-integrated'; - testActions.style.display = 'flex'; - testActions.style.gap = '0.5rem'; - - const completeBtn = document.createElement('button'); - completeBtn.className = 'test-complete-btn-integrated'; - completeBtn.title = test.completed ? 'Megoldva - kattints a visszavonáshoz' : 'Megoldottként jelöl'; - completeBtn.style.background = 'none'; - completeBtn.style.border = 'none'; - completeBtn.style.cursor = 'pointer'; - completeBtn.style.padding = '4px'; - completeBtn.style.borderRadius = '4px'; - completeBtn.style.display = 'flex'; - completeBtn.style.alignItems = 'center'; - completeBtn.style.justifyContent = 'center'; - - const completeIcon = document.createElement('img'); - completeIcon.src = chrome.runtime.getURL('icons/pipa.svg'); - completeIcon.alt = 'Megoldva'; - completeIcon.style.width = '16px'; - completeIcon.style.height = '16px'; - if (test.completed) { - completeIcon.style.opacity = '1'; - completeBtn.style.background = 'var(--warning-accent)'; - } else { - completeIcon.style.opacity = '0.5'; - } - completeBtn.appendChild(completeIcon); - - const deleteBtn = document.createElement('button'); - deleteBtn.className = 'test-delete-btn-integrated'; - deleteBtn.title = 'Törlés'; - deleteBtn.style.background = 'none'; - deleteBtn.style.border = 'none'; - deleteBtn.style.cursor = 'pointer'; - deleteBtn.style.padding = '4px'; - deleteBtn.style.borderRadius = '4px'; - deleteBtn.style.display = 'flex'; - deleteBtn.style.alignItems = 'center'; - deleteBtn.style.justifyContent = 'center'; - - const deleteIcon = document.createElement('img'); - deleteIcon.src = chrome.runtime.getURL('icons/delete.svg'); - deleteIcon.alt = 'Törlés'; - deleteIcon.style.width = '16px'; - deleteIcon.style.height = '16px'; - deleteIcon.style.opacity = '0.5'; - deleteBtn.appendChild(deleteIcon); - - completeBtn.addEventListener('click', async () => { - const newCompleted = await toggleCustomTestCompletion(lessonKey, test.id); - if (newCompleted) { + } + + const lessonKey = getLessonKey(lesson); + const customTests = await getCustomTests(); + const customTestItems = customTests[lessonKey] || []; + + if (customTestItems.length > 0) { + const customTestsDiv = document.createElement('div'); + customTestsDiv.className = 'custom-tests-in-section'; + customTestsDiv.style.marginTop = '1rem'; + customTestsDiv.style.paddingTop = '1rem'; + customTestsDiv.style.borderTop = '1px solid var(--background-0)'; + + const customTestsTitle = document.createElement('h5'); + customTestsTitle.textContent = 'Saját számonkérések:'; + customTestsTitle.style.fontSize = '14px'; + customTestsTitle.style.fontWeight = '600'; + customTestsTitle.style.color = 'var(--warning-accent)'; + customTestsTitle.style.marginBottom = '0.5rem'; + customTestsDiv.appendChild(customTestsTitle); + + const customTestsList = document.createElement('div'); + customTestsList.className = 'custom-tests-list-integrated'; + + customTestItems.forEach(test => { + const testItem = document.createElement('div'); + testItem.className = `custom-test-item-integrated ${test.completed ? 'completed' : ''}`; + testItem.style.display = 'flex'; + testItem.style.alignItems = 'center'; + testItem.style.justifyContent = 'space-between'; + testItem.style.padding = '0.5rem'; + testItem.style.marginBottom = '0.5rem'; + testItem.style.background = 'var(--background)'; + testItem.style.borderRadius = '6px'; + testItem.style.border = '1px solid var(--background-0)'; + + const testText = document.createElement('span'); + testText.className = 'test-text-integrated'; + testText.textContent = test.text; + testText.style.flex = '1'; + testText.style.color = 'var(--text-primary)'; + if (test.completed) { testText.style.textDecoration = 'line-through'; testText.style.opacity = '0.6'; + } + + const testActions = document.createElement('div'); + testActions.className = 'test-actions-integrated'; + testActions.style.display = 'flex'; + testActions.style.gap = '0.5rem'; + + const completeBtn = document.createElement('button'); + completeBtn.className = 'test-complete-btn-integrated'; + completeBtn.title = test.completed ? 'Megoldva - kattints a visszavonáshoz' : 'Megoldottként jelöl'; + completeBtn.style.background = 'none'; + completeBtn.style.border = 'none'; + completeBtn.style.cursor = 'pointer'; + completeBtn.style.padding = '4px'; + completeBtn.style.borderRadius = '4px'; + completeBtn.style.display = 'flex'; + completeBtn.style.alignItems = 'center'; + completeBtn.style.justifyContent = 'center'; + + const completeIcon = document.createElement('img'); + completeIcon.src = chrome.runtime.getURL('icons/pipa.svg'); + completeIcon.alt = 'Megoldva'; + completeIcon.style.width = '16px'; + completeIcon.style.height = '16px'; + if (test.completed) { completeIcon.style.opacity = '1'; completeBtn.style.background = 'var(--warning-accent)'; - completeBtn.title = 'Megoldva - kattints a visszavonáshoz'; } else { - testText.style.textDecoration = 'none'; - testText.style.opacity = '1'; completeIcon.style.opacity = '0.5'; - completeBtn.style.background = 'none'; - completeBtn.title = 'Megoldottként jelöl'; } + completeBtn.appendChild(completeIcon); + + const deleteBtn = document.createElement('button'); + deleteBtn.className = 'test-delete-btn-integrated'; + deleteBtn.title = 'Törlés'; + deleteBtn.style.background = 'none'; + deleteBtn.style.border = 'none'; + deleteBtn.style.cursor = 'pointer'; + deleteBtn.style.padding = '4px'; + deleteBtn.style.borderRadius = '4px'; + deleteBtn.style.display = 'flex'; + deleteBtn.style.alignItems = 'center'; + deleteBtn.style.justifyContent = 'center'; + + const deleteIcon = document.createElement('img'); + deleteIcon.src = chrome.runtime.getURL('icons/delete.svg'); + deleteIcon.alt = 'Törlés'; + deleteIcon.style.width = '16px'; + deleteIcon.style.height = '16px'; + deleteIcon.style.opacity = '0.5'; + deleteBtn.appendChild(deleteIcon); + + completeBtn.addEventListener('click', async () => { + const newCompleted = await toggleCustomTestCompletion(lessonKey, test.id); + if (newCompleted) { + testText.style.textDecoration = 'line-through'; + testText.style.opacity = '0.6'; + completeIcon.style.opacity = '1'; + completeBtn.style.background = 'var(--warning-accent)'; + completeBtn.title = 'Megoldva - kattints a visszavonáshoz'; + } else { + testText.style.textDecoration = 'none'; + testText.style.opacity = '1'; + completeIcon.style.opacity = '0.5'; + completeBtn.style.background = 'none'; + completeBtn.title = 'Megoldottként jelöl'; + } + }); + + deleteBtn.addEventListener('click', async () => { + if (confirm('Biztosan törölni szeretnéd ezt a számonkérést?')) { + await removeCustomTest(lessonKey, test.id); + testItem.remove(); + } + }); + + testActions.appendChild(completeBtn); + testActions.appendChild(deleteBtn); + testItem.appendChild(testText); + testItem.appendChild(testActions); + customTestsList.appendChild(testItem); }); - - deleteBtn.addEventListener('click', async () => { - if (confirm('Biztosan törölni szeretnéd ezt a számonkérést?')) { - await removeCustomTest(lessonKey, test.id); - testItem.remove(); - } - }); - - testActions.appendChild(completeBtn); - testActions.appendChild(deleteBtn); - testItem.appendChild(testText); - testItem.appendChild(testActions); - customTestsList.appendChild(testItem); - }); - - customTestsDiv.appendChild(customTestsList); - testContent.appendChild(customTestsDiv); + + customTestsDiv.appendChild(customTestsList); + testContent.appendChild(customTestsDiv); + } + + testSection.appendChild(testH4); + testSection.appendChild(testContent); + body.appendChild(testSection); } - - testSection.appendChild(testH4); - testSection.appendChild(testContent); - body.appendChild(testSection); } - + const lessonKey = getLessonKey(lesson); const customHomework = await getCustomHomework();