generated from Seekra/repository-template
Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
4b010d03ac
|
||
|
|
813cc7c7fc
|
||
|
|
a77bbec3fa
|
||
|
|
447207e5f0
|
||
|
|
0939379c0a
|
||
|
|
48e979ac64
|
||
|
|
0a58944157
|
||
|
|
63d9e31d29
|
||
|
|
e43784bff0
|
||
|
|
5b1f2b57a7
|
||
|
|
c70e285026
|
||
|
|
8f83efb16b
|
||
|
|
f41c5c407f
|
||
|
|
35bfedbd6b
|
@@ -557,6 +557,30 @@ describe('settingsValidator', () => {
|
||||
{ name: 'maybe', i18n: 'selectSomething.options.maybe' }
|
||||
] }],
|
||||
|
||||
[{ name: 'selectMultiple', type: 'selection', i18n: 'selectMultiple.title', default: ['1', '2', '3'], allowMultiple: true, options: [
|
||||
{ name: '1', i18n: 'selectMultiple.options.1' },
|
||||
{ name: '2', i18n: 'selectMultiple.options.2' },
|
||||
{ name: '3', i18n: 'selectMultiple.options.3' }
|
||||
] }],
|
||||
|
||||
[{ name: 'selectMultiple', type: 'selection', i18n: 'selectMultiple.title', default: ['2', '3'], allowMultiple: true, options: [
|
||||
{ name: '1', i18n: 'selectMultiple.options.1' },
|
||||
{ name: '2', i18n: 'selectMultiple.options.2' },
|
||||
{ name: '3', i18n: 'selectMultiple.options.3' }
|
||||
] }],
|
||||
|
||||
[{ name: 'selectMultiple', type: 'selection', i18n: 'selectMultiple.title', default: ['2'], allowMultiple: true, options: [
|
||||
{ name: '1', i18n: 'selectMultiple.options.1' },
|
||||
{ name: '2', i18n: 'selectMultiple.options.2' },
|
||||
{ name: '3', i18n: 'selectMultiple.options.3' }
|
||||
] }],
|
||||
|
||||
[{ name: 'selectMultiple', type: 'selection', i18n: 'selectMultiple.title', default: [], allowMultiple: true, options: [
|
||||
{ name: '1', i18n: 'selectMultiple.options.1' },
|
||||
{ name: '2', i18n: 'selectMultiple.options.2' },
|
||||
{ name: '3', i18n: 'selectMultiple.options.3' }
|
||||
] }],
|
||||
|
||||
[{ name: 'aSection', type: 'section', i18n: 'sections.aSection.title', content: [] }],
|
||||
[{ name: 'aSection', type: 'section', i18n: 'sections.aSection.title', content: [
|
||||
{ name: 'enableFeature42', type: 'bool', i18n: 'feature.42.enable', default: true }
|
||||
@@ -616,6 +640,34 @@ describe('settingsValidator', () => {
|
||||
|
||||
[{ name: 'selectSomething', type: 'selection', i18n: 'selectSomething.title', default: 'a', options: true }],
|
||||
[{ name: 'selectSomething', type: 'selection', i18n: 'selectSomething.title', default: 'a', options: [] }],
|
||||
[{ name: 'selectSomething', type: 'selection', i18n: 'selectSomething.title', default: ['a'], options: [
|
||||
{ name: 'a', i18n: 'a' },
|
||||
{ name: 'b', i18n: 'b' }
|
||||
] }],
|
||||
[{ name: 'selectSomething', type: 'selection', i18n: 'selectSomething.title', default: ['a', 'b'], options: [
|
||||
{ name: 'a', i18n: 'a' },
|
||||
{ name: 'b', i18n: 'b' }
|
||||
] }],
|
||||
[{ name: 'selectSomething', type: 'selection', i18n: 'selectSomething.title', allowMultiple: true, default: 'a', options: [
|
||||
{ name: 'a', i18n: 'a' },
|
||||
{ name: 'b', i18n: 'b' }
|
||||
] }],
|
||||
[{ name: 'selectSomething', type: 'selection', i18n: 'selectSomething.title', allowMultiple: true, default: 'a', options: [
|
||||
{ name: 'a', i18n: 'a' },
|
||||
{ name: 'b', i18n: 'b' }
|
||||
] }],
|
||||
[{ name: 'selectSomething', type: 'selection', i18n: 'selectSomething.title', allowMultiple: true, default: ['c'], options: [
|
||||
{ name: 'a', i18n: 'a' },
|
||||
{ name: 'b', i18n: 'b' }
|
||||
] }],
|
||||
[{ name: 'selectSomething', type: 'selection', i18n: 'selectSomething.title', allowMultiple: true, default: [1], options: [
|
||||
{ name: 'a', i18n: 'a' },
|
||||
{ name: 'b', i18n: 'b' }
|
||||
] }],
|
||||
[{ name: 'selectSomething', type: 'selection', i18n: 'selectSomething.title', allowMultiple: true, default: ['a', 1], options: [
|
||||
{ name: 'a', i18n: 'a' },
|
||||
{ name: 'b', i18n: 'b' }
|
||||
] }],
|
||||
[{ name: 'selectSomething', type: 'selection', i18n: 'selectSomething.title', default: 'c', options: [
|
||||
{ name: 'a', i18n: 'a' },
|
||||
{ name: 'b', i18n: 'b' }
|
||||
|
||||
@@ -73,12 +73,27 @@ export const validateEntry = function validateEntry (entry, path) {
|
||||
throw new Error(`[settings] "${path}.default" must be a string`);
|
||||
}
|
||||
if (entry.type === 'selection') {
|
||||
if (typeof entry.default !== 'string') {
|
||||
throw new Error(`[settings] "${path}.default" must be a string`);
|
||||
};
|
||||
if (!entry.options.map((option) => option.name).includes(entry.default)) {
|
||||
throw new Error(`[settings] option "${path}.default" does not exist`);
|
||||
};
|
||||
if (entry.allowMultiple) {
|
||||
if (!Array.isArray(entry.default)) {
|
||||
throw new Error(`[settings] "${path}.default" must be an array`);
|
||||
}
|
||||
const allOptions = entry.options.map((option) => option.name);
|
||||
entry.default.forEach((defaultValue, index) => {
|
||||
if (typeof defaultValue !== 'string') {
|
||||
throw new Error(`[settings] "${path}.default[${index}]" must be a string`);
|
||||
}
|
||||
if (!allOptions.includes(defaultValue)) {
|
||||
throw new Error(`[settings] option "${path}.default[${index}]" does not exist`);
|
||||
}
|
||||
});
|
||||
} else {
|
||||
if (typeof entry.default !== 'string') {
|
||||
throw new Error(`[settings] "${path}.default" must be a string`);
|
||||
};
|
||||
if (!entry.options.map((option) => option.name).includes(entry.default)) {
|
||||
throw new Error(`[settings] option "${path}.default" does not exist`);
|
||||
};
|
||||
}
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
Reference in New Issue
Block a user