From b466d16ee7c36b0abde12ed6dcf4a5707d679eef Mon Sep 17 00:00:00 2001 From: Diogo Correia Date: Mon, 16 Sep 2024 19:20:31 +0100 Subject: [PATCH] fixed bugs on subjects list from profile page --- CHANGELOG.md | 9 ++ README.md | 11 ++- images/features.png | Bin 0 -> 7142 bytes images/keyboard-key.png | Bin 0 -> 7720 bytes images/left-click.png | Bin 0 -> 9635 bytes images/right-click.png | Bin 0 -> 9793 bytes manifest.json | 2 +- popup/about.html | 11 +++ popup/features.html | 164 +++++++++++++++++++++++++++++++ popup/home.html | 2 + popup/scripts/home.js | 15 ++- popup/scripts/profile.js | 56 +++++++---- popup/scripts/reviews-history.js | 4 +- popup/scripts/scripts.js | 5 +- popup/scripts/search.js | 2 +- popup/styles/about.css | 10 ++ popup/styles/features.css | 86 ++++++++++++++++ popup/styles/home.css | 11 +++ popup/styles/profile.css | 8 ++ popup/styles/styles.css | 8 +- popup/styles/tiles-list.css | 4 +- scripts/functions.js | 31 +++++- scripts/static.js | 12 ++- 23 files changed, 412 insertions(+), 39 deletions(-) create mode 100644 images/features.png create mode 100644 images/keyboard-key.png create mode 100644 images/left-click.png create mode 100644 images/right-click.png create mode 100644 popup/features.html create mode 100644 popup/styles/features.css diff --git a/CHANGELOG.md b/CHANGELOG.md index 51d6b5a..411bb1d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,12 @@ +# [Changelog v1.4.3](https://github.com/digas99/wanikani-kanji-highlighter/releases/tag/v1.4.3) + +## Popup +- Added page with information on certain features to the About page +- Added possibility to hide disabled subjects from subjects list in the Profile Page + +## Bug Fixes +- Fixed some issues with customization of the subjects list in the Profile Page + # [Changelog v1.4.2](https://github.com/digas99/wanikani-kanji-highlighter/releases/tag/v1.4.2) Released on 14/09/2024 diff --git a/README.md b/README.md index 4a729f2..ab25801 100644 --- a/README.md +++ b/README.md @@ -19,7 +19,7 @@ It works with any website, and provides detailed information about any kanji tha ## Table of contents: -1. [Latest Features](#changelog-v142) +1. [Latest Features](#changelog-v143) 2. [Usage Guide](#usage-guide) - 2.1. [WaniKani API Token](#wanikani-api-token) - 2.2. [Kanji Details](#kanji-details) @@ -31,6 +31,15 @@ It works with any website, and provides detailed information about any kanji tha - 2.7. [Settings](#settings) 3. [Pictures](#pictures) +## [Changelog v1.4.3](https://github.com/digas99/wanikani-kanji-highlighter/releases/tag/v1.4.3) + +### Popup +- Added page with information on certain features to the About page +- Added possibility to hide disabled subjects from subjects list in the Profile Page + +### Bug Fixes +- Fixed some issues with customization of the subjects list in the Profile Page + ## [Changelog v1.4.2](https://github.com/digas99/wanikani-kanji-highlighter/releases/tag/v1.4.2) ### Content diff --git a/images/features.png b/images/features.png new file mode 100644 index 0000000000000000000000000000000000000000..97a86c459ea94b60b97793608ae4b987bec5a6f1 GIT binary patch literal 7142 zcmeHLX;f3ovhD+e{4O|9NRE!t?qs()+d*zCz(w;^7Y)%Uo{TxPccc3%M3@G-7EZ=czq_*P zBoTLSex~yXoyQD^A$7NXaJraQke-I+Ok;SF z#bSt(EDWW^P_!+R^u$|`?aa6py!i6(VbgorI;oh_hcw|ci0wG0mebrc(h6BYt+Vpe z=$41lFs1ibgf}6zT&e2Sw!-6Zh)eY9w1a7M55L|T?kH4)2zkvlgv%>g{R-CtT*f}` z^6m|AE^5Fw`7?zUd6=TtzABDBPwnK@RJvu4IVRVd)$d*(k%w*c6h%fY;T)IUNw)zBH+?F9^!U=admll{~4Fch3dOo4^Ga^Ze)E+r%ja$fqLi0j) zZD^o4n)Qj${;0Y)$Y5coLTd^pCAfL z=vtte_WLj&aSoB@&H=_Q;nBXsfvq#h70Y<`xZXK&?lfjPme(#`HF8y;)u`QryM&^o=p zicX8tecC`VN`E5pQWK0uUhs_bIH>LR>1^L^#e@RRrQdqltYkiYM30eyR8~DuycNEK zlW~kZ;k-l60xK(wlN#{BHyE`;hNs6e_PO4eXdKKvGci9ye6mYiESbYSZzdV+g5G&q zZRSesha_HC2=6Z$PYxKZv~}WLhyBz0&#v7@m45p0qPIq*!dZcE$pP z8mu5UJSuNdJ;(hA2Ev>lneCY2A0Xh88YqRKKg8M-v$@mY>TO}ZsmHJPRci_Fh&Cwf zlzwW)Demxr?}A#jTojLZcPq1OgFxvgcNs3n{kp++al^}=7FCt!lG?uWE3rUDhF4OY zO=`yEzhdWPm>&N*LSO!+_LhZt@5qBI@Qm|uPN^Az@S)u?0m{MBPYoNcU}pGaTD5Al za8D#2w*p^rnv7O~A<$i{+#Bo_B`0T!m6%~%Q0Zdl{plJyKfQ1kMcE{xb*mDuTDO6_z zki7=KHkNGyfT8gJLjUiA{~QH)RO(IzSnIz8-PKtarbUdp|2AMYB)fqThLqk-VUWz{l-c&UaVwK8ZFQ3Hs|$*f50#x{K9%zu2+vOVo$e zG|fbk3zKHtn)%|xrdEzwm-MjUrjwg#yS{<2f#-F{D=LaPM+s^46;+!*({ZeB3ak1X zrWrm;j=9nKz*KP~(>L|s4!o8Vnse!bQp7=5)YsFP^j?PM@ zdv|;p4mh|pgx;Fz+6SY;b0^b5}$s& zIJ>QwEM~Vj&oRZ^Y_OJ&=jBE`8dE}*-RAvJieAj^zi#uE)u3*5itt%vz)_Nsb-Hl8 zOlG(1L$Vo`oC1TW`z#0aDpZH~X7#blvk%lEl@x(xjsDqKAL1}SGZiCLt>pRjNs;9AZSl6e z{k3ilHR<7L*sNg3vB^&ta;4h7d4X^>OL(H8`&?T)p5v68W77`lRs6y8+JY e8^k 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 QLM8~WcUgCPE%n&{06NEgA^-pY literal 0 HcmV?d00001 diff --git a/images/keyboard-key.png b/images/keyboard-key.png new file mode 100644 index 0000000000000000000000000000000000000000..414e7c7df0b3d7306905bdb0e3957ba5f28e007b GIT binary patch literal 7720 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 oNP?G_wtY!u6RhMXVPVO`(=jqi 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 literal 0 HcmV?d00001 diff --git a/images/right-click.png b/images/right-click.png new file mode 100644 index 0000000000000000000000000000000000000000..cbf59128aba54291a9d5ce52016b4fbaa0c6ed54 GIT binary patch literal 9793 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 VmVB3|3jEv)LfJYWDYy2$`CsM}API Key edit + + +
diff --git a/popup/features.html b/popup/features.html new file mode 100644 index 0000000..41dc5d1 --- /dev/null +++ b/popup/features.html @@ -0,0 +1,164 @@ + + + + + + + Features + + + + + + + + + + + + +
+
+
+

