From 5068fcf3c1194e9dc31127fec1ae3b92add2a074 Mon Sep 17 00:00:00 2001 From: YOPER12 <69840031+YOPER12@users.noreply.github.com> Date: Mon, 6 Jan 2025 13:41:12 +0100 Subject: [PATCH 1/7] loader is now displayed earlier --- app/src/main/assets/autoLogin/efeb.js | 4 +- app/src/main/assets/autoLogin/loader.css | 37 ------------ app/src/main/assets/autoLogin/loading.js | 64 ++++++++++++++++++--- app/src/main/assets/autoLogin/manifest.json | 17 +++--- app/src/main/assets/autoLogin/prometeusz.js | 6 +- 5 files changed, 68 insertions(+), 60 deletions(-) delete mode 100644 app/src/main/assets/autoLogin/loader.css diff --git a/app/src/main/assets/autoLogin/efeb.js b/app/src/main/assets/autoLogin/efeb.js index 382279d..3348294 100644 --- a/app/src/main/assets/autoLogin/efeb.js +++ b/app/src/main/assets/autoLogin/efeb.js @@ -7,8 +7,8 @@ function fillLoginForm() { const triedLoggingIn = sessionStorage.getItem('triedLoggingIn'); browser.storage.local.get().then((result) => { - const login = result.Login; - const haslo = result.Haslo; + const login = result?.Login; + const haslo = result?.Haslo; if (login !== undefined && haslo !== undefined && triedLoggingIn === null) { loginField.value = login; diff --git a/app/src/main/assets/autoLogin/loader.css b/app/src/main/assets/autoLogin/loader.css deleted file mode 100644 index 4186197..0000000 --- a/app/src/main/assets/autoLogin/loader.css +++ /dev/null @@ -1,37 +0,0 @@ -.loader { - width: 45px; - aspect-ratio: 1; - --c: no-repeat linear-gradient(#ca2c2a 0 0); - background: var(--c) 0% 50%, var(--c) 50% 50%, var(--c) 100% 50%; - background-size: 20% 100%; - animation: l1 1s infinite linear; -} -.loader-holder { - position: fixed; - top: 0; - left: 0; - width: 100%; - height: 100%; - display: flex; - justify-content: center; - align-items: center; - background: rgba(0, 0, 0, 0.7); - z-index: 9999; -} -@keyframes l1 { - 0% { - background-size: 20% 100%, 20% 100%, 20% 100%; - } - 33% { - background-size: 20% 10%, 20% 100%, 20% 100%; - } - 50% { - background-size: 20% 100%, 20% 10%, 20% 100%; - } - 66% { - background-size: 20% 100%, 20% 100%, 20% 10%; - } - 100% { - background-size: 20% 100%, 20% 100%, 20% 100%; - } -} diff --git a/app/src/main/assets/autoLogin/loading.js b/app/src/main/assets/autoLogin/loading.js index 37c25e0..b047641 100644 --- a/app/src/main/assets/autoLogin/loading.js +++ b/app/src/main/assets/autoLogin/loading.js @@ -1,11 +1,57 @@ -const loaderHolder = document.createElement('div'); -loaderHolder.className = 'loader-holder'; -document.body.appendChild(loaderHolder); +showLoader(); -const loader = document.createElement('div'); -loader.className = 'loader'; -loaderHolder.appendChild(loader); +function showLoader() { + const style = document.createElement('style'); + style.textContent = ` + .loader { + width: 45px; + aspect-ratio: 1; + --c: no-repeat linear-gradient(#ca2c2a 0 0); + background: var(--c) 0% 50%, var(--c) 50% 50%, var(--c) 100% 50%; + background-size: 20% 100%; + animation: l1 1s infinite linear; + } + .loader-holder { + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 100%; + display: flex; + justify-content: center; + align-items: center; + background: rgba(0, 0, 0, 0.7); + z-index: 9999; + } + @keyframes l1 { + 0% { + background-size: 20% 100%, 20% 100%, 20% 100%; + } + 33% { + background-size: 20% 10%, 20% 100%, 20% 100%; + } + 50% { + background-size: 20% 100%, 20% 10%, 20% 100%; + } + 66% { + background-size: 20% 100%, 20% 100%, 20% 10%; + } + 100% { + background-size: 20% 100%, 20% 100%, 20% 100%; + } + } +`; + (document.head || document.documentElement).appendChild(style); -addEventListener('load', () => { - document.body.removeChild(loaderHolder); -}) \ No newline at end of file + const loaderHolder = document.createElement('div'); + loaderHolder.className = 'loader-holder'; + const loader = document.createElement('div'); + loader.className = 'loader'; + loaderHolder.appendChild(loader); + + (document.body || document.documentElement).appendChild(loaderHolder); + + window.addEventListener('load', () => { + loaderHolder.remove(); + }); +} \ No newline at end of file diff --git a/app/src/main/assets/autoLogin/manifest.json b/app/src/main/assets/autoLogin/manifest.json index c77d8f1..dc72c1f 100644 --- a/app/src/main/assets/autoLogin/manifest.json +++ b/app/src/main/assets/autoLogin/manifest.json @@ -21,25 +21,23 @@ "content_scripts": [ { "js": ["loading.js"], - "css": ["loader.css"], "matches": [ "*://eduvulcan.pl/logowanie", "*://eduvulcan.pl/", - "*://dziennik-uczen.vulcan.net.pl/*/LoginEndpoint.aspx" + "*://dziennik-logowanie.vulcan.net.pl/*/Account/Logon*" ], - "run_at": "document_end" + "run_at": "document_start" }, { "js": ["prometeusz.js"], - "matches": [ - "*://eduvulcan.pl/logowanie", - "*://eduvulcan.pl/" - ], + "matches": ["*://eduvulcan.pl/logowanie", "*://eduvulcan.pl/"], "run_at": "document_end" }, { "js": ["efeb.js"], - "matches": ["*://dziennik-uczen.vulcan.net.pl/*/LoginEndpoint.aspx"], + "matches": [ + "*://dziennik-logowanie.vulcan.net.pl/*/Account/Logon*" + ], "run_at": "document_end" }, { @@ -47,7 +45,8 @@ "matches": [ "*://eduvulcan.pl/wylogowanie", "*://dziennik-uczen.vulcan.net.pl/*/nie-wiem-jaki-endpoint" - ] + ], + "run_at": "document_start" } ] } diff --git a/app/src/main/assets/autoLogin/prometeusz.js b/app/src/main/assets/autoLogin/prometeusz.js index de590ae..5723f0e 100644 --- a/app/src/main/assets/autoLogin/prometeusz.js +++ b/app/src/main/assets/autoLogin/prometeusz.js @@ -11,14 +11,14 @@ function fillLoginForm() { const triedLoggingIn = sessionStorage.getItem('triedLoggingIn'); browser.storage.local.get().then((result) => { - const alias = result.Alias; - const password = result.Password; + const alias = result?.Alias; + const password = result?.Password; if (alias !== undefined && password !== undefined && triedLoggingIn === null) { aliasField.value = alias; passwordField.value = password; loginButton.click(); - sessionStorage.setItem("triedLoggingIn", "1" ); + sessionStorage.setItem("triedLoggingIn", "1"); } else { if (triedLoggingIn === "1") { document.querySelectorAll('.message-error').forEach(e => { From 54423826dfd0fce287797bc29d9e35a95cb09685 Mon Sep 17 00:00:00 2001 From: YOPER12 <69840031+YOPER12@users.noreply.github.com> Date: Tue, 7 Jan 2025 17:15:48 +0100 Subject: [PATCH 2/7] =?UTF-8?q?linki=20ju=C5=BC=20dzia=C5=82aj=C4=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/build.gradle | 1 + .../main/java/dev/andus/niedu/MainActivity.kt | 5 ++-- .../dev/andus/niedu/MyNavigationDelegate.kt | 24 ++++++++++++++++--- gradle/libs.versions.toml | 2 ++ 4 files changed, 27 insertions(+), 5 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 06bedb6..28c2007 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -48,6 +48,7 @@ dependencies { implementation libs.androidx.material3 implementation libs.androidx.coordinatorlayout implementation libs.material + implementation libs.androidx.browser testImplementation libs.junit androidTestImplementation libs.androidx.junit androidTestImplementation libs.androidx.espresso.core diff --git a/app/src/main/java/dev/andus/niedu/MainActivity.kt b/app/src/main/java/dev/andus/niedu/MainActivity.kt index a5b9f9d..79d58f9 100644 --- a/app/src/main/java/dev/andus/niedu/MainActivity.kt +++ b/app/src/main/java/dev/andus/niedu/MainActivity.kt @@ -23,6 +23,7 @@ class MainActivity : AppCompatActivity() { private var baseUrl: String? = null private var symbol: String? = null private var journalType: String? = null + val navigationDelegate = MyNavigationDelegate(this) override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) @@ -45,7 +46,7 @@ class MainActivity : AppCompatActivity() { showJournalTypeDialog() } - installIfv() + installExtensions() loadLoginPage() } @@ -65,7 +66,7 @@ class MainActivity : AppCompatActivity() { geckoView.setSession(geckoSession) } - private fun installIfv() { + private fun installExtensions() { runtime.webExtensionController.ensureBuiltIn( "resource://android/assets/ifv/", "j.skup.test@gmail.com" diff --git a/app/src/main/java/dev/andus/niedu/MyNavigationDelegate.kt b/app/src/main/java/dev/andus/niedu/MyNavigationDelegate.kt index 216b6ba..ead3aa8 100644 --- a/app/src/main/java/dev/andus/niedu/MyNavigationDelegate.kt +++ b/app/src/main/java/dev/andus/niedu/MyNavigationDelegate.kt @@ -1,13 +1,31 @@ package dev.andus.niedu +import android.content.Context +import android.net.Uri +import androidx.browser.customtabs.CustomTabsIntent +import org.mozilla.geckoview.AllowOrDeny +import org.mozilla.geckoview.GeckoResult import org.mozilla.geckoview.GeckoSession +import org.mozilla.geckoview.GeckoSession.NavigationDelegate -class MyNavigationDelegate : GeckoSession.NavigationDelegate { +class MyNavigationDelegate(private val context: Context) : NavigationDelegate { var canGoBack: Boolean = false override fun onCanGoBack(session: GeckoSession, canGoBack: Boolean) { this.canGoBack = canGoBack } -} -val navigationDelegate = MyNavigationDelegate() \ No newline at end of file + override fun onLoadRequest(session: GeckoSession, request: NavigationDelegate.LoadRequest): GeckoResult { + if (request.target == NavigationDelegate.TARGET_WINDOW_NEW) { + var uri = request.uri + + val intent = CustomTabsIntent.Builder() + .setShowTitle(true) + .setUrlBarHidingEnabled(true) + .build() + intent.launchUrl(context, Uri.parse(uri)) + } + + return GeckoResult.fromValue(AllowOrDeny.ALLOW) + } +} \ No newline at end of file diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index ed351ea..bd90950 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,6 +1,7 @@ [versions] agp = "8.7.0" geckoview = "133.0.20241209150345" +andXbrowser = "1.8.0" kotlin = "2.0.0" coreKtx = "1.10.1" junit = "4.13.2" @@ -15,6 +16,7 @@ material = "1.12.0" [libraries] androidx-core-ktx = { group = "androidx.core", name = "core-ktx", version.ref = "coreKtx" } geckoview = { module = "org.mozilla.geckoview:geckoview", version.ref = "geckoview" } +androidx-browser = { group = "androidx.browser", name = "browser", version.ref = "andXbrowser" } junit = { group = "junit", name = "junit", version.ref = "junit" } androidx-junit = { group = "androidx.test.ext", name = "junit", version.ref = "junitVersion" } androidx-espresso-core = { group = "androidx.test.espresso", name = "espresso-core", version.ref = "espressoCore" } From 8fb4030a8979a079900bae1f596a6bfc66d166a3 Mon Sep 17 00:00:00 2001 From: YOPER12 <69840031+YOPER12@users.noreply.github.com> Date: Tue, 7 Jan 2025 17:40:03 +0100 Subject: [PATCH 3/7] Revert 3 commits MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Trzecie podejście do linków * Podejście drugie do linków * Dodanie wsparcia dla linków --- .../main/java/dev/andus/niedu/MainActivity.kt | 17 +---------------- 1 file changed, 1 insertion(+), 16 deletions(-) diff --git a/app/src/main/java/dev/andus/niedu/MainActivity.kt b/app/src/main/java/dev/andus/niedu/MainActivity.kt index 761c3a4..151945f 100644 --- a/app/src/main/java/dev/andus/niedu/MainActivity.kt +++ b/app/src/main/java/dev/andus/niedu/MainActivity.kt @@ -1,8 +1,6 @@ package dev.andus.niedu import android.content.SharedPreferences -import android.content.Intent -import android.net.Uri import android.os.Bundle import org.mozilla.geckoview.GeckoRuntime import org.mozilla.geckoview.GeckoSession @@ -63,19 +61,6 @@ class MainActivity : AppCompatActivity() { geckoSession = GeckoSession(settings) - geckoSession.contentDelegate = object : GeckoSession.ContentDelegate { - override fun onLoadRequest( - session: GeckoSession, - request: GeckoSession.ContentDelegate.LoadRequest - ): GeckoSession.ContentDelegate.LoadResponse? { - if (!request.isRedirect && request.uri != null) { - openInExternalBrowser(request.uri!!) - return GeckoSession.ContentDelegate.LoadResponse.CANCEL - } - return null - } - } - geckoSession.open(runtime) geckoView.setSession(geckoSession) } @@ -177,4 +162,4 @@ class MainActivity : AppCompatActivity() { geckoSession.close() super.onDestroy() } -} +} \ No newline at end of file From e41649294515e9ca1234eda3c3f4e491502e0409 Mon Sep 17 00:00:00 2001 From: YOPER12 <69840031+YOPER12@users.noreply.github.com> Date: Tue, 7 Jan 2025 18:29:14 +0100 Subject: [PATCH 4/7] fix --- app/src/main/java/dev/andus/niedu/MainActivity.kt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/src/main/java/dev/andus/niedu/MainActivity.kt b/app/src/main/java/dev/andus/niedu/MainActivity.kt index 151945f..fb1f924 100644 --- a/app/src/main/java/dev/andus/niedu/MainActivity.kt +++ b/app/src/main/java/dev/andus/niedu/MainActivity.kt @@ -61,6 +61,8 @@ class MainActivity : AppCompatActivity() { geckoSession = GeckoSession(settings) + geckoSession.navigationDelegate = navigationDelegate + geckoSession.open(runtime) geckoView.setSession(geckoSession) } From 46e15db790c18be5165ef365a1c4dbde0dbeba08 Mon Sep 17 00:00:00 2001 From: YOPER12 <69840031+YOPER12@users.noreply.github.com> Date: Tue, 7 Jan 2025 21:26:08 +0100 Subject: [PATCH 5/7] removed ifv files --- app/src/main/assets/ifv/LICENSE | 21 -- app/src/main/assets/ifv/apply.js | 91 -------- .../main/assets/ifv/assets/add to chrome.svg | 38 --- .../main/assets/ifv/assets/add to firefox.svg | 97 -------- app/src/main/assets/ifv/assets/discord.svg | 1 - app/src/main/assets/ifv/assets/github.svg | 1 - ...24dp_E8EAED_FILL0_wght400_GRAD0_opsz24.svg | 1 - ...24dp_E8EAED_FILL0_wght400_GRAD0_opsz24.svg | 1 - ...24dp_E8EAED_FILL0_wght400_GRAD0_opsz24.svg | 1 - ...24dp_E8EAED_FILL0_wght400_GRAD0_opsz24.svg | 1 - ...24dp_E8EAED_FILL0_wght400_GRAD0_opsz24.svg | 1 - ...24dp_E8EAED_FILL0_wght400_GRAD0_opsz24.svg | 1 - ...24dp_E8EAED_FILL0_wght400_GRAD0_opsz24.svg | 1 - ...24dp_E8EAED_FILL0_wght400_GRAD0_opsz24.svg | 1 - ...24dp_E8EAED_FILL0_wght400_GRAD0_opsz24.svg | 1 - ...24dp_E8EAED_FILL0_wght400_GRAD0_opsz24.svg | 1 - .../assets/ifv/assets/logo/logo-128-blue.png | Bin 3642 -> 0 bytes .../assets/ifv/assets/logo/logo-128-red.png | Bin 3647 -> 0 bytes .../assets/ifv/assets/logo/logo-192-blue.png | Bin 5356 -> 0 bytes .../assets/ifv/assets/logo/logo-192-red.png | Bin 5249 -> 0 bytes .../assets/ifv/assets/logo/logo-512-blue.png | Bin 14615 -> 0 bytes .../assets/ifv/assets/logo/logo-512-red.png | Bin 14779 -> 0 bytes app/src/main/assets/ifv/execute.js | 46 ---- app/src/main/assets/ifv/manifest.json | 71 ------ app/src/main/assets/ifv/patches.json | 182 --------------- .../ifv/patches/alignDetailedGradesButton.css | 3 - app/src/main/assets/ifv/patches/apis/aside.js | 42 ---- .../patches/apis/bottomDateSelector/index.js | 217 ------------------ .../apis/bottomDateSelector/styles.css | 37 --- .../assets/ifv/patches/apis/getUserData.js | 28 --- .../assets/ifv/patches/apis/waitForElement.js | 15 -- app/src/main/assets/ifv/patches/arrows.css | 51 ---- .../assets/ifv/patches/attendance/styles.css | 23 -- .../assets/ifv/patches/attendance/tabs.js | 47 ---- .../ifv/patches/cleanUpEduVulcanHome.css | 24 -- .../assets/ifv/patches/displayFullName.js | 43 ---- .../main/assets/ifv/patches/fixResizing.js | 13 -- .../ifv/patches/hideEmptyExamResults.css | 9 - .../main/assets/ifv/patches/hideFooter.css | 5 - .../ifv/patches/hideHelpOnDashboard.css | 3 - .../hideSubjectsWithNoGrades/finalGrades.js | 62 ----- .../hideSubjectsWithNoGrades/normalGrades.css | 7 - .../ifv/patches/hideTutorsFromBoard.css | 3 - app/src/main/assets/ifv/patches/hideWCAG.css | 3 - .../main/assets/ifv/patches/hideWeekends.css | 32 --- .../patches/loginPasswordTogether/script.js | 43 ---- .../patches/loginPasswordTogether/styles.css | 20 -- .../main/assets/ifv/patches/messagesButton.js | 33 --- .../patches/moveUserOptionsToHeader/script.js | 92 -------- .../moveUserOptionsToHeader/styles.css | 123 ---------- .../ifv/patches/newMobileNavbar/highlights.js | 23 -- .../ifv/patches/newMobileNavbar/index.js | 145 ------------ .../ifv/patches/newMobileNavbar/styles.css | 157 ------------- .../assets/ifv/patches/newTimetable/script.js | 189 --------------- .../ifv/patches/newTimetable/styles.css | 111 --------- app/src/main/assets/ifv/patches/pwa.js | 35 --- .../ifv/patches/redirectToBoard/script.js | 33 --- .../ifv/patches/redirectToBoard/styles.css | 3 - .../assets/ifv/patches/redirectToDVLogin.js | 26 --- .../assets/ifv/patches/redirectToEVLogin.js | 12 - app/src/main/assets/ifv/popup/index.html | 22 -- app/src/main/assets/ifv/popup/main.js | 41 ---- app/src/main/assets/ifv/popup/style.css | 122 ---------- .../assets/ifv/pwa/manifest-eduvulcan.json | 27 --- 64 files changed, 2482 deletions(-) delete mode 100644 app/src/main/assets/ifv/LICENSE delete mode 100644 app/src/main/assets/ifv/apply.js delete mode 100644 app/src/main/assets/ifv/assets/add to chrome.svg delete mode 100644 app/src/main/assets/ifv/assets/add to firefox.svg delete mode 100644 app/src/main/assets/ifv/assets/discord.svg delete mode 100644 app/src/main/assets/ifv/assets/github.svg delete mode 100644 app/src/main/assets/ifv/assets/icons/calendar_clock_24dp_E8EAED_FILL0_wght400_GRAD0_opsz24.svg delete mode 100644 app/src/main/assets/ifv/assets/icons/chevron_left_24dp_E8EAED_FILL0_wght400_GRAD0_opsz24.svg delete mode 100644 app/src/main/assets/ifv/assets/icons/chevron_right_24dp_E8EAED_FILL0_wght400_GRAD0_opsz24.svg delete mode 100644 app/src/main/assets/ifv/assets/icons/counter_6_24dp_E8EAED_FILL0_wght400_GRAD0_opsz24.svg delete mode 100644 app/src/main/assets/ifv/assets/icons/dashboard_24dp_E8EAED_FILL0_wght400_GRAD0_opsz24.svg delete mode 100644 app/src/main/assets/ifv/assets/icons/event_available_24dp_E8EAED_FILL0_wght400_GRAD0_opsz24.svg delete mode 100644 app/src/main/assets/ifv/assets/icons/keyboard_backspace_24dp_E8EAED_FILL0_wght400_GRAD0_opsz24.svg delete mode 100644 app/src/main/assets/ifv/assets/icons/menu_24dp_E8EAED_FILL0_wght400_GRAD0_opsz24.svg delete mode 100644 app/src/main/assets/ifv/assets/icons/unfold_less_24dp_E8EAED_FILL0_wght400_GRAD0_opsz24.svg delete mode 100644 app/src/main/assets/ifv/assets/icons/unfold_more_24dp_E8EAED_FILL0_wght400_GRAD0_opsz24.svg delete mode 100644 app/src/main/assets/ifv/assets/logo/logo-128-blue.png delete mode 100644 app/src/main/assets/ifv/assets/logo/logo-128-red.png delete mode 100644 app/src/main/assets/ifv/assets/logo/logo-192-blue.png delete mode 100644 app/src/main/assets/ifv/assets/logo/logo-192-red.png delete mode 100644 app/src/main/assets/ifv/assets/logo/logo-512-blue.png delete mode 100644 app/src/main/assets/ifv/assets/logo/logo-512-red.png delete mode 100644 app/src/main/assets/ifv/execute.js delete mode 100644 app/src/main/assets/ifv/manifest.json delete mode 100644 app/src/main/assets/ifv/patches.json delete mode 100644 app/src/main/assets/ifv/patches/alignDetailedGradesButton.css delete mode 100644 app/src/main/assets/ifv/patches/apis/aside.js delete mode 100644 app/src/main/assets/ifv/patches/apis/bottomDateSelector/index.js delete mode 100644 app/src/main/assets/ifv/patches/apis/bottomDateSelector/styles.css delete mode 100644 app/src/main/assets/ifv/patches/apis/getUserData.js delete mode 100644 app/src/main/assets/ifv/patches/apis/waitForElement.js delete mode 100644 app/src/main/assets/ifv/patches/arrows.css delete mode 100644 app/src/main/assets/ifv/patches/attendance/styles.css delete mode 100644 app/src/main/assets/ifv/patches/attendance/tabs.js delete mode 100644 app/src/main/assets/ifv/patches/cleanUpEduVulcanHome.css delete mode 100644 app/src/main/assets/ifv/patches/displayFullName.js delete mode 100644 app/src/main/assets/ifv/patches/fixResizing.js delete mode 100644 app/src/main/assets/ifv/patches/hideEmptyExamResults.css delete mode 100644 app/src/main/assets/ifv/patches/hideFooter.css delete mode 100644 app/src/main/assets/ifv/patches/hideHelpOnDashboard.css delete mode 100644 app/src/main/assets/ifv/patches/hideSubjectsWithNoGrades/finalGrades.js delete mode 100644 app/src/main/assets/ifv/patches/hideSubjectsWithNoGrades/normalGrades.css delete mode 100644 app/src/main/assets/ifv/patches/hideTutorsFromBoard.css delete mode 100644 app/src/main/assets/ifv/patches/hideWCAG.css delete mode 100644 app/src/main/assets/ifv/patches/hideWeekends.css delete mode 100644 app/src/main/assets/ifv/patches/loginPasswordTogether/script.js delete mode 100644 app/src/main/assets/ifv/patches/loginPasswordTogether/styles.css delete mode 100644 app/src/main/assets/ifv/patches/messagesButton.js delete mode 100644 app/src/main/assets/ifv/patches/moveUserOptionsToHeader/script.js delete mode 100644 app/src/main/assets/ifv/patches/moveUserOptionsToHeader/styles.css delete mode 100644 app/src/main/assets/ifv/patches/newMobileNavbar/highlights.js delete mode 100644 app/src/main/assets/ifv/patches/newMobileNavbar/index.js delete mode 100644 app/src/main/assets/ifv/patches/newMobileNavbar/styles.css delete mode 100644 app/src/main/assets/ifv/patches/newTimetable/script.js delete mode 100644 app/src/main/assets/ifv/patches/newTimetable/styles.css delete mode 100644 app/src/main/assets/ifv/patches/pwa.js delete mode 100644 app/src/main/assets/ifv/patches/redirectToBoard/script.js delete mode 100644 app/src/main/assets/ifv/patches/redirectToBoard/styles.css delete mode 100644 app/src/main/assets/ifv/patches/redirectToDVLogin.js delete mode 100644 app/src/main/assets/ifv/patches/redirectToEVLogin.js delete mode 100644 app/src/main/assets/ifv/popup/index.html delete mode 100644 app/src/main/assets/ifv/popup/main.js delete mode 100644 app/src/main/assets/ifv/popup/style.css delete mode 100644 app/src/main/assets/ifv/pwa/manifest-eduvulcan.json diff --git a/app/src/main/assets/ifv/LICENSE b/app/src/main/assets/ifv/LICENSE deleted file mode 100644 index 11b7226..0000000 --- a/app/src/main/assets/ifv/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2024 BanOcean - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/app/src/main/assets/ifv/apply.js b/app/src/main/assets/ifv/apply.js deleted file mode 100644 index a4b3c5a..0000000 --- a/app/src/main/assets/ifv/apply.js +++ /dev/null @@ -1,91 +0,0 @@ -/** - * @typedef {Object} Patch - * @property {string} name - The name of the patch. - * @property {string} description - The description of the patch. - * @property {Object} files - The files to be injected. - * @property {string[]} [files.css] - An array of CSS file names (optional). - * @property {string[]} [files.js] - An array of JS file names (optional). - */ - -/** @returns {Promise} */ -const fetchPatches = async () => { - const patchesResponse = await fetch(chrome.runtime.getURL("patches.json")); - return await patchesResponse.json(); -}; - -const getConfig = async () => - (await chrome.storage.sync.get("options"))?.options ?? {}; - -chrome.storage.onChanged.addListener((changes, namespace) => { - if ( - !changes.options?.oldValue || - JSON.stringify(changes.options?.oldValue) === - JSON.stringify(changes.options?.newValue) - ) - return; - if (namespace !== "sync") return; - window.location.reload(); -}); - -const getPatchesFiles = (patches, config) => { - return [ - ...new Set( - patches - .flatMap((patch) => { - const result = []; - if (config[patch.name].enable) { - if (patch.files?.js?.length) - result.push( - patch.files.js.map((file) => `patches/${file}`), - ); - if ( - (!patch.allowedHostsCss || - patch.allowedHostsCss.includes( - window.location.hostname, - )) && - patch.files?.css?.length - ) { - result.push( - patch.files.css.map( - (file) => `patches/${file}`, - ), - ); - } - } - return result; - }) - .flat(), - ), - ]; -}; - -async function run() { - let config = await getConfig(); - const patches = await fetchPatches(); - - patches.forEach((patch) => { - if (config[patch.name] !== undefined) return; - config[patch.name] = { description: patch.description, enable: true }; - }); - - chrome.storage.sync.set({ options: config }); - - for (const filePath of getPatchesFiles(patches, config)) { - const element = document.createElement( - filePath.endsWith(".js") ? "script" : "link", - ); - element.setAttribute( - filePath.endsWith(".js") ? "src" : "href", - chrome.runtime.getURL(filePath), - ); - if (filePath.endsWith(".css")) - element.setAttribute("rel", "stylesheet"); - else { - element.setAttribute("type", "module"); - element.classList.add("injected-script"); - } - document.head.appendChild(element); - } -} - -run(); diff --git a/app/src/main/assets/ifv/assets/add to chrome.svg b/app/src/main/assets/ifv/assets/add to chrome.svg deleted file mode 100644 index 2d08902..0000000 --- a/app/src/main/assets/ifv/assets/add to chrome.svg +++ /dev/null @@ -1,38 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/app/src/main/assets/ifv/assets/add to firefox.svg b/app/src/main/assets/ifv/assets/add to firefox.svg deleted file mode 100644 index cb1c188..0000000 --- a/app/src/main/assets/ifv/assets/add to firefox.svg +++ /dev/null @@ -1,97 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/app/src/main/assets/ifv/assets/discord.svg b/app/src/main/assets/ifv/assets/discord.svg deleted file mode 100644 index 7f9a31f..0000000 --- a/app/src/main/assets/ifv/assets/discord.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/app/src/main/assets/ifv/assets/github.svg b/app/src/main/assets/ifv/assets/github.svg deleted file mode 100644 index d5e6491..0000000 --- a/app/src/main/assets/ifv/assets/github.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/app/src/main/assets/ifv/assets/icons/calendar_clock_24dp_E8EAED_FILL0_wght400_GRAD0_opsz24.svg b/app/src/main/assets/ifv/assets/icons/calendar_clock_24dp_E8EAED_FILL0_wght400_GRAD0_opsz24.svg deleted file mode 100644 index 3db8225..0000000 --- a/app/src/main/assets/ifv/assets/icons/calendar_clock_24dp_E8EAED_FILL0_wght400_GRAD0_opsz24.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/app/src/main/assets/ifv/assets/icons/chevron_left_24dp_E8EAED_FILL0_wght400_GRAD0_opsz24.svg b/app/src/main/assets/ifv/assets/icons/chevron_left_24dp_E8EAED_FILL0_wght400_GRAD0_opsz24.svg deleted file mode 100644 index cdd942c..0000000 --- a/app/src/main/assets/ifv/assets/icons/chevron_left_24dp_E8EAED_FILL0_wght400_GRAD0_opsz24.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/app/src/main/assets/ifv/assets/icons/chevron_right_24dp_E8EAED_FILL0_wght400_GRAD0_opsz24.svg b/app/src/main/assets/ifv/assets/icons/chevron_right_24dp_E8EAED_FILL0_wght400_GRAD0_opsz24.svg deleted file mode 100644 index 0603448..0000000 --- a/app/src/main/assets/ifv/assets/icons/chevron_right_24dp_E8EAED_FILL0_wght400_GRAD0_opsz24.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/app/src/main/assets/ifv/assets/icons/counter_6_24dp_E8EAED_FILL0_wght400_GRAD0_opsz24.svg b/app/src/main/assets/ifv/assets/icons/counter_6_24dp_E8EAED_FILL0_wght400_GRAD0_opsz24.svg deleted file mode 100644 index d845664..0000000 --- a/app/src/main/assets/ifv/assets/icons/counter_6_24dp_E8EAED_FILL0_wght400_GRAD0_opsz24.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/app/src/main/assets/ifv/assets/icons/dashboard_24dp_E8EAED_FILL0_wght400_GRAD0_opsz24.svg b/app/src/main/assets/ifv/assets/icons/dashboard_24dp_E8EAED_FILL0_wght400_GRAD0_opsz24.svg deleted file mode 100644 index 16b7d0a..0000000 --- a/app/src/main/assets/ifv/assets/icons/dashboard_24dp_E8EAED_FILL0_wght400_GRAD0_opsz24.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/app/src/main/assets/ifv/assets/icons/event_available_24dp_E8EAED_FILL0_wght400_GRAD0_opsz24.svg b/app/src/main/assets/ifv/assets/icons/event_available_24dp_E8EAED_FILL0_wght400_GRAD0_opsz24.svg deleted file mode 100644 index 5363d44..0000000 --- a/app/src/main/assets/ifv/assets/icons/event_available_24dp_E8EAED_FILL0_wght400_GRAD0_opsz24.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/app/src/main/assets/ifv/assets/icons/keyboard_backspace_24dp_E8EAED_FILL0_wght400_GRAD0_opsz24.svg b/app/src/main/assets/ifv/assets/icons/keyboard_backspace_24dp_E8EAED_FILL0_wght400_GRAD0_opsz24.svg deleted file mode 100644 index b4ef999..0000000 --- a/app/src/main/assets/ifv/assets/icons/keyboard_backspace_24dp_E8EAED_FILL0_wght400_GRAD0_opsz24.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/app/src/main/assets/ifv/assets/icons/menu_24dp_E8EAED_FILL0_wght400_GRAD0_opsz24.svg b/app/src/main/assets/ifv/assets/icons/menu_24dp_E8EAED_FILL0_wght400_GRAD0_opsz24.svg deleted file mode 100644 index 702a828..0000000 --- a/app/src/main/assets/ifv/assets/icons/menu_24dp_E8EAED_FILL0_wght400_GRAD0_opsz24.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/app/src/main/assets/ifv/assets/icons/unfold_less_24dp_E8EAED_FILL0_wght400_GRAD0_opsz24.svg b/app/src/main/assets/ifv/assets/icons/unfold_less_24dp_E8EAED_FILL0_wght400_GRAD0_opsz24.svg deleted file mode 100644 index d9d41fe..0000000 --- a/app/src/main/assets/ifv/assets/icons/unfold_less_24dp_E8EAED_FILL0_wght400_GRAD0_opsz24.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/app/src/main/assets/ifv/assets/icons/unfold_more_24dp_E8EAED_FILL0_wght400_GRAD0_opsz24.svg b/app/src/main/assets/ifv/assets/icons/unfold_more_24dp_E8EAED_FILL0_wght400_GRAD0_opsz24.svg deleted file mode 100644 index 8abaf5e..0000000 --- a/app/src/main/assets/ifv/assets/icons/unfold_more_24dp_E8EAED_FILL0_wght400_GRAD0_opsz24.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/app/src/main/assets/ifv/assets/logo/logo-128-blue.png b/app/src/main/assets/ifv/assets/logo/logo-128-blue.png deleted file mode 100644 index f82c65ec984a415e89c4c4867ddc32bf7ade6e43..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3642 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 M07*qoM6N<$f_xjh9{>OV diff --git a/app/src/main/assets/ifv/assets/logo/logo-128-red.png b/app/src/main/assets/ifv/assets/logo/logo-128-red.png deleted file mode 100644 index 6de072cfa2c0e5ce7ed18c2ee719db0b077ca4c5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3647 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 DDhD(i diff --git a/app/src/main/assets/ifv/assets/logo/logo-192-red.png b/app/src/main/assets/ifv/assets/logo/logo-192-red.png deleted file mode 100644 index ee39cc44b123e9d894920233bad65cd8d572df64..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5249 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 Bsg3{u diff --git a/app/src/main/assets/ifv/assets/logo/logo-512-blue.png b/app/src/main/assets/ifv/assets/logo/logo-512-blue.png deleted file mode 100644 index 00accc6fa27f3aa446629753562e1d0510513903..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14615 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 M$~C$4OSc~V5BFaUtpET3 diff --git a/app/src/main/assets/ifv/assets/logo/logo-512-red.png b/app/src/main/assets/ifv/assets/logo/logo-512-red.png deleted file mode 100644 index 22389e1ec4d5df31893a984569346ab2669222a8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14779 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 diff --git a/app/src/main/assets/ifv/execute.js b/app/src/main/assets/ifv/execute.js deleted file mode 100644 index f686481..0000000 --- a/app/src/main/assets/ifv/execute.js +++ /dev/null @@ -1,46 +0,0 @@ -const modules = []; -let loadedScripts = 0; - -const isEverythingLoaded = () => - document.querySelectorAll(".injected-script").length === loadedScripts; - -window.appendModule = (...args) => { - modules.push(...args); - loadedScripts++; - if (isEverythingLoaded()) execute(); -}; - -const execute = () => { - if (!modules.length) - console.warn( - "Script tried executing before all files loaded or all patches are disabled", - ); - - const isFirstRun = !window.iWasThere; // :) - window.iWasThere = true; - - for (const { onlyOnReloads, doesRunHere, isLoaded, run } of modules) { - if (onlyOnReloads && !isFirstRun) continue; - if (doesRunHere !== undefined && !doesRunHere()) continue; - - if (!isLoaded || isLoaded()) run(); - else { - const observer = new MutationObserver((mutationsList, observer) => { - if (!isLoaded()) return; - observer.disconnect(); - run(); - }); - observer.observe(document.body, { - subtree: true, - childList: true, - }); - } - } -}; - -window.history.pushState = new Proxy(window.history.pushState, { - apply: (target, a, args) => { - target.apply(a, args); - if (modules.length !== 0 && isEverythingLoaded()) execute(); - }, -}); diff --git a/app/src/main/assets/ifv/manifest.json b/app/src/main/assets/ifv/manifest.json deleted file mode 100644 index 413415b..0000000 --- a/app/src/main/assets/ifv/manifest.json +++ /dev/null @@ -1,71 +0,0 @@ -{ - "manifest_version": 3, - "description": "Poprawia uciążliwe elementy stron usług eduVULCAN oraz Dziennik Vulcan", - "version": "0.3", - "name": "Improvements for Vulcan", - - "permissions": ["storage"], - "host_permissions": [ - "*://dziennik-uczen.vulcan.net.pl/*", - "*://dziennik-wiadomosci.vulcan.net.pl/*", - "*://uczen.eduvulcan.pl/*", - "*://wiadomosci.eduvulcan.pl/*", - "*://dziennik-logowanie.vulcan.net.pl/*", - "*://eduvulcan.pl/*" - ], - - "browser_specific_settings": { - "gecko": { - "id": "j.skup.test@gmail.com", - "strict_min_version": "128.0" - } - }, - - "web_accessible_resources": [ - { - "resources": ["patches/*", "patches.json"], - "matches": [ - "*://dziennik-uczen.vulcan.net.pl/*", - "*://dziennik-wiadomosci.vulcan.net.pl/*", - "*://uczen.eduvulcan.pl/*", - "*://wiadomosci.eduvulcan.pl/*", - "*://dziennik-logowanie.vulcan.net.pl/*", - "*://eduvulcan.pl/*" - ] - } - ], - "content_scripts": [ - { - "js": ["execute.js"], - "matches": [ - "*://dziennik-uczen.vulcan.net.pl/*", - "*://dziennik-wiadomosci.vulcan.net.pl/*", - "*://uczen.eduvulcan.pl/*", - "*://wiadomosci.eduvulcan.pl/*", - "*://dziennik-logowanie.vulcan.net.pl/*", - "*://eduvulcan.pl/*" - ], - "world": "MAIN" - }, - { - "js": ["apply.js"], - "matches": [ - "*://dziennik-uczen.vulcan.net.pl/*", - "*://dziennik-wiadomosci.vulcan.net.pl/*", - "*://uczen.eduvulcan.pl/*", - "*://wiadomosci.eduvulcan.pl/*", - "*://dziennik-logowanie.vulcan.net.pl/*", - "*://eduvulcan.pl/*" - ] - } - ], - "action": { - "default_popup": "popup/index.html" - }, - - "icons": { - "128": "assets/logo/logo-128-red.png", - "192": "assets/logo/logo-192-red.png", - "512": "assets/logo/logo-512-red.png" - } -} \ No newline at end of file diff --git a/app/src/main/assets/ifv/patches.json b/app/src/main/assets/ifv/patches.json deleted file mode 100644 index f075b2f..0000000 --- a/app/src/main/assets/ifv/patches.json +++ /dev/null @@ -1,182 +0,0 @@ -[ - { - "name": "Change close button icon", - "description": "Replaces close buttons with back buttons to indicate more accurately what action it corresponds to. (mobile only)", - "files": { - "css": ["arrows.css"] - }, - "allowedHostsCss": ["uczen.eduvulcan.pl", "dziennik-uczen.vulcan.net.pl", "wiadomosci.eduvulcan.pl", "dziennik-wiadomosci.vulcan.net.pl"] - }, - { - "name": "Move messages button", - "description": "Moves messages button to header. (mobile only)", - "files": { - "js": ["messagesButton.js"] - } - }, - { - "name": "Hide subjects with no grades", - "description": "Hides subjects without any grades.", - "files": { - "js": ["hideSubjectsWithNoGrades/finalGrades.js"], - "css": ["hideSubjectsWithNoGrades/normalGrades.css"] - }, - "allowedHostsCss": ["uczen.eduvulcan.pl", "dziennik-uczen.vulcan.net.pl"] - }, - { - "name": "Hide empty exam results", - "description": "Hides exam results instead of showing no data. (mobile only)", - "files": { - "css": ["hideEmptyExamResults.css"] - } - }, - { - "name": "Hide footer", - "description": "Hides footer. (mobile only)", - "files": { - "css": ["hideFooter.css"] - }, - "allowedHostsCss": ["uczen.eduvulcan.pl", "dziennik-uczen.vulcan.net.pl", "wiadomosci.eduvulcan.pl", "dziennik-wiadomosci.vulcan.net.pl"] - }, - { - "name": "Hide WCAG", - "description": "Hide WCAG buttons.", - "files": { - "css": ["hideWCAG.css"] - } - }, - { - "name": "Align Detailed Grades Button", - "description": "Aligns detailed grades button with other buttons.", - "files": { - "css": ["alignDetailedGradesButton.css"] - }, - "allowedHostsCss": ["uczen.eduvulcan.pl", "dziennik-uczen.vulcan.net.pl"] - }, - { - "name": "Hide Tutors From Board", - "description": "Hides tutors from board.", - "files": { - "css": ["hideTutorsFromBoard.css"] - }, - "allowedHostsCss": ["uczen.eduvulcan.pl", "dziennik-uczen.vulcan.net.pl"] - }, - { - "name": "Display Full Name", - "description": "Shows the user's name under the nickname. (desktop only)", - - "files": { - "js": ["displayFullName.js"] - } - }, - { - "name": "Redirect To Board", - "description": "Redirects to board after login.", - "files": { - "js": ["redirectToBoard/script.js"], - "css": ["redirectToBoard/styles.css"] - }, - "allowedHostsCss": [ - "uczen.eduvulcan.pl", - "wiadomosci.eduvulcan.pl", - "dziennik-uczen.vulcan.net.pl", - "dziennik-wiadomosci.vulcan.net.pl" - ] - }, - { - "name": "Auto redirect to login page in eduVulcan", - "description": "Auto redirect to login page in eduVulcan.", - "files": { - "js": ["redirectToEVLogin.js"] - } - }, - { - "name": "Auto redirect to login page in Dziennik Vulcan", - "description": "Auto redirect to login page in Dziennik Vulcan.", - "files": { - "js": ["redirectToDVLogin.js"] - } - }, - { - "name": "Hide unneeded tiles in eduVulcan home", - "description": "Hides eduVulcan app download links tile, eduVulcan banner and ribbon.", - "files": { - "css": ["cleanUpEduVulcanHome.css"] - }, - "allowedHostsCss": ["eduvulcan.pl"] - }, - { - "name": "Hide Help On Dashboard", - "description": "Hides \"Do you need help\" tile.", - "files": { - "css": ["hideHelpOnDashboard.css"] - }, - "allowedHostsCss": ["uczen.eduvulcan.pl", "dziennik-uczen.vulcan.net.pl"] - }, - { - "name": "PWA Support", - "description": "Gives ability to install page as PWA.", - "files": { - "js": ["pwa.js"] - } - }, - { - "name": "Attendance statistics in separate tab", - "description": "Makes attendance page more readable by moving statistics to separate tab.", - "files": { - "css": ["attendance/styles.css"], - "js": ["attendance/tabs.js"] - }, - "allowedHostsCss": ["uczen.eduvulcan.pl", "dziennik-uczen.vulcan.net.pl"] - }, - { - "name": "Reload on resize", - "description": "Reloads page while changing between desktop and mobile layouts.", - "files": { - "js": ["fixResizing.js"] - } - }, - { - "name": "Mobile Navigation", - "description": "Replaces aside with more readable bottom navigation bar designed. (mobile only)", - "files": { - "css": ["newMobileNavbar/styles.css"], - "js": ["newMobileNavbar/index.js", "newMobileNavbar/highlights.js"] - }, - "allowedHostsCss": ["uczen.eduvulcan.pl", "dziennik-uczen.vulcan.net.pl"] - }, - { - "name": "Hide weekends in monthly calendars", - "description": "Hides weekends in monthly calendars in timetable, exams and homework views.", - "files": { - "css": ["hideWeekends.css"] - }, - "allowedHostsCss": ["uczen.eduvulcan.pl", "dziennik-uczen.vulcan.net.pl"] - }, - { - "name": "Login and password together", - "description": "Show login and password inputs together on login page.", - "files": { - "js": ["loginPasswordTogether/script.js"], - "css": ["loginPasswordTogether/styles.css"] - }, - "allowedHostsCss": ["eduvulcan.pl", "dziennik-logowanie.vulcan.net.pl"] - }, - { - "name": "Move user options to header", - "description": "Moves user avatar to header that opens dropdown with user options. (mobile only)", - "files": { - "js": ["moveUserOptionsToHeader/script.js"], - "css": ["moveUserOptionsToHeader/styles.css"] - }, - "allowedHostsCss": ["uczen.eduvulcan.pl", "dziennik-uczen.vulcan.net.pl", "wiadomosci.eduvulcan.pl", "dziennik-wiadomosci.vulcan.net.pl"] - }, - { - "name": "Resigned timetable", - "description": "Changes styles and navigation on timetable page. (mobile only)", - "files": { - "js": ["newTimetable/script.js"], - "css": ["newTimetable/styles.css", "apis/bottomDateSelector/styles.css"] - } - } -] \ No newline at end of file diff --git a/app/src/main/assets/ifv/patches/alignDetailedGradesButton.css b/app/src/main/assets/ifv/patches/alignDetailedGradesButton.css deleted file mode 100644 index 358c681..0000000 --- a/app/src/main/assets/ifv/patches/alignDetailedGradesButton.css +++ /dev/null @@ -1,3 +0,0 @@ -.grades__subject { - justify-content: space-between; -} \ No newline at end of file diff --git a/app/src/main/assets/ifv/patches/apis/aside.js b/app/src/main/assets/ifv/patches/apis/aside.js deleted file mode 100644 index 8d8ee24..0000000 --- a/app/src/main/assets/ifv/patches/apis/aside.js +++ /dev/null @@ -1,42 +0,0 @@ -import { waitForRender } from "./waitForElement.js"; - -let asideReads = 0; - -const getAsideElement = async () => { - if (window.asideMode === "hidden" && document.querySelector("aside")) { - return document.querySelector("aside"); - } - - asideReads++; - if (!document.querySelector("aside")) - document.querySelector(".header__hamburger__icon button").click(); - await waitForRender(() => document.querySelector("aside")); - document.querySelector("aside").classList.add("hideAside"); - return document.querySelector("aside"); -}; - -const closeAside = () => { - const closeButton = document.querySelector("aside .close-button"); - if (window.asideMode !== "hidden") { - asideReads--; - if (closeButton && asideReads <= 0) closeButton.click(); - document.querySelector("aside")?.classList?.remove("hideAside"); - } -}; - -export const executeActionOnAside = async (fn) => { - const aside = await getAsideElement(); - await fn(aside) - if (!document.querySelector("aside") && window.asideMode === "hidden") { - document.querySelector(".header__hamburger__icon button").click(); - } else asideReads--; -} - -export const clickOnAside = (selector) => executeActionOnAside((aside) => aside.querySelector(selector)?.click()); - -export const getFromAside = async (fn) => { - const aside = await getAsideElement(); - const result = await fn(aside); - closeAside(); - return result; -}; diff --git a/app/src/main/assets/ifv/patches/apis/bottomDateSelector/index.js b/app/src/main/assets/ifv/patches/apis/bottomDateSelector/index.js deleted file mode 100644 index 7acbe6c..0000000 --- a/app/src/main/assets/ifv/patches/apis/bottomDateSelector/index.js +++ /dev/null @@ -1,217 +0,0 @@ -import { waitForRender } from "../waitForElement.js"; - -const dayNames = [ - "poniedziałek", - "wtorek", - "środa", - "czwartek", - "piątek", - "sobota", - "niedziela", -]; - -const getWeekStartingMonday = (i) => (i === 0 ? 6 : i - 1); - -const getWeek = (date) => { - const DAY = 24 * 60 * 60 * 1000; - const firstDay = new Date(`${date.getFullYear()}-01-01`); - return Math.floor((date.getTime() - firstDay.getTime()) / DAY / 7); -}; - -const isSameWeek = (date, comparedDate) => - getWeek(date) === getWeek(comparedDate); - -const updateReactInput = (input, value) => { - const setValue = Object.getOwnPropertyDescriptor( - Object.getPrototypeOf(input), - "value", - ).set; - const event = new Event("input", { bubbles: true }); - - setValue.call(input, value); - input.dispatchEvent(event); -}; - -export class SelectorRenderer { - constructor(renderContentFn) { - this.renderContent = renderContentFn; - - - this.#render().then(() => console.debug("Rendered date selector")); - } - - #createSelector(dayName) { - const element = document.createElement("div"); - element.innerHTML = ` - -
- - - -
- `; - - const dayDisplay = element.querySelector("span"); - dayDisplay.innerText = dayName; - dayDisplay.addEventListener("click", () => - element.querySelector("input").showPicker(), - ); - - const datePicker = element.querySelector("input"); - datePicker.addEventListener("change", () => - this.#setDay(datePicker.value, datePicker.valueAsDate), - ); - - element - .querySelector("img:first-of-type") - .addEventListener("click", () => this.#setSiblingDay(-1)); - element - .querySelector("img:last-of-type") - .addEventListener("click", () => this.#setSiblingDay(1)); - element.classList.add("date-selector"); - - return element; - } - - #updateSelectorDate(name) { - document.querySelector(".date-selector span").innerText = name; - } - - #getDaysDropdowns() { - return Array.from( - document.querySelectorAll(".app__content .MuiPaper-root"), - ).map((element) => ({ - element, - note: element.querySelector(".plan-zajec__accordion__wolne") - ?.innerText, - day: element.querySelector(".MuiAccordionSummary-content > h2") - ?.innerText, - })); - } - - #isDayListLoaded() { - return !document.querySelector(".spinner") && this.#isWeekChanged(); - } - - #isWeekChanged() { - return ( - !this.firstDayName || - document.querySelector( - ".app__content .MuiPaper-root .MuiAccordionSummary-content > h2", - )?.innerText !== this.firstDayName - ); - } - - async #setDay(value, valueDate) { - if ( - !isSameWeek( - document.querySelector(".week-selector input").valueAsDate, - valueDate, - ) - ) { - this.#setChecking(); - - if (!value || !valueDate) return; - updateReactInput( - document.querySelector(".week-selector input"), - value, - ); - - await waitForRender(() => this.#isDayListLoaded()); - } - - this.currentWeekDay = Math.min( - getWeekStartingMonday(valueDate.getDay()), - this.cachedWeek.length - 1, - ); - await this.#render(); - } - - async #setupAutoRender() { - if (this.observer) return; - this.observer = new MutationObserver(async () => { - const content = await this.renderContent( - this.cachedWeek[this.currentWeekDay], - ); - content.classList.add("day-content"); - document.querySelector(".day-content").replaceWith(content); - }); - - this.observer.observe( - document.querySelector( - ".content-container__tab-subheader:has(.week-selector) + div", - ), - { - childList: true, - subtree: true, - }, - ); - } - - async #render() { - let replaceable = document.querySelector(".day-content"); - if (!replaceable) { - replaceable = document.createElement("div"); - document - .querySelector("section.app__content .mobile__frame") - .appendChild(replaceable); - } - - this.cachedWeek = this.#getDaysDropdowns(); - - if (this.currentWeekDay === undefined) { - const today = new Date() - const day = getWeekStartingMonday(today.getDay()) - this.currentWeekDay = this.cachedWeek.findIndex((timetableDay) => (timetableDay.day || "-, ").split(", ")[0].toLowerCase() === dayNames[day]); - } - - const content = await this.renderContent( - this.cachedWeek[this.currentWeekDay], - ); - content.classList.add("day-content"); - replaceable.replaceWith(content); - - if (document.querySelector(".date-selector")) { - this.#updateSelectorDate(this.cachedWeek[this.currentWeekDay].day); - } else - document - .querySelector("section.app__content .mobile__frame") - .appendChild( - this.#createSelector( - this.cachedWeek[this.currentWeekDay].day, - ), - ); - - this.#setupAutoRender(); - } - - #setChecking() { - this.firstDayName = this.cachedWeek[0].day; - } - - async #setSiblingDay(direction = 1) { - this.#setChecking(); - document.querySelector("#root").scroll(0, 0); - - const target = this.currentWeekDay + direction; - if (target >= this.cachedWeek.length || target < 0) { - if (target < 0) { - this.currentWeekDay = 4; - document - .querySelector(".week-selector > button:first-of-type") - .click(); - } else { - this.currentWeekDay = 0; - document - .querySelector(".week-selector > button:last-of-type") - .click(); - } - - await waitForRender(() => this.#isDayListLoaded()); - } else { - this.currentWeekDay = target; - } - - await this.#render(); - } -} diff --git a/app/src/main/assets/ifv/patches/apis/bottomDateSelector/styles.css b/app/src/main/assets/ifv/patches/apis/bottomDateSelector/styles.css deleted file mode 100644 index 553bb8f..0000000 --- a/app/src/main/assets/ifv/patches/apis/bottomDateSelector/styles.css +++ /dev/null @@ -1,37 +0,0 @@ -.date-selector > div { - height: 40px; - position: fixed; - margin-bottom: var(--bottom-navbar-height); - bottom: 0; - width: 100vw; - left: 0; - display: flex; - justify-content: space-between; - background: var(--background-navigation); - border-top: 2px solid #e5e7e9; - z-index: 100; - align-items: center; -} - -.date-selector > input { - display: none; -} - -div#root:has(.date-selector) { - height: calc(100svh - 60px - var(--bottom-navbar-height) - 40px); -} - -.date-selector > div > img { - filter: invert(0.8); - height: 35px; - cursor: pointer; -} - -.date-selector > div > span { - font-size: 15px; - cursor: pointer; -} - -body:has(.date-selector):not(:has(.modal)) .bottom-navigation-bar { - border-top: 0 !important; -} diff --git a/app/src/main/assets/ifv/patches/apis/getUserData.js b/app/src/main/assets/ifv/patches/apis/getUserData.js deleted file mode 100644 index 7d129c4..0000000 --- a/app/src/main/assets/ifv/patches/apis/getUserData.js +++ /dev/null @@ -1,28 +0,0 @@ -import { waitForRender } from "./waitForElement.js"; -import { getFromAside } from "./aside.js"; - -export const getUserData = async () => { - return await getFromAside(async () => { - await waitForRender( - () => - document.querySelector( - window.location.hostname.includes("wiadomosci") - ? ".account__name span" - : ".side_important-text.side_student", - ) && document.querySelector(".user div:nth-child(2)"), - ); - - return { - fullName: window.location.hostname.includes("wiadomosci") - ? document - .querySelector(".account__name span") - ?.firstChild?.textContent?.split(" ") - .reverse() - .join(" ") - : document.querySelector(".side_important-text.side_student") - ?.textContent, - username: document.querySelector(".user div:nth-child(2)").lastChild - .textContent, - }; - }); -}; diff --git a/app/src/main/assets/ifv/patches/apis/waitForElement.js b/app/src/main/assets/ifv/patches/apis/waitForElement.js deleted file mode 100644 index b20b636..0000000 --- a/app/src/main/assets/ifv/patches/apis/waitForElement.js +++ /dev/null @@ -1,15 +0,0 @@ -export const waitForRender = async (fn, target = document.body) => { - let resolve; - const wait = new Promise((r) => (resolve = r)); - const observer = new MutationObserver((mutations, observer) => { - if (!fn()) return; - resolve(); - observer.disconnect(); - }); - observer.observe(target, { subtree: true, childList: true }); - - const lastTry = fn(); - if (!lastTry) { - await wait; - } -}; diff --git a/app/src/main/assets/ifv/patches/arrows.css b/app/src/main/assets/ifv/patches/arrows.css deleted file mode 100644 index 993f7e5..0000000 --- a/app/src/main/assets/ifv/patches/arrows.css +++ /dev/null @@ -1,51 +0,0 @@ -@media screen and (max-width: 1023px) { - .modal__header { - font-family: - "WorkSans", - Graphik, - -apple-system, - BlinkMacSystemFont, - "Segoe UI", - Helvetica, - Arial, - sans-serif, - "Apple Color Emoji", - "Segoe UI Emoji", - "Segoe UI Symbol" !important; - background: white !important; - border-bottom: 2px solid #e5e7e9 !important; - min-height: 60px !important; - color: black !important; - } - - .modal__title { - padding: 17.5px 48px !important; - } - - .close-button:not(aside .close-button) { - background-color: white !important; - box-shadow: none !important; - position: absolute !important; - top: calc((60px - 40px) / 2) !important; - cursor: pointer; - padding: 0 !important; - margin: 0 0 0 10px !important; - border: none !important; - width: 40px !important; - height: 40px !important; - } - - .close-button:not(aside .close-button) > span:first-of-type { - display: none !important; - } - - .close-button:not(aside .close-button) > span:last-of-type { - content: url("https://raw.githubusercontent.com/banocean/ifv/main/assets/icons/keyboard_backspace_24dp_E8EAED_FILL0_wght400_GRAD0_opsz24.svg"); - filter: invert(0.8); - height: 40px; - } - - .close-button:not(aside .close-button) > span > svg { - display: none !important; - } -} diff --git a/app/src/main/assets/ifv/patches/attendance/styles.css b/app/src/main/assets/ifv/patches/attendance/styles.css deleted file mode 100644 index 0710de3..0000000 --- a/app/src/main/assets/ifv/patches/attendance/styles.css +++ /dev/null @@ -1,23 +0,0 @@ -.attendance-tabs > button:disabled { - opacity: 50%; -} - -.attendance-tabs > button:first-of-type { - margin-right: 10px; -} - -.tabsview.stats > div:first-of-type { - display: none !important; -} - -.tabsview.stats > .tabsview__tabs > div > div > div:not(:last-of-type) { - display: none; -} - -.tabsview.attendance-init:not(.stats) > .tabsview__tabs > div > div > div:last-of-type { - display: none; -} - -.tabsview.attendance-init > div:first-of-type { - margin-top: 10px; -} diff --git a/app/src/main/assets/ifv/patches/attendance/tabs.js b/app/src/main/assets/ifv/patches/attendance/tabs.js deleted file mode 100644 index 006e278..0000000 --- a/app/src/main/assets/ifv/patches/attendance/tabs.js +++ /dev/null @@ -1,47 +0,0 @@ -const selector = document.createElement("div") -selector.innerHTML = - ''; -selector.classList.add("attendance-tabs") - -const createSelector = () => { - document.querySelector("h1").replaceWith(selector) - changeStatsVisibility(false) -} - -const changeStatsVisibility = (isStatsVisible) => { - const mainStats = document.querySelector(".content-container:has(.statistics)") - mainStats.style.display = isStatsVisible ? "block" : "none" - const element = document.querySelector(".tabsview") - element.classList.add("attendance-init") - if (isStatsVisible) element.classList.add("stats") - else element.classList.remove("stats") -} - -selector.querySelector("button:first-of-type").addEventListener("click", () => { - changeStatsVisibility(false) - - selector.querySelector("button:first-of-type").disabled = true - selector.querySelector("button:last-of-type").disabled = false -}) - -selector.querySelector("button:last-of-type").addEventListener("click", () => { - changeStatsVisibility(true) - - selector.querySelector("button:first-of-type").disabled = false - selector.querySelector("button:last-of-type").disabled = true -}) - -const isAttendancePage = () => window.location.pathname.endsWith("frekwencja") - -const isRendered = () => - !!document.querySelector(".content-container:has(.statistics)") - && !!document.querySelector(".tabsview") - && !!document.querySelector("h1") - - -window.appendModule({ - isLoaded: isRendered, - run: createSelector, - onlyOnReloads: false, - doesRunHere: isAttendancePage -}) diff --git a/app/src/main/assets/ifv/patches/cleanUpEduVulcanHome.css b/app/src/main/assets/ifv/patches/cleanUpEduVulcanHome.css deleted file mode 100644 index f700777..0000000 --- a/app/src/main/assets/ifv/patches/cleanUpEduVulcanHome.css +++ /dev/null @@ -1,24 +0,0 @@ -/* app download links, eduvulcan banner, maziaj */ -.box-app, .carousel-area, .ribbon-bg { - display: none !important; -} - -.part-business-content-bottom { - padding-left: 0 !important; -} - -.main-content { - flex-direction: column; - flex: inherit !important; -} - -.part-constant, .part-business { - flex: 0 !important; - padding: 0 !important; -} - -.part-business { order: 2 !important; } - -.header-part-2 { - min-width: inherit !important; -} \ No newline at end of file diff --git a/app/src/main/assets/ifv/patches/displayFullName.js b/app/src/main/assets/ifv/patches/displayFullName.js deleted file mode 100644 index 4b1a5bc..0000000 --- a/app/src/main/assets/ifv/patches/displayFullName.js +++ /dev/null @@ -1,43 +0,0 @@ -const isMessagesPage = () => window.location.hostname.match( - /(dziennik-)?wiadomosci.*/, -); - -function getStudentData() { - return isMessagesPage() - ? document - .querySelector(".account__name span") - ?.firstChild?.textContent?.split(" ") - .reverse() - .join(" ") - : document.querySelector(".side_student")?.firstChild?.textContent; -} - -function displayFullName() { - const studentData = getStudentData(); - - if (!studentData) return; - - const studentNameSpan = document.createElement("span"); - studentNameSpan.style = "font-size: 20px;"; - studentNameSpan.innerHTML = `${studentData}`; - - const usernameContainer = document.querySelector( - ".user div:nth-of-type(2)", - ); - usernameContainer.style = - "display: flex; flex-direction: column; font-size: 16px;"; - - usernameContainer.insertBefore( - studentNameSpan, - usernameContainer.firstChild, - ); -} - -window.appendModule({ - isLoaded: () => document.querySelector( - `.${isMessagesPage() ? "account__name span" : "side_student"}`, - ), - onlyOnReloads: true, - run: displayFullName, - doesRunHere: () => !!window.location.hostname.match(/^(dziennik-)?(wiadomosci|uczen).*/) -}) diff --git a/app/src/main/assets/ifv/patches/fixResizing.js b/app/src/main/assets/ifv/patches/fixResizing.js deleted file mode 100644 index 2016c3c..0000000 --- a/app/src/main/assets/ifv/patches/fixResizing.js +++ /dev/null @@ -1,13 +0,0 @@ -const startingWidth = window.innerWidth - -const startListening = () => { - addEventListener("resize", () => { - if (startingWidth < 1024 !== window.innerWidth < 1024) window.location.reload() - }); -} - -window.appendModule({ - run: startListening, - onlyOnReloads: true, - doesRunHere: () => window.location.hostname !== "eduvulcan.pl" -}) diff --git a/app/src/main/assets/ifv/patches/hideEmptyExamResults.css b/app/src/main/assets/ifv/patches/hideEmptyExamResults.css deleted file mode 100644 index a515548..0000000 --- a/app/src/main/assets/ifv/patches/hideEmptyExamResults.css +++ /dev/null @@ -1,9 +0,0 @@ -.accordion__full-width__one-item:has(#panel-content-egzaminy td[colspan="3"]) { - display: none !important; -} - - -main .app__content:has(.accordion__full-width__one-item #panel-content-egzaminy td[colspan="3"]) .content-container.content-container__pure > div:nth-child(2) { - border-bottom-left-radius: 10px; - border-bottom-right-radius: 10px; -} \ No newline at end of file diff --git a/app/src/main/assets/ifv/patches/hideFooter.css b/app/src/main/assets/ifv/patches/hideFooter.css deleted file mode 100644 index c355dff..0000000 --- a/app/src/main/assets/ifv/patches/hideFooter.css +++ /dev/null @@ -1,5 +0,0 @@ -@media screen and (max-width: 1023px) { - .app__footer__container { - display: none; - } -} diff --git a/app/src/main/assets/ifv/patches/hideHelpOnDashboard.css b/app/src/main/assets/ifv/patches/hideHelpOnDashboard.css deleted file mode 100644 index 7041090..0000000 --- a/app/src/main/assets/ifv/patches/hideHelpOnDashboard.css +++ /dev/null @@ -1,3 +0,0 @@ -#kafel-pomoc-pomigracyjna { - display: none !important; -} \ No newline at end of file diff --git a/app/src/main/assets/ifv/patches/hideSubjectsWithNoGrades/finalGrades.js b/app/src/main/assets/ifv/patches/hideSubjectsWithNoGrades/finalGrades.js deleted file mode 100644 index 5ccb30f..0000000 --- a/app/src/main/assets/ifv/patches/hideSubjectsWithNoGrades/finalGrades.js +++ /dev/null @@ -1,62 +0,0 @@ -import { waitForRender } from "../apis/waitForElement.js"; - -const SEMESTERS = 2; -const renderVisibilityButtons = () => { - for (let i = 0; i < SEMESTERS; i++) { - hideEmptyFinalGradesInfo(i); - } -}; - -const getSemestersContainer = () => - document.querySelector( - "section > section > .mobile__frame > .content-container", - ).children; -const getRowValue = (node) => - node?.querySelector(".info-text > span")?.innerText?.trim(); - -const hideEmptyFinalGradesInfo = async (i) => { - await waitForRender( - () => getSemestersContainer()[i].querySelector("article"), - document.querySelector( - "section > section > .mobile__frame > .content-container", - ), - ); - const container = getSemestersContainer()[i]; - const subjects = container.querySelectorAll("article"); - for (const subject of subjects) { - const finalGrades = subject.querySelector( - ".tile__content:last-of-type", - ); - const predictedFinalGrade = finalGrades.children[0]; - const finalGrade = finalGrades.children[1]; - - const predictedFinalGradeValue = getRowValue(predictedFinalGrade); - const finalGradeValue = getRowValue(finalGrade); - - if (predictedFinalGrade && !predictedFinalGradeValue) - predictedFinalGrade.style.display = "none"; - if (finalGrade && !finalGradeValue) { - if (predictedFinalGrade) - predictedFinalGrade.style.borderBottom = "none"; - finalGrade.style.display = "none"; - } - - if (!finalGradeValue && !predictedFinalGradeValue) { - finalGrades.style.display = "none"; - subject.querySelector( - ".tile__content.border-b-1", - ).style.borderBottom = "none"; - } - } -}; - -window.appendModule({ - run: renderVisibilityButtons, - onlyOnReloads: false, - doesRunHere: () => - window.location.pathname.endsWith("oceny") && window.innerWidth < 1024, - isLoaded: () => - document.querySelector( - "section > section > .mobile__frame > .content-container", - ), -}); diff --git a/app/src/main/assets/ifv/patches/hideSubjectsWithNoGrades/normalGrades.css b/app/src/main/assets/ifv/patches/hideSubjectsWithNoGrades/normalGrades.css deleted file mode 100644 index 28d2267..0000000 --- a/app/src/main/assets/ifv/patches/hideSubjectsWithNoGrades/normalGrades.css +++ /dev/null @@ -1,7 +0,0 @@ -article.grades__box:has(.tile__content:first-of-type:empty) { - display: none !important; -} - -tbody.p-datatable-tbody > tr:has(.wider--oceny:empty) { - display: none !important; -} diff --git a/app/src/main/assets/ifv/patches/hideTutorsFromBoard.css b/app/src/main/assets/ifv/patches/hideTutorsFromBoard.css deleted file mode 100644 index 0903ea0..0000000 --- a/app/src/main/assets/ifv/patches/hideTutorsFromBoard.css +++ /dev/null @@ -1,3 +0,0 @@ -.tile:has(.tile__content .tile__teachers) { - display: none !important; -} \ No newline at end of file diff --git a/app/src/main/assets/ifv/patches/hideWCAG.css b/app/src/main/assets/ifv/patches/hideWCAG.css deleted file mode 100644 index 15785a9..0000000 --- a/app/src/main/assets/ifv/patches/hideWCAG.css +++ /dev/null @@ -1,3 +0,0 @@ -.wcag-mobile, .wcag-tools, .wcag-controls { - display: none !important; -} \ No newline at end of file diff --git a/app/src/main/assets/ifv/patches/hideWeekends.css b/app/src/main/assets/ifv/patches/hideWeekends.css deleted file mode 100644 index ce1912f..0000000 --- a/app/src/main/assets/ifv/patches/hideWeekends.css +++ /dev/null @@ -1,32 +0,0 @@ -.plan-scheduler__body-cell:nth-of-type(6), -.plan-scheduler__body-cell:nth-of-type(7), -.plan-scheduler__header-cell:nth-of-type(6), -.plan-scheduler__header-cell:nth-of-type(7), -.scheduler-simple__header-cell:nth-of-type(6), -.scheduler-simple__header-cell:nth-of-type(7), -.scheduler-simple__body-cell:nth-of-type(6), -.scheduler-simple__body-cell:nth-of-type(7), -.scheduler__body-cell:nth-of-type(6), -.scheduler__body-cell:nth-of-type(7), -.scheduler__header-cell:nth-of-type(6), -.scheduler__header-cell:nth-of-type(7), -.frequency-scheduler__body-cell:nth-of-type(6), -.frequency-scheduler__body-cell:nth-of-type(7), -.frequency-scheduler__header-cell:nth-of-type(6), -.frequency-scheduler__header-cell:nth-of-type(7) { - display: none !important; -} - -.plan-scheduler-cell__unavailable > div, -.scheduler-simple-cell--disabled > div, -.frequency-scheduler-cell--unavailable > div { - min-height: 0 !important; - padding: 0 !important; -} - -.plan-scheduler-cell__unavailable, -.scheduler-simple-cell--disabled, -.frequency-scheduler-cell--unavailable { - padding: 0 !important; - margin: 0 !important; -} diff --git a/app/src/main/assets/ifv/patches/loginPasswordTogether/script.js b/app/src/main/assets/ifv/patches/loginPasswordTogether/script.js deleted file mode 100644 index c0cbba7..0000000 --- a/app/src/main/assets/ifv/patches/loginPasswordTogether/script.js +++ /dev/null @@ -1,43 +0,0 @@ -function setAutocomplete() { - document.querySelector("#Login")?.setAttribute("autocomplete", "username"); - document - .querySelector("#Haslo") - ?.setAttribute("autocomplete", "current-password"); -} - -function hideBtNext() { - document.querySelector("#btNext").remove(); -} - -function moveEVLinks() { - const linksEl = document.querySelector("#wizard1 > div > .flex-row:has(a)"); - document.querySelector("#wizard2").appendChild(linksEl); -} - -function swapLoginInput() { - const wizard2 = document.querySelector("#wizard2"); - wizard2.parentElement.insertBefore( - document.querySelector("#wizard1"), - wizard2, - ); - // Force firefox to check inputs again - const centerBox = document.querySelector(".center-box"); - centerBox.innerHTML = centerBox.innerHTML; -} - -function fixLoginPage() { - setAutocomplete(); - hideBtNext(); - if (window.location.hostname === "eduvulcan.pl") moveEVLinks(); - swapLoginInput(); -} - -window.appendModule({ - isLoaded: () => document.querySelector("#Haslo"), - onlyOnReloads: true, - run: fixLoginPage, - doesRunHere: () => - ["eduvulcan.pl", "dziennik-logowanie.vulcan.net.pl"].includes( - window.location.hostname, - ), -}); diff --git a/app/src/main/assets/ifv/patches/loginPasswordTogether/styles.css b/app/src/main/assets/ifv/patches/loginPasswordTogether/styles.css deleted file mode 100644 index fff6f90..0000000 --- a/app/src/main/assets/ifv/patches/loginPasswordTogether/styles.css +++ /dev/null @@ -1,20 +0,0 @@ -#wizard1 { - order: 2; - display: block !important; -} - -.form-focused-subtitle, -.form-subtitle, -#wizard1 > .flex-col.form-gap.form-margin, -#wizard1 > .flex-col.gap-3.my-2 { - display: none !important; -} - -#wizard2 { - order: 3; - display: block !important; -} - -#btPrev { - display: none; -} diff --git a/app/src/main/assets/ifv/patches/messagesButton.js b/app/src/main/assets/ifv/patches/messagesButton.js deleted file mode 100644 index 815acf7..0000000 --- a/app/src/main/assets/ifv/patches/messagesButton.js +++ /dev/null @@ -1,33 +0,0 @@ -import { waitForRender } from "./apis/waitForElement.js"; -import { getFromAside } from "./apis/aside.js"; - -async function move() { - const inner = await getFromAside( - async () => { - await waitForRender(() => document.querySelector(".messages")) - return document.querySelector(".messages")?.innerHTML - } - ) - - const messages = document.createElement("div"); - messages.innerHTML = inner; - messages.style.float = "right"; - messages.style.padding = "20px"; - messages.style.marginLeft = "auto"; - messages.querySelector( - ".MuiBadge-anchorOriginTopRightRectangle", - ).style.transitionDuration = "0ms"; - - document - .querySelector(".header_logo_tools-container") - .appendChild(messages); -} - -window.appendModule({ - run: move, - doesRunHere: () => - window.location.hostname.match(/^(dziennik-)?(uczen).*/) && - window.innerWidth < 1024, - onlyOnReloads: true, - isLoaded: () => !!document.querySelector(".header__hamburger__icon") -}); diff --git a/app/src/main/assets/ifv/patches/moveUserOptionsToHeader/script.js b/app/src/main/assets/ifv/patches/moveUserOptionsToHeader/script.js deleted file mode 100644 index 13ba31f..0000000 --- a/app/src/main/assets/ifv/patches/moveUserOptionsToHeader/script.js +++ /dev/null @@ -1,92 +0,0 @@ -import { waitForRender } from "../apis/waitForElement.js"; -import { executeActionOnAside, getFromAside } from "../apis/aside.js"; -import { getUserData } from "../apis/getUserData.js"; - -const toggleModal = () => { - document.querySelector(".modal-background").classList.toggle("active"); - document.querySelector(".modal-user").classList.toggle("active"); -}; - -const moveUserOptionsToHeader = async () => { - const userLinks = await getFromAside(async () => { - const user = document.querySelector(".user"); - if (user) { - user.click(); - await waitForRender(() => - document.querySelector(".user__links a"), - ); - return document.querySelectorAll(".user__links a"); - } - }); - const userData = await getUserData(); - - const modalBackground = document.createElement("div"); - const modalElement = document.createElement("div"); - - modalBackground.classList.add("modal-background"); - modalElement.classList.add("modal-user"); - - const userDataElement = document.createElement("div"); - userDataElement.classList.add("modal-data"); - - const userAvatar = document.createElement("div"); - userAvatar.innerHTML = `${userData.fullName[0]}`; - userAvatar.classList.add("user-avatar"); - userDataElement.appendChild(userAvatar.cloneNode(true)); - - const nameElement = document.createElement("div"); - nameElement.classList.add("modal-name"); - nameElement.innerHTML = `${userData?.fullName}${userData?.username}`; - userDataElement.appendChild(nameElement); - - modalElement.appendChild(userDataElement); - - userLinks.forEach((link, i) => { - const linkContainer = document.createElement("div"); - linkContainer.classList.add("modal-link-container"); - - const linkText = document.createElement("span"); - linkText.innerHTML = link.textContent; - - linkText.addEventListener("click", () => { - executeActionOnAside(async () => { - document.querySelector(".user").click(); - await waitForRender(() => document.querySelector(".user__links")); - document.querySelectorAll(".user__links a")[i].click() - }) - toggleModal(); - }); - - linkContainer.appendChild(linkText); - modalElement.appendChild(linkContainer); - }); - - const backButtonContainer = document.createElement("div"); - backButtonContainer.classList.add("modal-back-container"); - const backButton = document.createElement("span"); - backButton.classList.add("modal-cancel"); - backButton.innerHTML = "Anuluj"; - backButtonContainer.appendChild(backButton); - modalElement.appendChild(backButtonContainer); - - modalBackground.addEventListener("click", toggleModal); - backButton.addEventListener("click", toggleModal); - userAvatar.addEventListener("click", toggleModal); - - document.body.appendChild(modalElement); - document.body.appendChild(modalBackground); - document - .querySelector(".header_logo_tools_user-wrapper") - .appendChild(userAvatar); -}; - -window.appendModule({ - isLoaded: () => - document.querySelector(".header__logo-product")?.firstChild && - document.querySelector(".header__hamburger__icon button"), - onlyOnReloads: true, - run: moveUserOptionsToHeader, - doesRunHere: () => - !!window.location.hostname.match(/^(dziennik-)?(wiadomosci|uczen).*/) && - window.innerWidth < 1024, -}); diff --git a/app/src/main/assets/ifv/patches/moveUserOptionsToHeader/styles.css b/app/src/main/assets/ifv/patches/moveUserOptionsToHeader/styles.css deleted file mode 100644 index 4289542..0000000 --- a/app/src/main/assets/ifv/patches/moveUserOptionsToHeader/styles.css +++ /dev/null @@ -1,123 +0,0 @@ -@media screen and (max-width: 1023px) { - .user__section, - div:has(.user__links__conatainer) { - display: none !important; - } - - .app.hideAside aside { - display: none !important; - } - - .header_logo_tools_user-wrapper img { - width: 45px; - height: 45px; - margin-right: 10px; - cursor: pointer; - } - - .modal-background { - display: none; - position: absolute; - top: 0; - left: 0; - width: 100vw; - height: 100%; - background-color: rgba(0, 0, 0, 0.5); - z-index: 9999; - } - - .modal-background.active { - display: block !important; - } - - .modal-user { - display: none; - top: 50%; - left: 50%; - position: absolute; - overflow: hidden; - transform: translate(-50%, -50%); - - width: 80vw; - max-width: 400px; - height: min-content !important; - max-height: min-content !important; - border-radius: 10px; - background-color: #fff; - z-index: 10000; - padding: 10px; - } - - .modal-user.active { - display: block !important; - } - - .modal-data { - display: flex; - align-items: center; - gap: 10px; - padding: 10px 20px; - margin-bottom: 10px; - } - - .modal-name { - display: flex; - flex-direction: column; - padding-left: none; - gap: 5px; - } - - .modal-link-container, - .modal-back-container { - display: flex; - align-items: center; - padding: 10px 20px; - cursor: pointer; - } - - .modal-back-container { - justify-content: flex-end; - } - - .modal-link-container span { - padding: 0; - font-size: 1.2rem; - font-weight: 500; - text-decoration: none; - color: #3d4455; - } - - .modal-cancel { - text-align: right; - color: #e33f4a; - font-size: 1.2rem; - font-weight: 500; - cursor: pointer; - } - - .header__logo-product > img { - width: auto !important; - } - - header.app__header { - height: 60px; - } - - body.blue .user-avatar { - background: #38817f !important; - color: #ffffff; - } - - .user-avatar { - background: #f8d6d8; - height: 40px; - width: 40px; - border-radius: 50%; - margin-right: 16px; - display: flex; - justify-content: center; - align-items: center; - cursor: pointer; - font-size: 1.8rem; - } -} diff --git a/app/src/main/assets/ifv/patches/newMobileNavbar/highlights.js b/app/src/main/assets/ifv/patches/newMobileNavbar/highlights.js deleted file mode 100644 index 4b131c1..0000000 --- a/app/src/main/assets/ifv/patches/newMobileNavbar/highlights.js +++ /dev/null @@ -1,23 +0,0 @@ -export const setHighlights = () => { - let i; - if (document.querySelector(".more-popup").style.display === "block") i = 4 - else if (window.location.pathname.endsWith("tablica")) i = 0 - else if (window.location.pathname.endsWith("oceny")) i = 1 - else if (window.location.pathname.endsWith("frekwencja")) i = 2 - else if (window.location.pathname.endsWith("planZajec")) i = 3 - - const buttons = Array.from(document.querySelector(".bottom-navigation-bar").children) - for (let j = 0; j < buttons.length; j++) { - const button = buttons[j] - const img = button.querySelector("div > img"); - if (i === j) img.classList.add("highlight") - else img.classList.remove("highlight") - } -} - -window.appendModule({ - run: setHighlights, - onlyOnReloads: false, - isLoaded: () => document.querySelector(".bottom-navigation-bar")?.children?.length, - doesRunHere: () => window.location.hostname.match(/^(dziennik-)?(uczen).*/) && window.innerWidth < 1024, -}) \ No newline at end of file diff --git a/app/src/main/assets/ifv/patches/newMobileNavbar/index.js b/app/src/main/assets/ifv/patches/newMobileNavbar/index.js deleted file mode 100644 index c6306d5..0000000 --- a/app/src/main/assets/ifv/patches/newMobileNavbar/index.js +++ /dev/null @@ -1,145 +0,0 @@ -import { getFromAside } from "../apis/aside.js"; -import { waitForRender } from "../apis/waitForElement.js"; -import { setHighlights } from "./highlights.js"; - -if (window.location.hostname.match(/^(dziennik-)?(uczen).*/)) window.asideMode = "hidden" - -const getPages = (selector = "aside > section > .MuiList-root > ul") => { - if (!document.querySelector("aside")) return [] - return Array.from( - document.querySelector(selector).children - ).map((item) => { - const isDirectLink = item.classList.contains("MuiListItem-gutters") - const icon = getComputedStyle( - isDirectLink ? item : item.querySelector("div > button"), ":before" - ).getPropertyValue("content"); - const name = item.querySelector( - isDirectLink ? "a" : ".accordion__title__content" - )?.innerText - - const items = isDirectLink ? undefined : - Array.from(item.querySelector(".items").children) - - return { - type: isDirectLink ? 1 : 2, - element: item, - items, - icon, - name - } - }) -} - -const BACK_ICON_URL = "https://raw.githubusercontent.com/banocean/ifv/new-navbar/assets/icons/keyboard_backspace_24dp_E8EAED_FILL0_wght400_GRAD0_opsz24.svg" - -const navIcons = { - "tablica": "dashboard", - "oceny": "counter_6", - "frekwencja": "event_available", - "planZajec": "calendar_clock" -} - -const run = async () => { - const nav = document.createElement("nav") - nav.classList.add("bottom-navigation-bar") - - const more = document.createElement("div") - more.classList.add("more-popup") - more.classList.add("list-modal") - more.innerHTML = `

Więcej

` - more.style.display = "none" - - more.querySelector("img").addEventListener("click", () => { - more.style.display = "none" - setHighlights() - }) - - await getFromAside(() => null) // We need aside to just load - await waitForRender(() => getPages().length > 1) - - const navPages = ["tablica", "oceny", "frekwencja", "planZajec"] - const pages = getPages() - for (const page of pages) { - const itemClass = Array.from(page.element.classList) - .find((c) => !["MuiListItem-root", "MuiListItem-gutters", "selected"].includes(c)) - const item = document.createElement("div") - - if (!navPages.includes(itemClass)) { - item.innerHTML = "
" - item.querySelector(".icon").style.content = page.icon - item.querySelector(".name").innerText = page.name - more.querySelector("div:last-of-type").appendChild(item) - } else { - item.innerHTML = `
` - item.querySelector("div:last-of-type").innerText = page.name - nav.appendChild(item) - } - - if (page.type === 1) { - item.addEventListener("click", () => { - document.querySelector(`.${itemClass} a`).click() - more.style.display = "none" - document.querySelector(".header__hamburger__icon button").click() - document.querySelector("div#root").scroll(0,0) - setHighlights() - }) - } else { - const detailedOptionsPage = document.createElement("div") - detailedOptionsPage.innerHTML = `

` - detailedOptionsPage.style.zIndex = "4002" - detailedOptionsPage.style.display = "none" - detailedOptionsPage.classList.add("list-modal") - - detailedOptionsPage.querySelector("h1").innerText = page.name - detailedOptionsPage.querySelector("img").addEventListener("click", () => { - detailedOptionsPage.style.display = "none" - }) - - for (let i = 0; i < page.items.length; i++) { - const option = page.items[i] - const element = document.createElement("div") - element.innerHTML = "
" - element.querySelector(".icon").style.content = page.icon - element.querySelector(".name").innerText = option.firstChild.innerText - element.addEventListener("click", () => { - Array.from(document.querySelectorAll(`.${itemClass} .items a`))[i].click() - detailedOptionsPage.style.display = "none" - more.style.display = "none" - document.querySelector(".header__hamburger__icon button").click() - document.querySelector("div#root").scroll(0,0) - }) - detailedOptionsPage.lastElementChild.appendChild(element) - } - - item.addEventListener("click", () => { - detailedOptionsPage.style.display = "block" - }) - - document.body.appendChild(detailedOptionsPage) - } - } - - const moreButton = document.createElement("div") - moreButton.innerHTML = ` -
- -
-
Więcej
- ` - moreButton.addEventListener("click", () => { - more.style.display = "block" - setHighlights() - }) - nav.appendChild(moreButton) - - document.body.appendChild(nav) - document.body.appendChild(more) -} - - -window.appendModule({ - run, - doesRunHere: () => window.location.hostname.match(/^(dziennik-)?(uczen).*/) && window.innerWidth < 1024, - onlyOnReloads: true, - isLoaded: () => !!document.querySelector(".header__hamburger__icon") -}) \ No newline at end of file diff --git a/app/src/main/assets/ifv/patches/newMobileNavbar/styles.css b/app/src/main/assets/ifv/patches/newMobileNavbar/styles.css deleted file mode 100644 index 05f8fef..0000000 --- a/app/src/main/assets/ifv/patches/newMobileNavbar/styles.css +++ /dev/null @@ -1,157 +0,0 @@ -:root { - --bottom-navbar-height: 70px; -} - -.list-modal { - height: 100svh; - width: 100%; - position: fixed; - top: 0; - left: 0; - z-index: 4000; - background: #eff2f7; - font-family: "WorkSans", Graphik, -apple-system, BlinkMacSystemFont, "Segoe UI", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; -} - -.list-modal > div:first-of-type { - background: white; - border-bottom: 2px solid #e5e7e9; - height: 60px; - display: flex; - align-items: center; -} - -.list-modal > div:first-of-type > img { - margin-left: 10px; - position: absolute; - filter: invert(0.8); - top: calc((60px - 40px) / 2); - cursor: pointer; - height: 40px; -} - - -.list-modal > div:first-of-type > h1 { - width: 100%; - font-size: 1.8rem; - text-align: center; -} - -.list-modal > div:last-of-type { - overflow-y: auto; - height: calc(100svh - 60px - var(--bottom-navbar-height)); -} - -.list-modal > div:last-of-type > div { - display: flex; - color: black; - font-size: 1.6rem; - cursor: pointer; - padding-inline: 15px; - padding-block: 10px; - fill: black; - border-bottom: 1px solid #e5e7e9; - align-items: center; -} - -.list-modal > div:last-of-type > div > .icon { - filter: invert(0.8); - margin-right: 20px; -} - -.list-modal > div:last-of-type > div > .name { - display: flex; - align-content: center; -} - - - -@media screen and (max-width: 1023px) { - .modal { - width: 100vw !important; - height: calc(100svh - var(--bottom-navbar-height)) !important; - } - - .modal__footer { - background: none !important; - border-top: 0 !important - } - - aside, .header__hamburger__icon { - display: none !important; - } - - .app__aside__mobile + .app__main { - display: block !important; - } - - div#root { - overflow: auto; - height: calc(100svh - 60px - var(--bottom-navbar-height)); - top: 60px; - position: fixed; - } - - header.app__header { - position: fixed; - width: 100%; - top: 0; - } - - .bottom-navigation-bar { - border-top: 2px solid #e5e7e9; - background: white; - display: flex; - justify-content: space-around; - position: fixed; - top: calc(100svh - var(--bottom-navbar-height)); - height: var(--bottom-navbar-height); - width: 100%; - align-items: center; - z-index: 4002; - } - - .bottom-navigation-bar > div { - cursor: pointer; - display: flex; - flex-direction: column; - align-items: center; - text-align: center; - } - - .bottom-navigation-bar > div > div:has(img) { - padding-inline: 15px; - padding-block: 4px; - margin-bottom: 4px; - border-radius: 20px; - width: min-content; - display: flex; - align-items: center; - justify-content: center; - height: 40px; - transition-property: all; - transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); - transition-duration: 300ms; - } - - .bottom-navigation-bar > div > div > img { - transition-property: all; - transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); - transition-duration: 300ms; - height: 25px; - margin: 2px; - } - - .bottom-navigation-bar > div > div:has(img.highlight) { - font-family: "WorkSans", Graphik, -apple-system, BlinkMacSystemFont, "Segoe UI", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; - background: var(--kolor-wcag); - } - - .bottom-navigation-bar > div > div > img:not(.highlight) { - filter: invert(1); - } -} - -main.app__main { - width: 100vw !important; -} \ No newline at end of file diff --git a/app/src/main/assets/ifv/patches/newTimetable/script.js b/app/src/main/assets/ifv/patches/newTimetable/script.js deleted file mode 100644 index 47a985f..0000000 --- a/app/src/main/assets/ifv/patches/newTimetable/script.js +++ /dev/null @@ -1,189 +0,0 @@ -import { waitForRender } from "../apis/waitForElement.js"; -import { SelectorRenderer } from "../apis/bottomDateSelector/index.js"; - -const normalizeLesson = (lesson) => { - const hoursText = ( - lesson.querySelector( - ".position__lesson__hours, .conflicted--details--hours", - )?.innerText || " " - ).split(" "); - const startingHour = hoursText[0]; - const endingHour = hoursText[2]; - - const subjectText = - lesson - .querySelector(".position__lesson__subject") - ?.innerText?.split(/ Grupa-| \|/) || []; - - const annotationText = lesson.querySelector( - ".plan-position__adnotation-title", - )?.innerText; - - const type = lesson.classList.contains("cell--multi--conflicted") - ? "conflicted" - : lesson.querySelector(".zastepstwo") - ? "substitute" - : lesson.querySelector(".odwolane") - ? "canceled" - : annotationText - ? "unknown" - : "normal"; - - return { - originalElement: lesson, - type, - subject: subjectText[0], - group: subjectText[1], - teacher: lesson.querySelector(".position__lesson__teacher")?.innerText, - classroom: [ - ...(lesson.querySelector(".position__lesson__subject + span") - ?.innerText || ""), - ] - .filter((c) => !"()".includes(c)) - .join(""), - annotationText, - startingHour, - endingHour, - }; -}; -const mapDay = (element) => - Array.from( - element.querySelectorAll(".cell--single, .cell--multi--conflicted"), - ).map(normalizeLesson); - -const mapData = () => - Array.from(document.querySelectorAll(".app__content .MuiPaper-root")).map( - (element) => { - return { - note: element.querySelector(".plan-zajec__accordion__wolne") - ?.innerText, - day: element.querySelector(".MuiAccordionSummary-content > h2") - ?.innerText, - lessons: mapDay(element), - }; - }, - ); -const isOpened = (element) => - element.querySelector(".MuiCollapse-root")?.style?.height !== "0px"; - -const openAll = async () => { - const container = document.querySelectorAll(".app__content .MuiPaper-root"); - for (const element of container) { - if (!isOpened(element)) - element.querySelector(".accordion__full-width__header h2")?.click(); - await waitForRender(() => isOpened(element), element); - } -}; - -const mapStartingHours = (data) => { - const all = new Set(); - for (const day of data) - if (day.lessons) - for (const lesson of day.lessons) - if (lesson.startingHour) all.add(lesson.startingHour); - const result = [...all].sort(); - const [firstHour, firstMinutes] = (result[0] || "08:00").split(":"); - return Number(firstHour) <= 7 && Number(firstMinutes) <= 30 - ? result - : ["7:00", ...result]; -}; - -const getStartingHours = () => - JSON.parse(localStorage.getItem("startingHours") || "[]"); - -const renderDay = async (data) => { - await openAll(); - - if (!data.note) { - await waitForRender(() => - document.querySelector(".details-btn--position-r-bottom"), - ); - } - - const startingHours = getStartingHours(); - const lessons = mapDay(data.element); - const element = document.createElement("section"); - element.classList.add("timetable"); - - if (lessons.length < 1) { - const infoElement = document.createElement("div"); - infoElement.innerHTML = - "
Nie ma lekcji 😎
"; - if (data.note) - infoElement.querySelector("span:last-of-type").innerText = - data.note; - element.appendChild(infoElement); - } else { - for (const lesson of lessons) { - const lessonElement = document.createElement("div"); - lessonElement.innerHTML = ` -
${startingHours.findIndex((h) => h === lesson.startingHour)}
-
-
-
-
- `; - const lessonDataElement = lessonElement.querySelector(".data"); - - const timeContainer = lessonElement.querySelector(".info"); - timeContainer.firstElementChild.innerText = lesson.startingHour; - timeContainer.lastElementChild.innerText = lesson.endingHour; - - lessonElement.classList.add("lesson"); - lessonElement.classList.add(lesson.type); - - if (lesson.type === "conflicted") { - lessonDataElement.innerHTML = ` -
Wpisana jest więcej niż jedna lekcja
-
Kliknij, aby wyświetlić
- `; - } else { - lessonDataElement.innerHTML = `
`; - lessonDataElement.querySelector(".subject").innerText = - lesson.subject; - lessonDataElement.querySelector(".additional-info").innerText = - `${lesson.classroom} ${lesson.teacher?.split(" ")?.reverse()?.join(" ")}`; - } - - lessonElement.addEventListener("click", () => - lesson.originalElement.querySelector("button").click(), - ); - element.appendChild(lessonElement); - } - } - - return element; -}; - -const run = async () => { - document.querySelector( - "section.app__content .app__content__header", - ).style.display = "none"; - document.querySelector( - "section.app__content .mobile__frame > div", - ).style.display = "none"; - - await openAll(); - localStorage.setItem( - "startingHours", - JSON.stringify(mapStartingHours(mapData())), - ); - - new SelectorRenderer(renderDay); -}; - -const isLoaded = () => - document.querySelector(".app__content .MuiCollapse-root")?.style - ?.minHeight && - document.querySelector("section.app__content .mobile__frame .plan-zajec") && - !document.querySelector(".spinner") && - document.querySelector( - ".position__lesson__hours, .conflicted--details--hours", - ); - -window.appendModule({ - isLoaded, - onlyOnReloads: false, - run, - doesRunHere: () => window.location.pathname.endsWith("planZajec"), -}); diff --git a/app/src/main/assets/ifv/patches/newTimetable/styles.css b/app/src/main/assets/ifv/patches/newTimetable/styles.css deleted file mode 100644 index d60256c..0000000 --- a/app/src/main/assets/ifv/patches/newTimetable/styles.css +++ /dev/null @@ -1,111 +0,0 @@ -:root { - --background-primary: light-dark(white, #0b1517); - --background-navigation: light-dark(white, #152528); -} - -body { - color-scheme: only light; -} - -.app__main { - background: var(--background-primary) !important; - height: auto; -} - -.timetable { - padding: 0 !important; - margin-inline: 10px !important; -} - -.timetable:not(:has(.lesson)) { - display: flex; - justify-content: center; - align-items: center; - height: calc(100svh - 62px - 40px - 20px - var(--bottom-navbar-height)); - text-align: center; -} - -.timetable .no-lessons-title { - font-size: 24px; -} - -.timetable .lesson { - display: flex; - margin-bottom: 5px; - line-height: 16px; -} - -.lesson > div:first-of-type { - font-size: 30px; - display: flex; - align-items: center; - color: light-dark(#1b1b1f, #f5feff); - min-width: 18px; -} - -.lesson > article { - display: flex; - padding: 15px; - align-content: center; - border-radius: 10px; - width: 100%; - margin-left: 10px; - cursor: pointer; - background: light-dark(#efedf1, #192123); - overflow: hidden; -} - -.lesson .subject { - color: light-dark(#1b1b1f, #dbe4e7); - font-size: 13px; - overflow: hidden; - text-overflow: ellipsis; - text-wrap: nowrap !important; -} - -.lesson .data { - overflow: inherit; -} - -.lesson .info { - display: flex; - flex-direction: column; - margin-right: 10px; - color: #a1aaac; -} - -.lesson .additional-info { - color: #a1aaac; - font-size: smaller; -} - -.lesson.canceled > article { - background: light-dark(#f9dedc, #8c1d18); -} - -.lesson.canceled .subject { - text-decoration: line-through; - color: light-dark(#410e0b, #f9dedc); -} - -.lesson.canceled .info, -.lesson.canceled .additional-info { - color: light-dark(#784c4a, #d9a5a1); -} - -.lesson.canceled > div:first-of-type { - color: light-dark(#b3261e, #f2b8b5); -} - -.lesson.substitute > article { - background: light-dark(#e7e4bd, #65683c); -} - -.lesson.substitute .info, -.lesson.substitute .additional-info { - color: light-dark(#58574e, #b8bfb4); -} - -.lesson.substitute > div:first-of-type { - color: light-dark(#6d5e0f, #65683c); -} diff --git a/app/src/main/assets/ifv/patches/pwa.js b/app/src/main/assets/ifv/patches/pwa.js deleted file mode 100644 index 2e4987c..0000000 --- a/app/src/main/assets/ifv/patches/pwa.js +++ /dev/null @@ -1,35 +0,0 @@ -function injectWebManifest() { - const metaLink = document.createElement("link"); - - metaLink.setAttribute("rel", "manifest"); - metaLink.setAttribute("href", getManifestLink(window.location.hostname)); - - document.head.appendChild(metaLink); -} - -function getManifestLink(hostname) { - switch (hostname) { - case "eduvulcan.pl": - return "https://raw.githubusercontent.com/banocean/ifv/main/pwa/manifest-eduvulcan.json"; - case "uczen.eduvulcan.pl": - return `https://ifv-pwa.banocean.com/eduvulcan/${ - window.location.pathname.split("/")[1] - }`; - case "dziennik-uczen.vulcan.net.pl": - return `https://ifv-pwa.banocean.com/dziennik/${ - window.location.pathname.split("/")[1] - }`; - } -} - -window.appendModule({ - isLoaded: () => true, - onlyOnReloads: true, - run: injectWebManifest, - doesRunHere: () => - [ - "eduvulcan.pl", - "uczen.eduvulcan.pl", - "dziennik-uczen.vulcan.net.pl", - ].includes(window.location.hostname), -}); diff --git a/app/src/main/assets/ifv/patches/redirectToBoard/script.js b/app/src/main/assets/ifv/patches/redirectToBoard/script.js deleted file mode 100644 index 6e92be0..0000000 --- a/app/src/main/assets/ifv/patches/redirectToBoard/script.js +++ /dev/null @@ -1,33 +0,0 @@ -import { clickOnAside } from "../apis/aside.js"; - -const isEduVulcan = () => !window.location.hostname.startsWith("dziennik"); - -const getLogoElement = () => - document.querySelector(".header__logo-product")?.firstChild; - -function setUpRedirectToBoard() { - const logoElement = getLogoElement(); - if (!!window.location.hostname.match(/^(dziennik-)?wiadomosci.*/)) { - const url = `https://${window.location.hostname.replace( - "wiadomosci", - "uczen" - )}/${window.location.pathname.split("/")[1]}/App`; - - if (isEduVulcan()) logoElement.href = url; - else { - logoElement.onclick = () => (window.location.href = url); - logoElement.style = "cursor: pointer;"; - } - } else { - if (isEduVulcan()) logoElement.href = "javascript:void(0)"; - else logoElement.style = "cursor: pointer;"; - logoElement.addEventListener("click", () => clickOnAside(".tablica a")) - } -} - -window.appendModule({ - isLoaded: getLogoElement, - onlyOnReloads: true, - run: setUpRedirectToBoard, - doesRunHere: () => !!window.location.hostname.match(/^(dziennik-)?(wiadomosci|uczen).*/) -}) diff --git a/app/src/main/assets/ifv/patches/redirectToBoard/styles.css b/app/src/main/assets/ifv/patches/redirectToBoard/styles.css deleted file mode 100644 index dbddce5..0000000 --- a/app/src/main/assets/ifv/patches/redirectToBoard/styles.css +++ /dev/null @@ -1,3 +0,0 @@ -.app.hideAside aside { - display: none; -} \ No newline at end of file diff --git a/app/src/main/assets/ifv/patches/redirectToDVLogin.js b/app/src/main/assets/ifv/patches/redirectToDVLogin.js deleted file mode 100644 index 794431d..0000000 --- a/app/src/main/assets/ifv/patches/redirectToDVLogin.js +++ /dev/null @@ -1,26 +0,0 @@ -function redirectToLoginPage() { - window.location.pathname = `/${ - window.location.pathname.split("/")[1] - }/LoginEndpoint.aspx`; -} - -window.appendModule({ - onlyOnReloads: true, - run: redirectToLoginPage, - doesRunHere: () => - window.location.hostname === "dziennik-uczen.vulcan.net.pl" && - !window.location.pathname.split("/")[2], -}); - -const pathSegment = window.location.pathname.split("/")[1]; - -const targetSpan = document.querySelector( - ".input-components ~ .form-gap > span" -); - -if (targetSpan) { - const spanText = targetSpan.textContent; - const newText = spanText.slice(0, -1); - const additionalText = ` lub użyj
innej metody logowania`; - targetSpan.innerHTML = `${newText}${additionalText}`; -} diff --git a/app/src/main/assets/ifv/patches/redirectToEVLogin.js b/app/src/main/assets/ifv/patches/redirectToEVLogin.js deleted file mode 100644 index 918edf3..0000000 --- a/app/src/main/assets/ifv/patches/redirectToEVLogin.js +++ /dev/null @@ -1,12 +0,0 @@ -function redirectToLoginPage() { - window.location.pathname = "/logowanie"; -} - -window.appendModule({ - onlyOnReloads: true, - run: redirectToLoginPage, - doesRunHere: () => - window.location.hostname === "eduvulcan.pl" - && window.location.pathname === "/" - && !!document.querySelector("#panelLoginButton") -}); diff --git a/app/src/main/assets/ifv/popup/index.html b/app/src/main/assets/ifv/popup/index.html deleted file mode 100644 index f0ee43c..0000000 --- a/app/src/main/assets/ifv/popup/index.html +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - - - -

Improvements for Vulcan

-

Changing any option below will refresh opened pages.
We are not affiliated, associated, authorized, endorsed by, or in any way officially connected with VULCAN sp. z o.o., or any of its subsidiaries or its affiliates.

-
- - - - diff --git a/app/src/main/assets/ifv/popup/main.js b/app/src/main/assets/ifv/popup/main.js deleted file mode 100644 index 8fc08c8..0000000 --- a/app/src/main/assets/ifv/popup/main.js +++ /dev/null @@ -1,41 +0,0 @@ -const fetchPatches = async () => { - const patchesResponse = await fetch(chrome.runtime.getURL("patches.json")); - return await patchesResponse.json(); -}; - -if (/\bMobile\b/.test(navigator.userAgent)) document.body.classList.add("mobile") - -document.addEventListener("DOMContentLoaded", async () => { - let config = (await chrome.storage.sync.get("options"))?.options ?? {}; - const patches = await fetchPatches(); - - patches.forEach((patch) => { - if (config[patch.name] !== undefined) return; - config[patch.name] = { description: patch.description, enable: true }; - }); - chrome.storage.sync.set({ options: config }); - - const optionsDOM = document.querySelector(".options"); - for (const [key, value] of Object.entries(config)) { - const option = document.createElement("label"); - option.innerHTML = ` -
-

${key}

-

${value.description}

-
-
- -
-
- `; - option.querySelector("input").id = key - optionsDOM.appendChild(option); - } - optionsDOM.addEventListener("change", async (e) => { - const target = e.target; - if (target.tagName === "INPUT") { - config[target.id].enable = target.checked; - await chrome.storage.sync.set({ options: config }); - } - }); -}); diff --git a/app/src/main/assets/ifv/popup/style.css b/app/src/main/assets/ifv/popup/style.css deleted file mode 100644 index 8ac08d1..0000000 --- a/app/src/main/assets/ifv/popup/style.css +++ /dev/null @@ -1,122 +0,0 @@ -body { - background: #18181b; - font-family: Cantarell, Arial, sans-serif; - color: white; - width: 350px; - padding: 10px; -} - -body.mobile { - width: 100% !important; -} - -/* Main */ - -h1 { - margin: 5px 0; - color: #fafafa; - text-align: center; -} - -h2 { - color: #d4d4d8; - font-size: small; - font-weight: normal; - text-align: center; -} - -.options { - display: flex; - flex-direction: column; - gap: 8px; -} - -/* Option */ - -label { - display: flex; - justify-content: space-between; - align-items: center; - margin: 2px 0; - padding: 10px; - border-radius: 7px; - background: #27272a; - gap: 10px; - cursor: pointer; -} - -label .desc { - margin: 5px 0 0 0; - font-size: 14px; - color: #a1a1aa; - line-height: 16px; -} - -label .title { - font-size: 15px; - color: #f4f4f5; - line-height: 18px; - font-weight: 500; - margin: 0; -} - -/* Toggle */ -/* https://uiverse.io/ClawHack1/itchy-bobcat-18 */ - -.toggle-wrapper { - position: relative; - display: inline-block; - width: 40px; - height: 24px; -} - -.toggle-wrapper .toggle-switch { - position: absolute; - top: 0; - left: 0; - width: 40px; - height: 24px; - background-color: #52525b; - border-radius: 34px; - cursor: pointer; - transition: background-color 0.3s; -} - -.toggle-wrapper .toggle-switch::before { - content: ""; - position: absolute; - width: 20px; - height: 20px; - border-radius: 50%; - top: 2px; - left: 2px; - background-color: #fff; - box-shadow: 0px 2px 5px 0px rgba(0, 0, 0, 0.3); - transition: transform 0.3s; -} - -.toggle-wrapper .toggle-input:checked + .toggle-switch::before { - transform: translateX(16px); -} - -.toggle-wrapper .toggle-input:checked + .toggle-switch { - background-color: #16a34a; -} - -.toggle-wrapper .toggle-input:checked + .toggle-switch::before { - transform: translateX(16px); -} - -/* Footer */ - -.footer { - padding: 10px; - display: flex; - justify-content: center; - align-items: center; - gap: 20px; -} - -.footer a { - color: #a1a1aa; -} diff --git a/app/src/main/assets/ifv/pwa/manifest-eduvulcan.json b/app/src/main/assets/ifv/pwa/manifest-eduvulcan.json deleted file mode 100644 index 95ff903..0000000 --- a/app/src/main/assets/ifv/pwa/manifest-eduvulcan.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "name": "eduVULCAN", - "short_name": "eduVULCAN", - "start_url": "https://eduvulcan.pl/", - "display": "standalone", - "orientation": "portrait", - "background_color": "#006BD6", - "icons": [ - { - "src": "https://raw.githubusercontent.com/BanOcean/ifv/main/assets/logo/logo-128-blue.png", - "sizes": "128x128", - "type": "image/png" - }, - { - "src": "https://raw.githubusercontent.com/BanOcean/ifv/main/assets/logo/logo-192-blue.png", - "sizes": "192x192", - "type": "image/png" - }, - { - "src": "https://raw.githubusercontent.com/BanOcean/ifv/main/assets/logo/logo-512-blue.png", - "sizes": "512x512", - "type": "image/png" - } - ], - "splash_pages": null, - "prefer-related-application": false - } \ No newline at end of file From a66510b6cbf99f39849f02281cc8859feaa4708d Mon Sep 17 00:00:00 2001 From: YOPER12 <69840031+YOPER12@users.noreply.github.com> Date: Tue, 7 Jan 2025 21:27:18 +0100 Subject: [PATCH 6/7] added ifv as submodule --- .gitmodules | 3 +++ app/src/main/assets/ifv | 1 + 2 files changed, 4 insertions(+) create mode 100644 .gitmodules create mode 160000 app/src/main/assets/ifv diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..cccd131 --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "app/src/main/assets/ifv"] + path = app/src/main/assets/ifv + url = https://github.com/banocean/ifv diff --git a/app/src/main/assets/ifv b/app/src/main/assets/ifv new file mode 160000 index 0000000..d0c3546 --- /dev/null +++ b/app/src/main/assets/ifv @@ -0,0 +1 @@ +Subproject commit d0c3546540ad42b9c1c67ff6fc094102bb5ba48d From a50f78edb18bf9f1baf51020984100ed0dc3dd0d Mon Sep 17 00:00:00 2001 From: YOPER12 <69840031+YOPER12@users.noreply.github.com> Date: Tue, 7 Jan 2025 21:41:18 +0100 Subject: [PATCH 7/7] Update android.yml --- .github/workflows/android.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/android.yml b/.github/workflows/android.yml index f53ef97..abc2d0d 100644 --- a/.github/workflows/android.yml +++ b/.github/workflows/android.yml @@ -12,6 +12,8 @@ jobs: steps: - uses: actions/checkout@v4 + with: + submodules: 'recursive' - name: Set up JDK 17 uses: actions/setup-java@v4