diff --git a/dashboard/dashboard.css b/dashboard/dashboard.css index 8906752..f07764e 100644 --- a/dashboard/dashboard.css +++ b/dashboard/dashboard.css @@ -37,6 +37,8 @@ h2 { display: grid; grid-template-columns: repeat(auto-fit, minmax(min(100%, 300px), 1fr)); gap: 20px; + justify-content: center; + justify-items: center; } .widget-card { @@ -50,6 +52,7 @@ h2 { height: 100%; border: none; min-height: 400px; + width: 100%; } .widget-header { @@ -222,7 +225,6 @@ h2 { max-width: 200px; } -/* Mobile view: author below content */ @media (max-width: 768px) { .news-item .widget-row { flex-direction: column; @@ -257,7 +259,6 @@ h2 { } } -/* Desktop view: limit author width and wrap text */ @media (min-width: 769px) { .news-author { max-width: 180px; diff --git a/dashboard/dashboard.js b/dashboard/dashboard.js index ebdda5e..5631c24 100644 --- a/dashboard/dashboard.js +++ b/dashboard/dashboard.js @@ -291,8 +291,9 @@ class DashboardDataManager { } class DashboardRenderer { - constructor(data) { + constructor(data, settings = {}) { this.baseData = data; + this.settings = settings; } async init() { @@ -315,14 +316,31 @@ class DashboardRenderer { } generateMainContent() { + const cards = []; + + if (!this.settings.hideGrades) { + cards.push(this.createGradeCard()); + } + if (!this.settings.hideAbsences) { + cards.push(this.createAbsenceCard()); + } + if (!this.settings.hideNotes) { + cards.push(this.createNoteCard()); + } + if (!this.settings.hideExams) { + cards.push(this.createExamCard()); + } + + cards.push(this.createNewsCard()); + + if (cards.length === 1) { + cards.unshift(this.createGradeCard()); + } + return `
- ${this.createGradeCard()} - ${this.createAbsenceCard()} - ${this.createNoteCard()} - ${this.createExamCard()} - ${this.createNewsCard()} + ${cards.join('')}
`; @@ -513,6 +531,26 @@ class DashboardApplication { this.init(); } + async loadBulletinSettings() { + try { + const settings = await storageManager.get("pageSettings_bulletin", {}); + return { + hideGrades: settings.hideGrades || false, + hideAbsences: settings.hideAbsences || false, + hideNotes: settings.hideNotes || false, + hideExams: settings.hideExams || false + }; + } catch (error) { + console.error("Error loading bulletin settings:", error); + return { + hideGrades: false, + hideAbsences: false, + hideNotes: false, + hideExams: false + }; + } + } + async init() { if (!window.location.href.includes("/Intezmeny/Faliujsag")) { return; @@ -575,8 +613,9 @@ class DashboardApplication { try { const dataManager = new DashboardDataManager(); const dashboardData = await dataManager.extractAllData(); + const bulletinSettings = await this.loadBulletinSettings(); - const renderer = new DashboardRenderer(dashboardData); + const renderer = new DashboardRenderer(dashboardData, bulletinSettings); await renderer.render(); } catch (error) { console.error("Error initializing dashboard:", error); diff --git a/grades/grades.css b/grades/grades.css index 564d8a6..6efbb8b 100644 --- a/grades/grades.css +++ b/grades/grades.css @@ -458,6 +458,9 @@ to { gap:1rem; padding:1rem; } +.grade-distribution.centered { + justify-content:center; +} .grade-count { display:flex; align-items:center; diff --git a/grades/grades.js b/grades/grades.js index a54100d..b9029f8 100644 --- a/grades/grades.js +++ b/grades/grades.js @@ -1,6 +1,25 @@ (() => { + let gradesSettings = { + hideChart: false, + hideClassAverage: false + }; + + async function loadGradesSettings() { + try { + const settings = await storageManager.get("pageSettings_grades", {}); + gradesSettings = { + hideChart: settings.hideChart || false, + hideClassAverage: settings.hideClassAverage || false + }; + } catch (error) { + console.error("Error loading grades settings:", error); + } + } + async function transformGradesPage() { try { + await loadGradesSettings(); + const tanuloIdElement = document.querySelector("#TanuloId"); const tanuloId = tanuloIdElement ? tanuloIdElement.value : "772481"; @@ -24,13 +43,15 @@ setupUserDropdown(); - const script = document.createElement("script"); - script.src = chrome.runtime.getURL("grades/chart.js"); - document.head.appendChild(script); + if (!gradesSettings.hideChart) { + const script = document.createElement("script"); + script.src = chrome.runtime.getURL("grades/chart.js"); + document.head.appendChild(script); - script.onload = () => { - setupGradesChart(gradesData.subjects); - }; + script.onload = () => { + setupGradesChart(gradesData.subjects); + }; + } setupEventListeners(); setupGradesListScrolling(); @@ -390,12 +411,16 @@ schoolNameFull = `${data.schoolInfo.id} - ${data.schoolInfo.name}`; shortenedSchoolName = helper.shortenSchoolName(schoolNameFull); + const showClassAverage = !gradesSettings.hideClassAverage && classAverage > 0; + const showChart = !gradesSettings.hideChart; + return `
${await createTemplate.header()}
+ ${showChart ? `
${LanguageManager.t("grades.chart_title")} (${totalGrades}db)
@@ -404,7 +429,7 @@ ${studentAverage > 0 ? studentAverage.toFixed(2) : "-"}
${ - classAverage > 0 + showClassAverage ? `
${classAverage.toFixed(2)} @@ -430,6 +455,39 @@ .join("")}
+ ` : ` +
+
+
${LanguageManager.t("grades.chart_title")} (${totalGrades}db)
+
+
+ ${studentAverage > 0 ? studentAverage.toFixed(2) : "-"} +
+ ${ + showClassAverage + ? ` +
+ ${classAverage.toFixed(2)} +
+ ` + : "" + } +
+
+
+ ${Object.entries(gradeDistribution) + .map( + ([grade, count]) => ` +
+ ${grade} + ${count} +
+ `, + ) + .join("")} +
+
+ `} ${ yearEndGrades.length > 0 ? ` @@ -635,6 +693,7 @@ .reverse(); const myGrade = Math.floor(subject.average) || 0; const classGrade = Math.floor(subject.classAverage) || 0; + const showClassAvg = !gradesSettings.hideClassAverage && subject.classAverage > 0; return `
@@ -647,7 +706,7 @@ ${subject.average > 0 ? subject.average.toFixed(2) : "-"}
${ - subject.classAverage > 0 + showClassAvg ? `
${subject.classAverage.toFixed(2)} diff --git a/i18n/en.json b/i18n/en.json index dfce616..808b789 100644 --- a/i18n/en.json +++ b/i18n/en.json @@ -5,8 +5,47 @@ }, "settings": { "title": "Settings", + "appearance": "Appearance", "theme": "Theme", "language": "Language", + "tabs": { + "home": "Home", + "settings": "Settings", + "about": "About" + }, + "page_settings": { + "title": "Page Settings", + "current_page": "Current page", + "no_settings": "No custom settings available for this page.", + "login": { + "hide_system_message": "Hide system message", + "hide_system_message_desc": "Hide the system message shown on the login page", + "hide_school_info": "Hide school name and ID", + "hide_school_info_desc": "The school name and KRÉTA ID will not be displayed" + }, + "roleselect": { + "auto_redirect": "Auto redirect", + "auto_redirect_desc": "Automatically redirect to the gradebook", + "hide_school_info": "Hide school and name", + "hide_school_info_desc": "The school name and user name will not be displayed" + }, + "bulletin": { + "hide_grades": "Hide grades", + "hide_grades_desc": "Hide the grades card", + "hide_absences": "Hide absences", + "hide_absences_desc": "Hide the absences card", + "hide_notes": "Hide notes", + "hide_notes_desc": "Hide the notes card", + "hide_exams": "Hide announced exams", + "hide_exams_desc": "Hide the announced exams card" + }, + "grades": { + "hide_chart": "Hide chart", + "hide_chart_desc": "Hide the grades chart", + "hide_class_average": "Hide class average", + "hide_class_average_desc": "Hide class average values" + } + }, "themes": { "light_green": "Light Green", "dark_green": "Dark Green", diff --git a/i18n/hu.json b/i18n/hu.json index 586bdc5..c678b7a 100644 --- a/i18n/hu.json +++ b/i18n/hu.json @@ -5,8 +5,47 @@ }, "settings": { "title": "Beállítások", + "appearance": "Megjelenés", "theme": "Téma", "language": "Nyelv", + "tabs": { + "home": "Főoldal", + "settings": "Beállítások", + "about": "Névjegy" + }, + "page_settings": { + "title": "Oldal beállítások", + "current_page": "Aktuális oldal", + "no_settings": "Ehhez az oldalhoz nincsenek egyéni beállítások.", + "login": { + "hide_system_message": "Rendszerüzenet elrejtése", + "hide_system_message_desc": "A bejelentkezési oldalon megjelenő rendszerüzenet elrejtése", + "hide_school_info": "Iskola nevének és azonosítójának elrejtése", + "hide_school_info_desc": "Az iskola neve és KRÉTA azonosítója nem jelenik meg" + }, + "roleselect": { + "auto_redirect": "Automatikus továbblépés", + "auto_redirect_desc": "Automatikusan átirányít az ellenőrzőkönyvre", + "hide_school_info": "Iskola és név elrejtése", + "hide_school_info_desc": "Az iskola neve és a felhasználó neve nem jelenik meg" + }, + "bulletin": { + "hide_grades": "Értékelések elrejtése", + "hide_grades_desc": "Az értékeléseid kártya elrejtése", + "hide_absences": "Mulasztások elrejtése", + "hide_absences_desc": "A mulasztások kártya elrejtése", + "hide_notes": "Feljegyzések elrejtése", + "hide_notes_desc": "A feljegyzések kártya elrejtése", + "hide_exams": "Bejelentett dolgozatok elrejtése", + "hide_exams_desc": "A bejelentett dolgozatok kártya elrejtése" + }, + "grades": { + "hide_chart": "Grafikon elrejtése", + "hide_chart_desc": "A jegyek grafikonjának elrejtése", + "hide_class_average": "Osztályátlag elrejtése", + "hide_class_average_desc": "Az osztályátlag értékek elrejtése" + } + }, "themes": { "light_blue": "Világos Kék", "light_green": "Világos Zöld", diff --git a/login/login.css b/login/login.css index 6d5c3f9..ebf9753 100644 --- a/login/login.css +++ b/login/login.css @@ -54,7 +54,6 @@ body { flex-direction:column; align-items:center; gap:8px; - margin:16px 0; background:var(--card-card) !important; border-bottom:1px solid rgba(0,0,0,0) !important; } @@ -66,6 +65,7 @@ body { font-style:normal; font-weight:700; line-height:normal; + margin-bottom: 12px; } .logo { width:48px; diff --git a/login/login.js b/login/login.js index 9777bee..044c925 100644 --- a/login/login.js +++ b/login/login.js @@ -14,6 +14,8 @@ async function transformLoginPage() { }); } + const loginSettings = await loadLoginSettings(); + const existingForm = document.querySelector("form"); const formData = { action: existingForm?.getAttribute("action") || "", @@ -58,11 +60,11 @@ async function transformLoginPage() { Firka

-

${schoolInfo.name}

+ ${!loginSettings.hideSchoolInfo ? `

${schoolInfo.name}

${schoolInfo.kretaId ? `
${schoolInfo.kretaId}
` : ""} ${schoolInfo.omCode ? `
${LanguageManager.t("login.kreta_id")}: ${schoolInfo.omCode}
` : ""} -
+
` : ''}
${ - systemMessage + systemMessage && !loginSettings.hideSystemMessage ? `

${LanguageManager.t("login.system_message")}

@@ -203,6 +205,28 @@ function handleSubmit(event) { form.submit(); } +async function loadLoginSettings() { + try { + const settings = await storageManager.get("pageSettings_login", {}); + return { + hideSystemMessage: settings.hideSystemMessage || false, + hideSchoolInfo: settings.hideSchoolInfo || false + }; + } catch (error) { + console.error("Error loading login settings:", error); + return { + hideSystemMessage: false, + hideSchoolInfo: false + }; + } +} + +chrome.runtime.onMessage.addListener((message, sender, sendResponse) => { + if (message.action === "pageSettingChanged" && message.pageType === "login") { + transformLoginPage(); + } +}); + if (window.location.href.includes("idp.e-kreta.hu/Account/Login")) { (async () => { while (typeof window.LanguageManager === "undefined") { diff --git a/manifest.json b/manifest.json index 1a580d1..987ff94 100644 --- a/manifest.json +++ b/manifest.json @@ -13,7 +13,8 @@ } }, "permissions": [ - "storage" + "storage", + "tabs" ], "background": { "service_worker": "tools/background.js" diff --git a/manifest_fox.json b/manifest_fox.json index 52e4d75..1943c0d 100644 --- a/manifest_fox.json +++ b/manifest_fox.json @@ -13,7 +13,8 @@ } }, "permissions": [ - "storage" + "storage", + "tabs" ], "background": { "service_worker": "tools/background.js", diff --git a/roleselect/roleselect.js b/roleselect/roleselect.js index 51c5356..38a6508 100644 --- a/roleselect/roleselect.js +++ b/roleselect/roleselect.js @@ -18,6 +18,25 @@ return setInterval(updateTimer, 1000); }; + async function loadRoleselectSettings() { + try { + const settings = await storageManager.get("pageSettings_roleselect", { + autoRedirect: false, + hideSchoolInfo: true + }); + return { + autoRedirect: settings.autoRedirect || false, + hideSchoolInfo: settings.hideSchoolInfo !== undefined ? settings.hideSchoolInfo : true + }; + } catch (error) { + console.error("Error loading roleselect settings:", error); + return { + autoRedirect: false, + hideSchoolInfo: true + }; + } + } + const handleRoleChange = async (role) => { try { const response = await fetch( @@ -41,7 +60,7 @@ } }; - const createHTML = (schoolCode, fullSchoolName, userName) => ` + const createHTML = (schoolCode, fullSchoolName, userName, settings) => `
@@ -49,15 +68,17 @@ Firka

-
+ ${!settings.hideSchoolInfo ? `
${schoolCode || ""} - ${fullSchoolName || "Iskola"} -
+
` : ''}
@@ -108,6 +129,12 @@ window.addEventListener("load", resolve), ); } + const settings = await loadRoleselectSettings(); + + if (settings.autoRedirect) { + handleRoleChange("Ellenorzo"); + return; + } const schoolNameEl = document.querySelector(".IntezmenyNev"); const schoolName = schoolNameEl?.textContent.trim() || "Iskola neve"; @@ -133,6 +160,7 @@ schoolCode, fullSchoolName, userName, + settings, ), 'text/html'); const tempDiv = doc.body; while (tempDiv.firstChild) { diff --git a/settings/index.css b/settings/index.css index fdd8108..dcfc358 100644 --- a/settings/index.css +++ b/settings/index.css @@ -24,7 +24,7 @@ body { } .popup-header { text-align:center; - margin-bottom:16px; + margin-bottom:12px; } .logo-text { color:var(--text-primary); @@ -40,6 +40,58 @@ body { border-radius:6px; margin-right:8px; } + +.tab-navigation { + display: flex; + gap: 8px; + margin-bottom: 16px; + padding: 4px; + background: var(--card-card); + border-radius: 12px; + box-shadow: 0px 1px var(--shadow-blur) 0px var(--accent-shadow); +} + +.tab-button { + flex: 1; + display: flex; + align-items: center; + justify-content: center; + gap: 6px; + padding: 10px 12px; + border: none; + border-radius: 8px; + background: transparent; + color: var(--text-secondary); + font-family: "Montserrat", serif; + font-size: 12px; + font-weight: 500; + cursor: pointer; + transition: all 0.2s ease; +} + +.tab-button:hover { + background: var(--accent-15); + color: var(--text-primary); +} + +.tab-button.active { + background: var(--accent-accent); + color: #000; +} + +.tab-button .material-icons-round { + font-size: 16px; +} + +.tab-content { + display: none; +} + +.tab-content.active { + display: block; + animation: fadeIn 0.2s ease; +} + .settings-card,.about-card,.support-card { background:var(--card-card); border-radius:16px; @@ -122,14 +174,13 @@ h2 { border-radius:8px; } .language-option { - background:var(--card-card); + background:var(--button-secondaryFill); border:1px solid var(--border-border); border-radius:8px; padding:12px; transition:all 0.2s ease; } .language-option:hover { - background:var(--card-hover); border-color:var(--accent-accent); } .language-option.active { @@ -748,3 +799,148 @@ h2 { #importCode { margin-top: 8px; } + +.page-settings-info { + margin-bottom: 16px; +} + +.current-page-indicator { + display: flex; + align-items: center; + gap: 8px; + padding: 12px; + background: var(--button-secondaryFill); + border-radius: 10px; + font-size: 13px; + color: var(--text-secondary); +} + +.current-page-indicator .material-icons-round { + color: var(--accent-accent); +} + +.page-badge { + margin-left: auto; + padding: 4px 10px; + background: var(--accent-15); + color: var(--accent-accent); + border-radius: 6px; + font-size: 11px; + font-weight: 600; + text-transform: capitalize; +} + +.page-specific-settings { + display: flex; + flex-direction: column; + gap: 12px; +} + +.no-settings-placeholder { + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + padding: 32px 16px; + text-align: center; + color: var(--text-secondary); +} + +.no-settings-placeholder .material-icons-round { + font-size: 48px; + margin-bottom: 12px; + opacity: 0.5; +} + +.no-settings-placeholder p { + font-size: 13px; + margin: 0; +} + +.setting-item { + display: flex; + align-items: center; + justify-content: space-between; + padding: 12px; + background: var(--button-secondaryFill); + border-radius: 10px; + gap: 12px; +} + +.setting-item-info { + flex: 1; +} + +.setting-item-label { + font-size: 13px; + font-weight: 500; + color: var(--text-primary); + margin-bottom: 4px; +} + +.setting-item-description { + font-size: 11px; + color: var(--text-secondary); +} + +.toggle-switch { + position: relative; + width: 44px; + height: 24px; + flex-shrink: 0; +} + +.toggle-switch input { + opacity: 0; + width: 0; + height: 0; +} + +.toggle-slider { + position: absolute; + cursor: pointer; + top: 0; + left: 0; + right: 0; + bottom: 0; + background: var(--text-teritary); + border-radius: 24px; + transition: 0.3s; +} + +.toggle-slider:before { + position: absolute; + content: ""; + height: 18px; + width: 18px; + left: 3px; + bottom: 3px; + background: white; + border-radius: 50%; + transition: 0.3s; +} + +.toggle-switch input:checked + .toggle-slider { + background: var(--accent-accent); +} + +.toggle-switch input:checked + .toggle-slider:before { + transform: translateX(20px); +} + +.setting-select { + padding: 8px 12px; + border: 1px solid var(--border-border, var(--text-teritary)); + border-radius: 8px; + background: var(--button-secondaryFill); + color: var(--text-primary); + font-family: "Montserrat", serif; + font-size: 12px; + cursor: pointer; + outline: none; + min-width: 100px; +} + +.setting-select:focus { + border-color: var(--accent-accent); +} diff --git a/settings/index.html b/settings/index.html index c899a80..3a717aa 100644 --- a/settings/index.html +++ b/settings/index.html @@ -22,106 +22,143 @@

-
-

Beállítások

-
-
-
- palette - Téma -
-
- +
+ + + +
- + + +
+ +
+
+ Egyéni témák +
+ +
- Sötét Zöld - -
- -
-
- Egyéni témák -
- - +
-
+
+
+
+ language + Nyelv +
+
+ +
-
-
- language - Nyelv +
+
+ +
+
+

Oldal beállítások

+
+
+ web + Aktuális oldal + -
-
- - +
+
+
+ settings_suggest +

Ehhez az oldalhoz nincsenek egyéni beállítások.

-
-

Névjegy

-
-

A Firka egy nyílt forráskódú projekt, amely a KRÉTA rendszerhez készít saját felhasználói felületet.

-