generated from Seekra/repository-template
Compare commits
3
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
69dab6c3eb
|
||
|
|
53b8546983
|
||
|
|
88fb3bfcd0
|
@@ -16,7 +16,7 @@ limitations under the License.
|
|||||||
|
|
||||||
<script setup>
|
<script setup>
|
||||||
import { useSettingsStore } from '../stores/settingsStore';
|
import { useSettingsStore } from '../stores/settingsStore';
|
||||||
import { ref, useId, watch } from 'vue';
|
import { useId } from 'vue';
|
||||||
import { useI18n } from 'vue-i18n';
|
import { useI18n } from 'vue-i18n';
|
||||||
|
|
||||||
const { t } = useI18n();
|
const { t } = useI18n();
|
||||||
@@ -35,16 +35,8 @@ 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 () {
|
||||||
enabled.value = !enabled.value;
|
store.set(props.path, !store.get(props.path));
|
||||||
store.set(props.path, enabled.value);
|
|
||||||
};
|
};
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
@@ -55,7 +47,7 @@ const toggle = function toggle () {
|
|||||||
</label>
|
</label>
|
||||||
<div
|
<div
|
||||||
class="switch-wrapper"
|
class="switch-wrapper"
|
||||||
:class="{ enabled }"
|
:class="{ enabled: store.get(props.path) }"
|
||||||
: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,23 +20,17 @@ 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 ({
|
const getWrapper = function getWrapper ({ i18n = 'switch1', translations = {} } = {}) {
|
||||||
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, [], piniaOptions);
|
}, translations);
|
||||||
};
|
};
|
||||||
|
|
||||||
describe('Switch', () => {
|
describe('Switch', () => {
|
||||||
@@ -59,42 +53,6 @@ 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();
|
||||||
|
|
||||||
|
|||||||
@@ -61,10 +61,6 @@ onMounted(async () => {
|
|||||||
});
|
});
|
||||||
settingsLoaded.value = true;
|
settingsLoaded.value = true;
|
||||||
});
|
});
|
||||||
|
|
||||||
const toggleSidebarIfSmallScreen = function toggleSidebarIfSmallScreen (toggleSidebarFunction) {
|
|
||||||
if (matchMedia('(max-width: 48rem)').matches) toggleSidebarFunction();
|
|
||||||
};
|
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
@@ -75,14 +71,13 @@ const toggleSidebarIfSmallScreen = function toggleSidebarIfSmallScreen (toggleSi
|
|||||||
</h1>
|
</h1>
|
||||||
</header>
|
</header>
|
||||||
<LeftSidebarLayout class="layout">
|
<LeftSidebarLayout class="layout">
|
||||||
<template #sidebar="{ toggleSidebar }">
|
<template #sidebar>
|
||||||
<ul class="sidebar-sections-list">
|
<ul class="sidebar-sections-list">
|
||||||
<li v-for="section in settings">
|
<li v-for="section in settings">
|
||||||
<RouterLink
|
<RouterLink
|
||||||
:to="`/settings/${section.name}`"
|
:to="`/settings/${section.name}`"
|
||||||
class="button button-link link sidebar-section"
|
class="button button-link link sidebar-section"
|
||||||
:class="{ active: activeSection === section.name }"
|
:class="{ active: activeSection === section.name }"
|
||||||
@click="toggleSidebarIfSmallScreen(toggleSidebar)"
|
|
||||||
>
|
>
|
||||||
{{ t(section.i18n) }}
|
{{ t(section.i18n) }}
|
||||||
</RouterLink>
|
</RouterLink>
|
||||||
|
|||||||
@@ -61,10 +61,6 @@ const toggleSidebar = function toggleSidebar () {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@media (max-width: 48rem) {
|
@media (max-width: 48rem) {
|
||||||
.sidebar {
|
|
||||||
border: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
.sidebar:not(.expanded) .sidebar-expand-button {
|
.sidebar:not(.expanded) .sidebar-expand-button {
|
||||||
display: none;
|
display: none;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -29,7 +29,7 @@ const props = defineProps({
|
|||||||
|
|
||||||
const expanded = ref(props.expanded);
|
const expanded = ref(props.expanded);
|
||||||
|
|
||||||
const toggleSidebar = function toggleSidebar () {
|
const toggleExpanded = function toggleExpanded () {
|
||||||
expanded.value = !expanded.value;
|
expanded.value = !expanded.value;
|
||||||
};
|
};
|
||||||
</script>
|
</script>
|
||||||
@@ -37,13 +37,13 @@ const toggleSidebar = function toggleSidebar () {
|
|||||||
<template>
|
<template>
|
||||||
<div class="layout-container" :class="{ expanded }">
|
<div class="layout-container" :class="{ expanded }">
|
||||||
<div class="sidebar-expand-button-container">
|
<div class="sidebar-expand-button-container">
|
||||||
<SidebarExpandButton class="sidebar-expand-button" @click="toggleSidebar" />
|
<SidebarExpandButton class="sidebar-expand-button" @click="toggleExpanded" />
|
||||||
</div>
|
</div>
|
||||||
<Sidebar @toggle-expanded="toggleSidebar" :expanded="expanded" class="sidebar">
|
<Sidebar @toggle-expanded="toggleExpanded" :expanded="expanded" class="sidebar">
|
||||||
<slot name="sidebar" :toggleSidebar="toggleSidebar" />
|
<slot name="sidebar" />
|
||||||
</Sidebar>
|
</Sidebar>
|
||||||
<main class="main-content">
|
<main class="main-content">
|
||||||
<slot :toggleSidebar="toggleSidebar" />
|
<slot />
|
||||||
</main>
|
</main>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|||||||
@@ -87,8 +87,3 @@ input {
|
|||||||
.button:hover {
|
.button:hover {
|
||||||
background-color: var(--light-hover);
|
background-color: var(--light-hover);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Temporary until a custom tap highlight is implemented. */
|
|
||||||
* {
|
|
||||||
-webkit-tap-highlight-color: transparent;
|
|
||||||
}
|
|
||||||
Reference in New Issue
Block a user