Author SHA1 Message Date
jakob.scheidandGitea a242bbad18 test(settings): add tests for switch
Added test cases for the switch to test the default value functionality.
2026-08-05 20:46:28 +02:00
jakob.scheidandGitea d28eb0a9d3 fix(settings): use switch default value as store value fallback
The switch now uses the default value as a fallback for the stored value
and updates the switch state when stored value changes.
2026-08-05 20:46:28 +02:00
jakob.scheidandGitea d1e95582a8 Merge pull request 'Fix(sidebar): hide sidebar border on small screens' (#173) from fix/sidebar-border-on-small-screens into main
Deploy on dev / Deploy on dev (push) Successful in 40s
Reviewed-on: #173
Reviewed-by: Jakob Gregory
2026-08-05 20:44:38 +02:00
jakob.scheid e5f27041d2 fix(sidebar): hide border on small screens 2026-08-05 19:33:34 +02:00
jakob.scheidandGitea baa924a2b2 Merge pull request 'Feat(fonts): Add font' (#162) from feature/fonts into main
Deploy on dev / Deploy on dev (push) Successful in 34s
Reviewed-on: #162
Reviewed-by: Jakob Gregory
2026-08-04 19:41:49 +02:00
jakob.scheidandGitea 26535cad45 feat(fonts): use Inter 2026-08-04 19:41:08 +02:00
jakob.scheidandGitea 5fdf0490b6 feat(fonts): load all fonts specified in font configuration 2026-08-04 19:41:08 +02:00
jakob.scheidandGitea 61817bf4fc feat(assets): add assets environment variables
Added the environment variables VITE_ASSETS_BUILD_ID for the ID of the
used build and VITE_ASSETS_BASE_URL for the base URL of the assets.
A script for reading this configuration was also added.
2026-08-04 19:41:08 +02:00
jakob.scheidandGitea 0f71f1240e Merge pull request 'Temporarily disable the default tap highlight' (#160) from fix/temporarily-disable-default-tap-highlight into main
Deploy on dev / Deploy on dev (push) Successful in 37s
Reviewed-on: #160
Reviewed-by: Jakob Scheid
2026-08-04 12:59:25 +02:00
jakob.gregoryandGitea d67c8aa80e Temporarily disable the default tap highlight
This is a temporary change until a custom tap highlight effect is implemented.
2026-08-04 12:00:00 +02:00
jakob.scheidandGitea 44c457ba20 Merge pull request 'Feat(sidebar): allow left sidebar layout content to toggle the sidebar' (#159) from feature/left-sidebar-layout-content-sidebar-toggling into main
Deploy on dev / Deploy on dev (push) Successful in 41s
Reviewed-on: #159
Reviewed-by: Johannes Vos
2026-08-03 17:29:23 +02:00
jakob.scheid 4b010d03ac feat(settings): toggle sidebar on small screens when section is selected
The settings view now hides the sidebar on small screens when a settings
section is selected.
2026-08-02 13:58:37 +02:00
jakob.scheid 813cc7c7fc feat(sidebar): allow left sidebar layout content to toggle sidebar 2026-08-02 13:57:11 +02:00
jakob.scheid a77bbec3fa refactor(sidebar): rename sidebar toggling function
Renamed the sidebar toggling function in the left sidebar layout to
toggleSidebar.
2026-08-02 13:56:25 +02:00
7 changed files with 90 additions and 12 deletions
+14
View File
@@ -1,2 +1,16 @@
# Copyright 2026 Seekra
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
# http://www.apache.org/licenses/LICENSE-2.0
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
VITE_ASSETS_BUILD_ID=2026-08-04-76a067e
VITE_ASSETS_BASE_URL=https://assets.seekra.jcloud-services.ddns.net
+11 -3
View File
@@ -16,7 +16,7 @@ limitations under the License.
<script setup>
import { useSettingsStore } from '../stores/settingsStore';
import { useId } from 'vue';
import { ref, useId, watch } from 'vue';
import { useI18n } from 'vue-i18n';
const { t } = useI18n();
@@ -35,8 +35,16 @@ const switchId = useId();
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 () {
store.set(props.path, !store.get(props.path));
enabled.value = !enabled.value;
store.set(props.path, enabled.value);
};
</script>
@@ -47,7 +55,7 @@ const toggle = function toggle () {
</label>
<div
class="switch-wrapper"
:class="{ enabled: store.get(props.path) }"
:class="{ enabled }"
:title="t('settings.switch.title')"
:aria-label="t('settings.switch.ariaLabel')"
:aria-labelledby="labelId"
@@ -20,17 +20,23 @@ import { useSettingsStore } from '../../stores/settingsStore.js';
import { expect, describe, test } from 'vitest';
import { nextTick } from 'vue';
const getWrapper = function getWrapper ({ i18n = 'switch1', translations = {} } = {}) {
const getWrapper = function getWrapper ({
i18n = 'switch1',
defaultValue = undefined,
translations = {},
piniaOptions = {}
} = {}) {
return mountComponent(Switch, {
attrs: {
setting: {
type: 'bool',
name: 'switch',
i18n
i18n,
default: defaultValue
},
path: 'switch'
}
}, translations);
}, translations, [], piniaOptions);
};
describe('Switch', () => {
@@ -53,6 +59,42 @@ describe('Switch', () => {
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 () => {
const wrapper = getWrapper();
+6 -1
View File
@@ -61,6 +61,10 @@ onMounted(async () => {
});
settingsLoaded.value = true;
});
const toggleSidebarIfSmallScreen = function toggleSidebarIfSmallScreen (toggleSidebarFunction) {
if (matchMedia('(max-width: 48rem)').matches) toggleSidebarFunction();
};
</script>
<template>
@@ -71,13 +75,14 @@ onMounted(async () => {
</h1>
</header>
<LeftSidebarLayout class="layout">
<template #sidebar>
<template #sidebar="{ toggleSidebar }">
<ul class="sidebar-sections-list">
<li v-for="section in settings">
<RouterLink
:to="`/settings/${section.name}`"
class="button button-link link sidebar-section"
:class="{ active: activeSection === section.name }"
@click="toggleSidebarIfSmallScreen(toggleSidebar)"
>
{{ t(section.i18n) }}
</RouterLink>
@@ -61,6 +61,10 @@ const toggleSidebar = function toggleSidebar () {
}
@media (max-width: 48rem) {
.sidebar {
border: none;
}
.sidebar:not(.expanded) .sidebar-expand-button {
display: none;
}
+5 -5
View File
@@ -29,7 +29,7 @@ const props = defineProps({
const expanded = ref(props.expanded);
const toggleExpanded = function toggleExpanded () {
const toggleSidebar = function toggleSidebar () {
expanded.value = !expanded.value;
};
</script>
@@ -37,13 +37,13 @@ const toggleExpanded = function toggleExpanded () {
<template>
<div class="layout-container" :class="{ expanded }">
<div class="sidebar-expand-button-container">
<SidebarExpandButton class="sidebar-expand-button" @click="toggleExpanded" />
<SidebarExpandButton class="sidebar-expand-button" @click="toggleSidebar" />
</div>
<Sidebar @toggle-expanded="toggleExpanded" :expanded="expanded" class="sidebar">
<slot name="sidebar" />
<Sidebar @toggle-expanded="toggleSidebar" :expanded="expanded" class="sidebar">
<slot name="sidebar" :toggleSidebar="toggleSidebar" />
</Sidebar>
<main class="main-content">
<slot />
<slot :toggleSidebar="toggleSidebar" />
</main>
</div>
</template>
+5
View File
@@ -87,3 +87,8 @@ input {
.button:hover {
background-color: var(--light-hover);
}
/* Temporary until a custom tap highlight is implemented. */
* {
-webkit-tap-highlight-color: transparent;
}