Subject Details

+

Throughout the Extension Popup, you will find Subject Tiles that can open a Subject Details Popup. Depending on which mouse button you use when clicking on it, you will open the details popup on different places. Feel free to try it on the Subject Tile bellow.

+
+
+
+ +
Left click - popup opens on the current web page you are browsing.
+
+
+ +
Right click - popup opens inside this extension popup.
+
+
+
+
+

Shortcut Keys

+

Shortcut keys available to use on the Subject Details Popup. These will collide with any existing shortcut within the web page you are visiting.

+
+
+
+
+ + X +
+
+
Close the popup.
+
+
+
+
+ + O +
+
+
Expand the popup when it is opened on the bottom right corner.
+
+
+
+
+ + L +
+
+
Lock current subject. Hovering over other kanji will not change the subject.
+
+
+
+
+ + F +
+
+
Pin popup, fixing it to the page. It will not close, even if you click outside of it.
+
+
+
+
+ + B +
+
+
Show details from the previous subject.
+
+
+
+
+ + Y +
+
+
Copy characters from current subject to clipboard.
+
+
+
+
+ + U +
+
+
Scroll back to the top of the popup.
+
+
+
+
+ + I +
+
+
Scroll to the Info section.
+
+
+
+
+ + C +
+
+
Scroll to the Cards section.
+
+
+
+
+ + S +
+
+
Scroll to the Stats section.
+
+
+
+
+ + T +
+
+
Scroll to the Timestamps section.
+
+
+
+
+ + +
+
+ + +
+
+
Scroll back and forth between the sections.
+
+
+
+
+

