diff --git a/docs/CLOUD_SETTINGS_SYNC_SERVER.md b/docs/CLOUD_SETTINGS_SYNC_SERVER.md index d9b502e8..2a57d8cd 100644 --- a/docs/CLOUD_SETTINGS_SYNC_SERVER.md +++ b/docs/CLOUD_SETTINGS_SYNC_SERVER.md @@ -120,6 +120,7 @@ The backup is a flat JSON map of **`chrome.storage.local`** keys. It does **not* - **OAuth / session keys** — `bsplus_token`, `bsplus_refresh_token`, `bsplus_client_id`, `bsplus_user`, plus legacy `cloudAccessToken` / `cloudUsername`. - **Assessment Averages caches** — `plugin.assessments-average.storage.assessments`, `plugin.assessments-average.storage.weightings` (school assessment data). - **Keys under** `plugin.global-search.storage.*` — reserved so any future plugin storage cache there is not synced. +- **Grade Analytics** — keys under `bsplus.analytics.*` (synced assessment cache and per-school chart preferences). - **`bsplus_cloud_settings_known_remote_updated_at`** — client-only watermark for auto-sync (not part of the cloud backup blob). On restore, those keys are **not** taken from the server; the device keeps its current local values. diff --git a/package.json b/package.json index 8f0615e0..1c53c20b 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "betterseqtaplus", - "version": "3.6.6", + "version": "3.7.0", "type": "module", "description": "Enhance SEQTA Learn's usability and aesthetics! A fork of BetterSEQTA to continue development and add heaps more features!", "browserslist": "> 0.5%, last 2 versions, not dead", diff --git a/src/css/injected.scss b/src/css/injected.scss index a1580330..978cd32b 100644 --- a/src/css/injected.scss +++ b/src/css/injected.scss @@ -3558,6 +3558,32 @@ div.day-empty { color: var(--text-primary); transform-origin: center center; } + +/* Text-only popups (privacy notices): body fills remaining height, scrolls inside */ +.whatsnewContainer.whatsnewContainer--scrollBody { + .whatsnewHeader { + flex-shrink: 0; + height: auto; + min-height: 3em; + } + + > .whatsnewTextContainer { + flex: 1 1 auto; + min-height: 0; + overflow-x: hidden; + overflow-y: auto; + max-height: none; + width: 90%; + margin: 0 auto 0.75rem; + padding-bottom: 0.5rem; + box-sizing: border-box; + } + + > .whatsnewTextContainer.privacyStatement { + font-size: 1.1rem; + line-height: 1.6; + } +} .whatsnewTextContainer.privacyStatement p { margin-bottom: 1.5ex; diff --git a/src/plugins/built-in/gradeAnalytics/GradeAnalyticsPage.svelte b/src/plugins/built-in/gradeAnalytics/GradeAnalyticsPage.svelte index 43eab2d3..e2afc141 100644 --- a/src/plugins/built-in/gradeAnalytics/GradeAnalyticsPage.svelte +++ b/src/plugins/built-in/gradeAnalytics/GradeAnalyticsPage.svelte @@ -16,6 +16,7 @@ TIME_RANGE_OPTIONS, type TimeRange, } from "./timeRange"; + import { openAnalyticsPrivacyPopup } from "./openAnalyticsPrivacyPopup"; let analyticsData: Assessment[] | null = $state(null); let loading = $state(true); @@ -208,14 +209,23 @@
{/if} - +Grade Analytics on this device
++ Your grade history and charts stay on this device. + BetterSEQTA+ does not collect or store your analytics on our servers. +
+ ++ Refresh data loads released marks directly from SEQTA while you are logged in. + That traffic is between your browser and your school’s SEQTA site — not to us. +
+ ++ You can remove cached analytics any time by clearing this extension’s storage in + your browser settings. +
+ ++ General plugin settings (such as cache duration in the Grade Analytics plugin + panel) may still sync if you use BetterSEQTA Cloud — but never your assessment + results or charts. +
+At BetterSEQTA+, we take your privacy seriously. We want to be completely transparent about how we handle your data.
@@ -43,6 +43,7 @@ export function OpenPrivacyStatement() { openPopup({ header, content: [text], + containerClass: "whatsnewContainer--scrollBody", }); } diff --git a/src/seqta/utils/Openers/OpenWhatsNewPopup.ts b/src/seqta/utils/Openers/OpenWhatsNewPopup.ts index 8b068f05..b9e4bb3d 100644 --- a/src/seqta/utils/Openers/OpenWhatsNewPopup.ts +++ b/src/seqta/utils/Openers/OpenWhatsNewPopup.ts @@ -19,27 +19,40 @@ export function OpenWhatsNewPopup(onDismissed?: () => void) { const video = document.createElement("video"); const source = document.createElement("source"); - source.setAttribute( - "src", - "https://raw.githubusercontent.com/BetterSEQTA/BetterSEQTA-Plus/main/src/resources/update-video.webm", - ); - video.autoplay = true; - video.muted = true; - video.loop = true; - video.appendChild(source); - video.classList.add("whatsnewImg"); - imageContainer.appendChild(video); - attachPopupMediaFullscreen(video); + //source.setAttribute( + // "src", + // "https://raw.githubusercontent.com/BetterSEQTA/BetterSEQTA-Plus/main/src/resources/update-video.webm", + //); + //video.autoplay = true; + //video.muted = true; + //video.loop = true; + //video.appendChild(source); + //video.classList.add("whatsnewImg"); + //imageContainer.appendChild(video); + //attachPopupMediaFullscreen(video); + + const heroImage = document.createElement("img"); + heroImage.src = + "https://raw.githubusercontent.com/BetterSEQTA/BetterSEQTA-Plus/main/src/resources/updateimage1.webp"; + heroImage.alt = "BetterSEQTA+ update preview"; + heroImage.classList.add("whatsnewImg"); + imageContainer.appendChild(heroImage); + attachPopupMediaFullscreen(heroImage); const text = stringToHTML(/* html */ `