spanish-quizzer

An app to quiz you on Spanish vocabulary and verb conjugations
git clone https://git.ashermorgan.net/spanish-quizzer/
Log | Files | Refs | README

commit d196e531858b0696483782863182440f43a7b678
parent 30b8754abbc8d025efbea199a1822b28fb9d0822
Author: AsherMorgan <59518073+AsherMorgan@users.noreply.github.com>
Date:   Sat, 20 Mar 2021 18:56:18 -0700

Add default filter settings

Diffstat:
Mcss/filtersPage.css | 2+-
Mcss/settingsPage.css | 10++++++++++
Mjs/filtersPage.js | 4++--
Mjs/global.js | 10++++++++++
Mjs/settingsPage.js | 83+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Mtests/test.filtersPage.js | 26++++++++++++++++++++++++--
Mtests/test.global.js | 10++++++++++
7 files changed, 140 insertions(+), 5 deletions(-)

diff --git a/css/filtersPage.css b/css/filtersPage.css @@ -59,7 +59,7 @@ } /* Hide non-quizzer settings & labels */ -.filtersPage main .settingsInput .appearanceSettings { +.filtersPage main .settingsInput>div:not(.quizzerPromptsSettings, .quizzerGradingSettings) { display: none; } diff --git a/css/settingsPage.css b/css/settingsPage.css @@ -10,6 +10,16 @@ .settingsInput input[type=number] { width: 50px; } +.settingsInput .defaultFiltersSettings select { + margin-bottom: 5px; + margin-right: 5px; +} +@media only screen and (max-width: 600px) { + .settingsInput .defaultFiltersSettings select { + width: 100%; + height: 35px; + } +} diff --git a/js/filtersPage.js b/js/filtersPage.js @@ -40,10 +40,10 @@ const filterInput = Vue.component("filterInput", { */ AddFilter: function() { if (this.category === "verbs") { - this.verbFilters.push({tense:"All Tenses", type:"All Types", subject:"All Subjects", direction:"Eng. → Conj."}); + this.verbFilters.push(getSettings().defaultFilters.verbs); } else if (this.category === "vocab") { - this.vocabFilters.push({category:"All Categories", type:"All Types", direction:"Eng. ↔ Esp."}); + this.vocabFilters.push(getSettings().defaultFilters.vocab); } }, diff --git a/js/global.js b/js/global.js @@ -37,6 +37,11 @@ function getSettings() { onMissedPrompt: "Correct me", repeatPrompts: "Never", multipleAnswers: "Require all", + + defaultFilters: { + verbs: {tense:"All Tenses", type:"All Types", subject:"All Subjects", direction:"Eng. → Conj."}, + vocab: {category:"All Categories", type:"All Types", direction:"Eng. ↔ Esp."}, + }, }; // Detect prefered theme @@ -84,6 +89,11 @@ function getSettings() { settings.multipleAnswers = parsedSettings.multipleAnswers; } + if (parsedSettings.defaultFilters) { + if (parsedSettings.defaultFilters.verbs) settings.defaultFilters.verbs = parsedSettings.defaultFilters.verbs; + if (parsedSettings.defaultFilters.vocab) settings.defaultFilters.vocab = parsedSettings.defaultFilters.vocab; + } + // Return parsed settings return settings; } diff --git a/js/settingsPage.js b/js/settingsPage.js @@ -97,6 +97,89 @@ const settingsInput = Vue.component("settingsInput", { </select> </div> </div> + + <div class="defaultFiltersSettings"> + <h2>Default Verb Filter</h2> + <div> + <select v-model="value.defaultFilters.verbs.tense"> + <option>All Tenses</option> + <option>Present Participles</option> + <option>Past Participles</option> + <option>Present Tense</option> + <option>Preterite Tense</option> + <option>Imperfect Tense</option> + <option>Simple Future Tense</option> + <option>Present Subjunctive Tense</option> + </select> + <select v-model="value.defaultFilters.verbs.type"> + <option>All Types</option> + <option>Reflexive</option> + <option>Regular</option> + <option>Nonregular</option> + <option>Stem Changing</option> + <option>Orthographic</option> + <option>Irregular</option> + </select> + <select v-model="value.defaultFilters.verbs.subject"> + <option>All Subjects</option> + <option>Type</option> + <option>Yo</option> + <option>Tú</option> + <option>Él</option> + <option>Nosotros</option> + <option>Ellos</option> + </select> + <select v-model="value.defaultFilters.verbs.direction"> + <option>Eng. → Conj.</option> + <option>Esp. → Conj.</option> + <option>Conj. → Eng.</option> + <option>Conj. → Esp.</option> + </select> + </div> + <h2>Default Vocab Filter</h2> + <div> + <select v-model="value.defaultFilters.vocab.category"> + <option>All Categories</option> + <optgroup label="Common Words"> + <option>Adjectives</option> + <option>Adverbs</option> + <option>Prepositions</option> + <option>Transitions</option> + <option>Verbs</option> + </optgroup> + <optgroup label="Basic Words"> + <option>Colors</option> + <option>Days</option> + <option>Months</option> + <option>Numbers</option> + <option>Questions</option> + </optgroup> + <optgroup label="Advanced Words"> + <option>Childhood</option> + <option>Clothes</option> + <option>Family</option> + <option>Food</option> + <option>Health</option> + <option>House</option> + <option>Nature</option> + <option>Professions</option> + <option>Vacation</option> + <option>Weather</option> + </optgroup> + </select> + <select v-model="value.defaultFilters.vocab.type"> + <option>All Types</option> + <option>Adjectives</option> + <option>Nouns</option> + <option>Verbs</option> + </select> + <select v-model="value.defaultFilters.vocab.direction"> + <option>Eng. ↔ Esp.</option> + <option>Eng. → Esp.</option> + <option>Esp. → Eng.</option> + </select> + </div> + </div> </div> `, }); diff --git a/tests/test.filtersPage.js b/tests/test.filtersPage.js @@ -75,12 +75,23 @@ describe("FilterInput", function() { expect(FilterInput.verbFilters.length).to.equal(0); expect(FilterInput.vocabFilters.length).to.equal(0); + // Override getSettings method + let old_getSettings = getSettings + getSettings = function() { + let settings = old_getSettings(); + settings.defaultFilters.verbs = {tense:"Present Tense", type:"Regular", subject:"Yo", direction:"Esp. → Conj."}; + return settings; + }; + // Add filter FilterInput.AddFilter(); + // Restore getSettings method + getSettings = old_getSettings; + // Assert filter added expect(FilterInput.verbFilters).to.have.deep.members([ - {tense:"All Tenses", type:"All Types", subject:"All Subjects", direction:"Eng. → Conj."}, + {tense:"Present Tense", type:"Regular", subject:"Yo", direction:"Esp. → Conj."}, ]); expect(FilterInput.vocabFilters).to.have.deep.members([]); }); @@ -93,12 +104,23 @@ describe("FilterInput", function() { expect(FilterInput.verbFilters.length).to.equal(0); expect(FilterInput.vocabFilters.length).to.equal(0); + // Override getSettings method + let old_getSettings = getSettings + getSettings = function() { + let settings = old_getSettings(); + settings.defaultFilters.vocab = {category:"Childhood", type:"Adjectives", direction:"Eng. → Esp."}; + return settings; + }; + // Add filter FilterInput.AddFilter(); + // Restore getSettings method + getSettings = old_getSettings; + // Assert filter added expect(FilterInput.vocabFilters).to.have.deep.members([ - {category:"All Categories", type:"All Types", direction:"Eng. ↔ Esp."}, + {category:"Childhood", type:"Adjectives", direction:"Eng. → Esp."}, ]); expect(FilterInput.verbFilters).to.have.deep.members([]); }); diff --git a/tests/test.global.js b/tests/test.global.js @@ -17,6 +17,11 @@ describe("Global.js", function() { onMissedPrompt: "Tell me", repeatPrompts: "5 prompts later", multipleAnswers: "Require any", + + defaultFilters: { + verbs: {tense:"Present Tense", type:"Regular", subject:"Yo", direction:"Esp. → Conj."}, + vocab: {category:"Childhood", type:"Adjectives", direction:"Eng. → Esp."}, + }, }; localStorage.setItem("settings", JSON.stringify(expected)); @@ -73,6 +78,11 @@ describe("Global.js", function() { onMissedPrompt: "Correct me", repeatPrompts: "Never", multipleAnswers: "Require all", + + defaultFilters: { + verbs: {tense:"All Tenses", type:"All Types", subject:"All Subjects", direction:"Eng. → Conj."}, + vocab: {category:"All Categories", type:"All Types", direction:"Eng. ↔ Esp."}, + }, }); // Restore original setting to localStorage