Fix(settings): switch setting default value as store value fallback #176

Merged
jakob.scheid merged 2 commits from fix/switch-setting-default-value into main 2026-08-06 12:48:12 +02:00
2 changed files with 56 additions and 6 deletions
+11 -3
View File
@@ -16,7 +16,7 @@ limitations under the License.
<script setup> <script setup>
import { useSettingsStore } from '../stores/settingsStore'; import { useSettingsStore } from '../stores/settingsStore';
import { useId } from 'vue'; import { ref, useId, watch } from 'vue';
import { useI18n } from 'vue-i18n'; import { useI18n } from 'vue-i18n';
const { t } = useI18n(); const { t } = useI18n();
@@ -35,8 +35,16 @@ const switchId = useId();
const store = useSettingsStore(); const store = useSettingsStore();
const enabled = ref(null);
watch(store, (newStore) => {
enabled.value = newStore.get(props.path);
});
// set value after registering watcher to avoid immediate value change
enabled.value = store.get(props.path) ?? props.setting.default;
const toggle = function toggle () { const toggle = function toggle () {
store.set(props.path, !store.get(props.path)); enabled.value = !enabled.value;
store.set(props.path, enabled.value);
}; };
</script> </script>
@@ -47,7 +55,7 @@ const toggle = function toggle () {
</label> </label>
<div <div
class="switch-wrapper" class="switch-wrapper"
:class="{ enabled: store.get(props.path) }" :class="{ enabled }"
:title="t('settings.switch.title')" :title="t('settings.switch.title')"
:aria-label="t('settings.switch.ariaLabel')" :aria-label="t('settings.switch.ariaLabel')"
:aria-labelledby="labelId" :aria-labelledby="labelId"
@@ -20,17 +20,23 @@ import { useSettingsStore } from '../../stores/settingsStore.js';
import { expect, describe, test } from 'vitest'; import { expect, describe, test } from 'vitest';
import { nextTick } from 'vue'; import { nextTick } from 'vue';
const getWrapper = function getWrapper ({ i18n = 'switch1', translations = {} } = {}) { const getWrapper = function getWrapper ({
i18n = 'switch1',
defaultValue = undefined,
translations = {},
piniaOptions = {}
} = {}) {
return mountComponent(Switch, { return mountComponent(Switch, {
attrs: { attrs: {
setting: { setting: {
type: 'bool', type: 'bool',
name: 'switch', name: 'switch',
i18n i18n,
default: defaultValue
}, },
path: 'switch' path: 'switch'
} }
}, translations); }, translations, [], piniaOptions);
}; };
describe('Switch', () => { describe('Switch', () => {
@@ -53,6 +59,42 @@ describe('Switch', () => {
expect(switchElementClasses2).not.toContain('enabled'); expect(switchElementClasses2).not.toContain('enabled');
}); });
test('shows default value', () => {
const wrapper = getWrapper({
defaultValue: true
});
const switchElement = wrapper.find('.switch-wrapper');
expect(switchElement.classes('enabled')).toBeTruthy();
});
test('shows stored value instead of default value', () => {
const wrapper = getWrapper({
defaultValue: true,
piniaOptions: {
setupStores: () => {
const store = useSettingsStore();
store.set('switch', false);
}
}
});
const switchElement = wrapper.find('.switch-wrapper');
expect(switchElement.classes('enabled')).toBeFalsy();
});
test('reacts on store change', async () => {
const wrapper = getWrapper();
const store = useSettingsStore();
const switchElement = wrapper.find('.switch-wrapper');
expect(switchElement.classes('enabled')).toBeFalsy();
store.set('switch', true);
await nextTick();
expect(switchElement.classes('enabled')).toBeTruthy();
});
test('toggles value in store', async () => { test('toggles value in store', async () => {
const wrapper = getWrapper(); const wrapper = getWrapper();