Subjects Data Error

+

During the process of fetching data from Wanikani servers or updating the extension, it is possible for some data from the subjects to get lost. If this ever becomes noticeable - maybe wrong highlighting, or the subject details popup doesn't load - you can Clear Subjects Data at the bottom of the Settings Page. This will trigger a fresh fetch of all data from Wanikani and hopefully fix any unwanted error.

+
+
+
+ + + + \ No newline at end of file diff --git a/popup/home.html b/popup/home.html index 7599154..1209e21 100644 --- a/popup/home.html +++ b/popup/home.html @@ -190,6 +190,8 @@
+ help + diff --git a/popup/scripts/home.js b/popup/scripts/home.js index fe4685f..079d95e 100644 --- a/popup/scripts/home.js +++ b/popup/scripts/home.js @@ -173,11 +173,22 @@ const updateHomeInterface = async (result) => { document.querySelector("#progress_legend")?.remove(); } -chrome.storage.local.get(["apiKey", "rating", ...HOME_FETCH_KEYS], result => { +chrome.storage.local.get(["apiKey", "rating", "help_button", ...HOME_FETCH_KEYS], result => { const settings = result["settings"] ? result["settings"] : defaultSettings; if (popupLoading) popupLoading.remove(); + // help button visibility + const helpButton = document.querySelector(".help-button"); + const help = result["help_button"]; + console.log(result, helpButton, help); + if (helpButton && help == false) + helpButton.remove(); + helpButton.addEventListener("click", () => { + chrome.storage.local.set({"help_button": false}); + }); + + // rating section visibility const rateStars = document.querySelector(".rate-stars"); const rating = result["rating"] || {}; if (rateStars && rating) { @@ -202,7 +213,7 @@ const kanjiListUpdate = (learned, notLearned, kanjiAssoc) => { highlightList.create(); const itemCallback = (elem, value) => { - elem.classList.add("kanjiDetails"); + elem.classList.add("subject-tile", "kanjiDetails"); if (kanjiAssoc && kanjiAssoc[value]) elem.setAttribute("data-item-id", kanjiAssoc[value]); } diff --git a/popup/scripts/profile.js b/popup/scripts/profile.js index 9c9cca4..702df95 100644 --- a/popup/scripts/profile.js +++ b/popup/scripts/profile.js @@ -11,6 +11,7 @@ chrome.storage.local.get(["apiKey", "userInfo", "settings", LEVELS_STATS.storage const apiKey = result["apiKey"]; settings = result["settings"]; menuSettings = settings && settings["profile_menus"] ? settings["profile_menus"] : defaultSettings["profile_menus"]; + console.log("Menu settings:", menuSettings); levelsStats = result[LEVELS_STATS.storage.id]; @@ -222,7 +223,7 @@ const subjectTile = (type, subject) => { subjectWrapper.classList.add(type+"_back"); subjectWrapper.title = subject["meanings"][0]; subjectWrapper.style.position = "relative"; - subjectWrapper.classList.add("clickable", "kanjiDetails"); + subjectWrapper.classList.add("subject-tile", "clickable", "kanjiDetails"); subjectWrapper.setAttribute("data-item-id", subject["id"]); if (subject["readings"]) { if (subject["readings"][0]["reading"]) @@ -399,10 +400,10 @@ const clearData = () => { // subjects progress from "All" document.querySelector(".subject-tab > span").innerText = ""; - // close arrow from "All" - let closeArrow = document.querySelector(".subject-tab > .menu-icons > div[title='Close']"); - if (closeArrow.querySelector("i").classList.contains("down")) - closeArrowAction(closeArrow, document.querySelector(".subject-types")); + // // close arrow from "All" + // let closeArrow = document.querySelector(".subject-tab > .menu-icons > div[title='Close']"); + // if (closeArrow.querySelector("i").classList.contains("down")) + // closeArrowAction(closeArrow, document.querySelector(".subject-types")); // subjects Array.from(document.querySelectorAll(".subject-types > div")).forEach(container => { @@ -411,9 +412,9 @@ const clearData = () => { // subjects tiles container.querySelector(".subject-container > ul").innerHTML = ""; // subjects close arrow - closeArrow = container.querySelector(".menu-icons > div[title='Close']"); - if (closeArrow.querySelector("i").classList.contains("down")) - closeArrowAction(closeArrow, container.querySelector(".subject-container")); + // closeArrow = container.querySelector(".menu-icons > div[title='Close']"); + // if (closeArrow.querySelector("i").classList.contains("down")) + // closeArrowAction(closeArrow, container.querySelector(".subject-container")); }); } @@ -428,7 +429,8 @@ document.addEventListener("click", e => { const title = tab.firstElementChild.innerText; let key = Object.keys(menuSettings).filter(k => title.toLowerCase().includes(k))[0]; - closeArrowAction(arrow, tab.nextElementSibling, key); + const result = closeArrowAction(arrow, tab.nextElementSibling, key); + menuSettings[key]["opened"] = result; // save changes chrome.storage.local.set({"settings": settings}); @@ -508,7 +510,7 @@ document.addEventListener("click", e => { } }); -const closeArrowAction = (arrow, subjectsContainer, key) => { +const closeArrowAction = (arrow, subjectsContainer) => { const opened = !subjectsContainer.classList.contains("hidden"); if (subjectsContainer) { if (opened) { @@ -520,9 +522,8 @@ const closeArrowAction = (arrow, subjectsContainer, key) => { subjectsContainer.classList.remove("hidden"); } - if (key) - menuSettings[key]["opened"] = !opened; - } + return !opened; + } } document.addEventListener("input", e => { @@ -555,21 +556,20 @@ const applyChanges = () => { const tab = Array.from(document.querySelectorAll(".subject-tab")).filter(tab => tab.firstElementChild.innerText.toLowerCase().includes(type))[0]; if (tab) { Object.keys(menuSettings[type]).forEach(key => { + const title = type.charAt(0).toUpperCase()+type.slice(1); if (key === "opened") { if (menuSettings[type][key] == false) { const closeArrow = tab.querySelector("div[title='Close']"); - closeArrow.click(); + closeArrowAction(closeArrow, tab.nextElementSibling, type); } } else { Object.keys(menuSettings[type][key]).forEach(property => { if (menuSettings[type][key][property] !== defaultSettings["profile_menus"][type][key][property]) { - const title = type.charAt(0).toUpperCase()+type.slice(1); let keys = [Object.keys(menuSettings).filter(k => title.toLowerCase().includes(k))[0]]; - if (title === "All") - keys = Object.keys(menuSettings); - menuActions(tab, title, key.charAt(0).toUpperCase()+key.slice(1), property, keys, menuSettings[type][key][property]); + if (title !== "All") + menuActions(tab, title, key.charAt(0).toUpperCase()+key.slice(1), property, keys, menuSettings[type][key][property]); } }); } @@ -629,6 +629,10 @@ const menuActions = (tab, subjectsType, menuTitle, property, keys, value) => { reviewsInfo(subjects, value); keys.forEach(key => menuSettings[key]["menu"]["reviews_info"] = value); break; + case "disabled_subjects": + disabledSubjects(subjects, value); + keys.forEach(key => menuSettings[key]["menu"]["disabled_subjects"] = value); + break; } break; } @@ -695,6 +699,9 @@ const menuMenu = (wrapper, defaults) => { // show reviews info wrapper.appendChild(checkbox("Reviews info", defaults["reviews_info"])); + + // show disabled subjects + wrapper.appendChild(checkbox("Disabled subjects", defaults["disabled_subjects"])); } const colorings = (subjects, type) => { @@ -767,6 +774,15 @@ const reviewsInfo = (subjects, checked) => { } } +const disabledSubjects = (subjects, checked) => { + Array.from(subjects).filter(elem => elem.dataset.hidden_at).forEach(subject => { + if (checked) + subject.style.removeProperty("display"); + else + subject.style.display = "none"; + }); +} + // FILTERS MENU const filterMenu = (wrapper, defaults) => { @@ -783,7 +799,7 @@ const filters = (subjects, srs, state) => { if (srs !== "None") { Array.from(subjects).forEach(elem => { - const srsChecker = srs !== "None" && (elem.getAttribute("data-srs") == "-1" && srs !== "Locked" || elem.getAttribute("data-srs") !== "-1" && srs !== srsStages[elem.getAttribute("data-srs")]["name"]); + const srsChecker = srs !== "None" && (elem.getAttribute("data-srs") == "-1" && srs !== "Locked" || elem.getAttribute("data-srs") !== "-1" && srs !== srsStages[elem.getAttribute("data-srs")]?.name); if (srsChecker) elem.classList.add("hidden"); }); @@ -791,7 +807,7 @@ const filters = (subjects, srs, state) => { if (state !== "None") { Array.from(subjects).forEach(elem => { - const stateChecker = state !== "None" && (state !== (elem.getElementsByClassName("passed-subject-check").length > 0 ? "Passed" : "Not Passed")); + const stateChecker = state !== "None" && (state !== (elem?.dataset.passed_at ? "Passed" : "Not Passed")); if (stateChecker) elem.classList.add("hidden"); }); diff --git a/popup/scripts/reviews-history.js b/popup/scripts/reviews-history.js index 5cec616..5102f4a 100644 --- a/popup/scripts/reviews-history.js +++ b/popup/scripts/reviews-history.js @@ -37,9 +37,9 @@ chrome.storage.local.get(["assignments_history"], result => {

${updatedAtPretty} ago

    -
  • ${assignment.characters}
  • +
  • ${assignment.characters}
  • -
  • ${assignment.characters}
  • +
  • ${assignment.characters}
diff --git a/popup/scripts/scripts.js b/popup/scripts/scripts.js index 2de740b..29670ce 100644 --- a/popup/scripts/scripts.js +++ b/popup/scripts/scripts.js @@ -1,11 +1,12 @@ let messagePopup, blacklistedSite, atWanikani; window.onload = () => { - chrome.storage.local.get(["initialFetch", "blacklist", "contextMenuSelectedText"], async result => { + chrome.storage.local.get(["initialFetch", "blacklist", "contextMenuSelectedText", "settings"], async result => { + updateSettings(result["settings"], defaultSettings); + if (result["contextMenuSelectedText"]) { makeSearch(result["contextMenuSelectedText"]); chrome.storage.local.remove("contextMenuSelectedText"); } - const initialFetch = result["initialFetch"] || result["initialFetch"] == undefined; diff --git a/popup/scripts/search.js b/popup/scripts/search.js index 03b80db..efced56 100644 --- a/popup/scripts/search.js +++ b/popup/scripts/search.js @@ -262,7 +262,7 @@ const displayResults = (wrapper, results, lowerIndex, upperIndex, display) => { const dataWrapper = document.createElement("div"); li.appendChild(dataWrapper); dataWrapper.setAttribute('data-item-id', data["id"]); - dataWrapper.classList.add("kanjiDetails"); + dataWrapper.classList.add("subject-tile", "kanjiDetails"); const itemSpan = document.createElement("span"); itemSpan.classList.add("searchResultItem"); diff --git a/popup/styles/about.css b/popup/styles/about.css index 0a04e9e..eb1b99e 100644 --- a/popup/styles/about.css +++ b/popup/styles/about.css @@ -177,4 +177,14 @@ .footer-icons > a > img { width: 30px; +} + +.features-info { + display: flex; + align-items: center; + column-gap: 10px; +} + +.features-info img { + width: 20px; } \ No newline at end of file diff --git a/popup/styles/features.css b/popup/styles/features.css new file mode 100644 index 0000000..12a637b --- /dev/null +++ b/popup/styles/features.css @@ -0,0 +1,86 @@ +.features .section { + padding: 10px; + padding-bottom: 20px; +} + +.features .section h2 { + padding: 10px 0; +} + +.features .section p { + color: var(--font-sec-color); + font-size: 13px; +} + +.features .section > div { + margin-left: 5px; + margin-top: 20px; +} + +.keys-list { + display: flex; + flex-direction: column; + row-gap: 10px; +} + +.keys-list-entry { + display: flex; + align-items: center; + column-gap: 10px; +} + +.keys-list-entry > div:first-child { + display: flex; + align-items: center; + column-gap: 5px; +} + +.keys-list-entry .keys-list-key { + position: relative; + width: fit-content; + align-items: center; + display: flex; + text-align: center; + font-weight: bold; +} + +.keys-list-entry .keys-list-key img { + width: 25px; +} + +.keys-list-entry .keys-list-key span { + position: absolute; + left: 0; + right: 0; + color: var(--fill-color); +} + +.keys-list-description { + +} + +.subject-tile { + font-size: 30px; + color: white; +} + +.subject-details-info { + display: flex; + align-items: center; + column-gap: 20px; +} + +.subject-details-info-mouse-click { + display: flex; + align-items: center; + column-gap: 5px; +} + +.subject-details-info-mouse-click img { + width: 30px; +} + +.subject-details-info-mouse-click div { + color: var(--font-sec-color); + font-size: 12px; +} \ No newline at end of file diff --git a/popup/styles/home.css b/popup/styles/home.css index 4bbb998..ad5fd7e 100644 --- a/popup/styles/home.css +++ b/popup/styles/home.css @@ -264,4 +264,15 @@ body { .legend .legend-label { +} + +.help-button { + position: fixed; + bottom: 5px; + right: 60px; +} + +.help-button img { + width: 30px; + filter: drop-shadow(2px 2px 1px white); } \ No newline at end of file diff --git a/popup/styles/profile.css b/popup/styles/profile.css index 6dc4672..bce0417 100644 --- a/popup/styles/profile.css +++ b/popup/styles/profile.css @@ -413,6 +413,14 @@ body { min-height: 40px; } +.subject-container .kanji_back, .subject-container .radical_back { + padding: 6px 7px; +} + +.subject-container .fill-width { + grid-template-columns: repeat(auto-fill, minmax(40px, 1fr)); +} + .time-next-review-subject { font-size: 10px; background-color: #42f541; diff --git a/popup/styles/styles.css b/popup/styles/styles.css index df67099..e9a7662 100644 --- a/popup/styles/styles.css +++ b/popup/styles/styles.css @@ -241,12 +241,16 @@ i { } .simple-grid > ul li { - padding: 2px 6px; display: inline-block; margin: 2px; +} + +.subject-tile { + padding: 2px 6px; text-shadow: -1px 1px 0px #727272; box-shadow: -1px 2px 0px 1px var(--default-color); - border-radius: 6px; + border-radius: 6px; + width: fit-content; } .goTop { diff --git a/popup/styles/tiles-list.css b/popup/styles/tiles-list.css index 29f092d..073b41d 100644 --- a/popup/styles/tiles-list.css +++ b/popup/styles/tiles-list.css @@ -88,12 +88,12 @@ } .fill-width { - grid-template-columns: repeat(auto-fill,minmax(40px,1fr)); + grid-template-columns: repeat(auto-fill,minmax(35px,1fr)); display: grid; } .fill-width > li { - padding: 6px 2px !important; + padding: 6px 2px; text-align: center; } diff --git a/scripts/functions.js b/scripts/functions.js index 1cc8174..bafb1fa 100644 --- a/scripts/functions.js +++ b/scripts/functions.js @@ -832,7 +832,7 @@ const dataTile = (subjects, elem, value) => { const type = subject["subject_type"]; - elem.classList.add("kanjiDetails"); + elem.classList.add("subject-tile", "kanjiDetails"); elem.title = `${meaning} ${reading ? `| ${reading}` : ""}\x0D${type.split("_").map(word => word[0].toUpperCase() + word.slice(1)).join(" ")}`; elem.setAttribute("data-item-id", subject["id"]); @@ -1345,4 +1345,31 @@ const levelUpInfo = subjects => { subjects: kanji, initiated: initiatedKanji, }; -} \ No newline at end of file +} + +const updateSettings = (settings, defaults) => { + const updated = updateObject(settings, defaults); + if (updated) { + chrome.storage.local.set({"settings": settings}); + } +} + +const updateObject = (source, updates) => { + let changed = false; + + const deepUpdate = (src, upd) => { + for (const key in upd) { + // Check if the key doesn't exist in source + if (!(key in src)) { + src[key] = upd[key]; + changed = true; + } else if (typeof src[key] === 'object' && typeof upd[key] === 'object' && !Array.isArray(src[key]) && !Array.isArray(upd[key])) { + // Recursively handle nested objects + deepUpdate(src[key], upd[key]); + } + } + }; + + deepUpdate(source, updates); + return changed; +}; \ No newline at end of file diff --git a/scripts/static.js b/scripts/static.js index c05de32..0dc4a65 100644 --- a/scripts/static.js +++ b/scripts/static.js @@ -106,7 +106,8 @@ const defaultSettings = { "opened": true, "menu": { "color_by": "Subject Type", - "reviews_info": true + "reviews_info": true, + "disabled_subjects": true }, "filter": { "srs_stage": "None", @@ -121,7 +122,8 @@ const defaultSettings = { "opened": true, "menu": { "color_by": "Subject Type", - "reviews_info": true + "reviews_info": true, + "disabled_subjects": true }, "filter": { "srs_stage": "None", @@ -136,7 +138,8 @@ const defaultSettings = { "opened": true, "menu": { "color_by": "Subject Type", - "reviews_info": true + "reviews_info": true, + "disabled_subjects": true }, "filter": { "srs_stage": "None", @@ -151,7 +154,8 @@ const defaultSettings = { "opened": true, "menu": { "color_by": "Subject Type", - "reviews_info": true + "reviews_info": true, + "disabled_subjects": true }, "filter": { "srs_stage": "None",