1
0
mirror of https://github.com/amir20/dozzle.git synced 2025-12-21 13:04:59 +01:00

chore: upgrade to unplug-vue-router (#3041)

This commit is contained in:
Amir Raminfar
2024-06-17 12:07:24 -07:00
committed by GitHub
parent d344c5f20e
commit f24d4951ad
22 changed files with 199 additions and 571 deletions

View File

@@ -5,8 +5,8 @@
// Generated by unplugin-auto-import // Generated by unplugin-auto-import
export {} export {}
declare global { declare global {
const $: typeof import('vue/macros')['$']
const $$: typeof import('vue/macros')['$$'] const $$: typeof import('vue/macros')['$$']
const $: typeof import('vue/macros')['$']
const $computed: typeof import('vue/macros')['$computed'] const $computed: typeof import('vue/macros')['$computed']
const $customRef: typeof import('vue/macros')['$customRef'] const $customRef: typeof import('vue/macros')['$customRef']
const $ref: typeof import('vue/macros')['$ref'] const $ref: typeof import('vue/macros')['$ref']
@@ -27,7 +27,6 @@ declare global {
const computedInject: typeof import('@vueuse/core')['computedInject'] const computedInject: typeof import('@vueuse/core')['computedInject']
const computedWithControl: typeof import('@vueuse/core')['computedWithControl'] const computedWithControl: typeof import('@vueuse/core')['computedWithControl']
const config: typeof import('./stores/config')['default'] const config: typeof import('./stores/config')['default']
const containerContext: typeof import('./composable/containerContext')['containerContext']
const controlledComputed: typeof import('@vueuse/core')['controlledComputed'] const controlledComputed: typeof import('@vueuse/core')['controlledComputed']
const controlledRef: typeof import('@vueuse/core')['controlledRef'] const controlledRef: typeof import('@vueuse/core')['controlledRef']
const createApp: typeof import('vue')['createApp'] const createApp: typeof import('vue')['createApp']
@@ -46,6 +45,7 @@ declare global {
const debouncedWatch: typeof import('@vueuse/core')['debouncedWatch'] const debouncedWatch: typeof import('@vueuse/core')['debouncedWatch']
const defineAsyncComponent: typeof import('vue')['defineAsyncComponent'] const defineAsyncComponent: typeof import('vue')['defineAsyncComponent']
const defineComponent: typeof import('vue')['defineComponent'] const defineComponent: typeof import('vue')['defineComponent']
const definePage: typeof import('unplugin-vue-router/runtime')['definePage']
const defineStore: typeof import('pinia')['defineStore'] const defineStore: typeof import('pinia')['defineStore']
const eagerComputed: typeof import('@vueuse/core')['eagerComputed'] const eagerComputed: typeof import('@vueuse/core')['eagerComputed']
const effectScope: typeof import('vue')['effectScope'] const effectScope: typeof import('vue')['effectScope']
@@ -84,8 +84,8 @@ declare global {
const nextTick: typeof import('vue')['nextTick'] const nextTick: typeof import('vue')['nextTick']
const onActivated: typeof import('vue')['onActivated'] const onActivated: typeof import('vue')['onActivated']
const onBeforeMount: typeof import('vue')['onBeforeMount'] const onBeforeMount: typeof import('vue')['onBeforeMount']
const onBeforeRouteLeave: typeof import('vue-router')['onBeforeRouteLeave'] const onBeforeRouteLeave: typeof import('vue-router/auto')['onBeforeRouteLeave']
const onBeforeRouteUpdate: typeof import('vue-router')['onBeforeRouteUpdate'] const onBeforeRouteUpdate: typeof import('vue-router/auto')['onBeforeRouteUpdate']
const onBeforeUnmount: typeof import('vue')['onBeforeUnmount'] const onBeforeUnmount: typeof import('vue')['onBeforeUnmount']
const onBeforeUpdate: typeof import('vue')['onBeforeUpdate'] const onBeforeUpdate: typeof import('vue')['onBeforeUpdate']
const onClickOutside: typeof import('@vueuse/core')['onClickOutside'] const onClickOutside: typeof import('@vueuse/core')['onClickOutside']
@@ -105,7 +105,6 @@ declare global {
const persistentVisibleKeysForContainer: typeof import('./composable/storage')['persistentVisibleKeysForContainer'] const persistentVisibleKeysForContainer: typeof import('./composable/storage')['persistentVisibleKeysForContainer']
const pinnedContainers: typeof import('./composable/storage')['pinnedContainers'] const pinnedContainers: typeof import('./composable/storage')['pinnedContainers']
const provide: typeof import('vue')['provide'] const provide: typeof import('vue')['provide']
const provideContainerContext: typeof import('./composable/containerContext')['provideContainerContext']
const provideLocal: typeof import('@vueuse/core')['provideLocal'] const provideLocal: typeof import('@vueuse/core')['provideLocal']
const provideLoggingContext: typeof import('./composable/logContext')['provideLoggingContext'] const provideLoggingContext: typeof import('./composable/logContext')['provideLoggingContext']
const reactify: typeof import('@vueuse/core')['reactify'] const reactify: typeof import('@vueuse/core')['reactify']
@@ -190,7 +189,6 @@ declare global {
const useColorMode: typeof import('@vueuse/core')['useColorMode'] const useColorMode: typeof import('@vueuse/core')['useColorMode']
const useConfirmDialog: typeof import('@vueuse/core')['useConfirmDialog'] const useConfirmDialog: typeof import('@vueuse/core')['useConfirmDialog']
const useContainerActions: typeof import('./composable/containerActions')['useContainerActions'] const useContainerActions: typeof import('./composable/containerActions')['useContainerActions']
const useContainerContext: typeof import('./composable/containerContext')['useContainerContext']
const useContainerStore: typeof import('./stores/container')['useContainerStore'] const useContainerStore: typeof import('./stores/container')['useContainerStore']
const useContainerStream: typeof import('./composable/eventStreams')['useContainerStream'] const useContainerStream: typeof import('./composable/eventStreams')['useContainerStream']
const useCounter: typeof import('@vueuse/core')['useCounter'] const useCounter: typeof import('@vueuse/core')['useCounter']
@@ -244,7 +242,6 @@ declare global {
const useIntervalFn: typeof import('@vueuse/core')['useIntervalFn'] const useIntervalFn: typeof import('@vueuse/core')['useIntervalFn']
const useKeyModifier: typeof import('@vueuse/core')['useKeyModifier'] const useKeyModifier: typeof import('@vueuse/core')['useKeyModifier']
const useLastChanged: typeof import('@vueuse/core')['useLastChanged'] const useLastChanged: typeof import('@vueuse/core')['useLastChanged']
const useLink: typeof import('vue-router')['useLink']
const useLocalStorage: typeof import('@vueuse/core')['useLocalStorage'] const useLocalStorage: typeof import('@vueuse/core')['useLocalStorage']
const useLogSearchContext: typeof import('./composable/logSearchContext')['useLogSearchContext'] const useLogSearchContext: typeof import('./composable/logSearchContext')['useLogSearchContext']
const useLoggingContext: typeof import('./composable/logContext')['useLoggingContext'] const useLoggingContext: typeof import('./composable/logContext')['useLoggingContext']
@@ -286,8 +283,8 @@ declare global {
const useRefHistory: typeof import('@vueuse/core')['useRefHistory'] const useRefHistory: typeof import('@vueuse/core')['useRefHistory']
const useReleases: typeof import('./stores/releases')['useReleases'] const useReleases: typeof import('./stores/releases')['useReleases']
const useResizeObserver: typeof import('@vueuse/core')['useResizeObserver'] const useResizeObserver: typeof import('@vueuse/core')['useResizeObserver']
const useRoute: typeof import('vue-router')['useRoute'] const useRoute: typeof import('vue-router/auto')['useRoute']
const useRouter: typeof import('vue-router')['useRouter'] const useRouter: typeof import('vue-router/auto')['useRouter']
const useScreenOrientation: typeof import('@vueuse/core')['useScreenOrientation'] const useScreenOrientation: typeof import('@vueuse/core')['useScreenOrientation']
const useScreenSafeArea: typeof import('@vueuse/core')['useScreenSafeArea'] const useScreenSafeArea: typeof import('@vueuse/core')['useScreenSafeArea']
const useScriptTag: typeof import('@vueuse/core')['useScriptTag'] const useScriptTag: typeof import('@vueuse/core')['useScriptTag']
@@ -413,6 +410,7 @@ declare module 'vue' {
readonly debouncedWatch: UnwrapRef<typeof import('@vueuse/core')['debouncedWatch']> readonly debouncedWatch: UnwrapRef<typeof import('@vueuse/core')['debouncedWatch']>
readonly defineAsyncComponent: UnwrapRef<typeof import('vue')['defineAsyncComponent']> readonly defineAsyncComponent: UnwrapRef<typeof import('vue')['defineAsyncComponent']>
readonly defineComponent: UnwrapRef<typeof import('vue')['defineComponent']> readonly defineComponent: UnwrapRef<typeof import('vue')['defineComponent']>
readonly definePage: UnwrapRef<typeof import('unplugin-vue-router/runtime')['definePage']>
readonly defineStore: UnwrapRef<typeof import('pinia')['defineStore']> readonly defineStore: UnwrapRef<typeof import('pinia')['defineStore']>
readonly eagerComputed: UnwrapRef<typeof import('@vueuse/core')['eagerComputed']> readonly eagerComputed: UnwrapRef<typeof import('@vueuse/core')['eagerComputed']>
readonly effectScope: UnwrapRef<typeof import('vue')['effectScope']> readonly effectScope: UnwrapRef<typeof import('vue')['effectScope']>
@@ -451,8 +449,8 @@ declare module 'vue' {
readonly nextTick: UnwrapRef<typeof import('vue')['nextTick']> readonly nextTick: UnwrapRef<typeof import('vue')['nextTick']>
readonly onActivated: UnwrapRef<typeof import('vue')['onActivated']> readonly onActivated: UnwrapRef<typeof import('vue')['onActivated']>
readonly onBeforeMount: UnwrapRef<typeof import('vue')['onBeforeMount']> readonly onBeforeMount: UnwrapRef<typeof import('vue')['onBeforeMount']>
readonly onBeforeRouteLeave: UnwrapRef<typeof import('vue-router')['onBeforeRouteLeave']> readonly onBeforeRouteLeave: UnwrapRef<typeof import('vue-router/auto')['onBeforeRouteLeave']>
readonly onBeforeRouteUpdate: UnwrapRef<typeof import('vue-router')['onBeforeRouteUpdate']> readonly onBeforeRouteUpdate: UnwrapRef<typeof import('vue-router/auto')['onBeforeRouteUpdate']>
readonly onBeforeUnmount: UnwrapRef<typeof import('vue')['onBeforeUnmount']> readonly onBeforeUnmount: UnwrapRef<typeof import('vue')['onBeforeUnmount']>
readonly onBeforeUpdate: UnwrapRef<typeof import('vue')['onBeforeUpdate']> readonly onBeforeUpdate: UnwrapRef<typeof import('vue')['onBeforeUpdate']>
readonly onClickOutside: UnwrapRef<typeof import('@vueuse/core')['onClickOutside']> readonly onClickOutside: UnwrapRef<typeof import('@vueuse/core')['onClickOutside']>
@@ -609,7 +607,6 @@ declare module 'vue' {
readonly useIntervalFn: UnwrapRef<typeof import('@vueuse/core')['useIntervalFn']> readonly useIntervalFn: UnwrapRef<typeof import('@vueuse/core')['useIntervalFn']>
readonly useKeyModifier: UnwrapRef<typeof import('@vueuse/core')['useKeyModifier']> readonly useKeyModifier: UnwrapRef<typeof import('@vueuse/core')['useKeyModifier']>
readonly useLastChanged: UnwrapRef<typeof import('@vueuse/core')['useLastChanged']> readonly useLastChanged: UnwrapRef<typeof import('@vueuse/core')['useLastChanged']>
readonly useLink: UnwrapRef<typeof import('vue-router')['useLink']>
readonly useLocalStorage: UnwrapRef<typeof import('@vueuse/core')['useLocalStorage']> readonly useLocalStorage: UnwrapRef<typeof import('@vueuse/core')['useLocalStorage']>
readonly useLogSearchContext: UnwrapRef<typeof import('./composable/logSearchContext')['useLogSearchContext']> readonly useLogSearchContext: UnwrapRef<typeof import('./composable/logSearchContext')['useLogSearchContext']>
readonly useLoggingContext: UnwrapRef<typeof import('./composable/logContext')['useLoggingContext']> readonly useLoggingContext: UnwrapRef<typeof import('./composable/logContext')['useLoggingContext']>
@@ -651,8 +648,8 @@ declare module 'vue' {
readonly useRefHistory: UnwrapRef<typeof import('@vueuse/core')['useRefHistory']> readonly useRefHistory: UnwrapRef<typeof import('@vueuse/core')['useRefHistory']>
readonly useReleases: UnwrapRef<typeof import('./stores/releases')['useReleases']> readonly useReleases: UnwrapRef<typeof import('./stores/releases')['useReleases']>
readonly useResizeObserver: UnwrapRef<typeof import('@vueuse/core')['useResizeObserver']> readonly useResizeObserver: UnwrapRef<typeof import('@vueuse/core')['useResizeObserver']>
readonly useRoute: UnwrapRef<typeof import('vue-router')['useRoute']> readonly useRoute: UnwrapRef<typeof import('vue-router/auto')['useRoute']>
readonly useRouter: UnwrapRef<typeof import('vue-router')['useRouter']> readonly useRouter: UnwrapRef<typeof import('vue-router/auto')['useRouter']>
readonly useScreenOrientation: UnwrapRef<typeof import('@vueuse/core')['useScreenOrientation']> readonly useScreenOrientation: UnwrapRef<typeof import('@vueuse/core')['useScreenOrientation']>
readonly useScreenSafeArea: UnwrapRef<typeof import('@vueuse/core')['useScreenSafeArea']> readonly useScreenSafeArea: UnwrapRef<typeof import('@vueuse/core')['useScreenSafeArea']>
readonly useScriptTag: UnwrapRef<typeof import('@vueuse/core')['useScriptTag']> readonly useScriptTag: UnwrapRef<typeof import('@vueuse/core')['useScriptTag']>
@@ -771,6 +768,7 @@ declare module '@vue/runtime-core' {
readonly debouncedWatch: UnwrapRef<typeof import('@vueuse/core')['debouncedWatch']> readonly debouncedWatch: UnwrapRef<typeof import('@vueuse/core')['debouncedWatch']>
readonly defineAsyncComponent: UnwrapRef<typeof import('vue')['defineAsyncComponent']> readonly defineAsyncComponent: UnwrapRef<typeof import('vue')['defineAsyncComponent']>
readonly defineComponent: UnwrapRef<typeof import('vue')['defineComponent']> readonly defineComponent: UnwrapRef<typeof import('vue')['defineComponent']>
readonly definePage: UnwrapRef<typeof import('unplugin-vue-router/runtime')['definePage']>
readonly defineStore: UnwrapRef<typeof import('pinia')['defineStore']> readonly defineStore: UnwrapRef<typeof import('pinia')['defineStore']>
readonly eagerComputed: UnwrapRef<typeof import('@vueuse/core')['eagerComputed']> readonly eagerComputed: UnwrapRef<typeof import('@vueuse/core')['eagerComputed']>
readonly effectScope: UnwrapRef<typeof import('vue')['effectScope']> readonly effectScope: UnwrapRef<typeof import('vue')['effectScope']>
@@ -809,8 +807,8 @@ declare module '@vue/runtime-core' {
readonly nextTick: UnwrapRef<typeof import('vue')['nextTick']> readonly nextTick: UnwrapRef<typeof import('vue')['nextTick']>
readonly onActivated: UnwrapRef<typeof import('vue')['onActivated']> readonly onActivated: UnwrapRef<typeof import('vue')['onActivated']>
readonly onBeforeMount: UnwrapRef<typeof import('vue')['onBeforeMount']> readonly onBeforeMount: UnwrapRef<typeof import('vue')['onBeforeMount']>
readonly onBeforeRouteLeave: UnwrapRef<typeof import('vue-router')['onBeforeRouteLeave']> readonly onBeforeRouteLeave: UnwrapRef<typeof import('vue-router/auto')['onBeforeRouteLeave']>
readonly onBeforeRouteUpdate: UnwrapRef<typeof import('vue-router')['onBeforeRouteUpdate']> readonly onBeforeRouteUpdate: UnwrapRef<typeof import('vue-router/auto')['onBeforeRouteUpdate']>
readonly onBeforeUnmount: UnwrapRef<typeof import('vue')['onBeforeUnmount']> readonly onBeforeUnmount: UnwrapRef<typeof import('vue')['onBeforeUnmount']>
readonly onBeforeUpdate: UnwrapRef<typeof import('vue')['onBeforeUpdate']> readonly onBeforeUpdate: UnwrapRef<typeof import('vue')['onBeforeUpdate']>
readonly onClickOutside: UnwrapRef<typeof import('@vueuse/core')['onClickOutside']> readonly onClickOutside: UnwrapRef<typeof import('@vueuse/core')['onClickOutside']>
@@ -967,7 +965,6 @@ declare module '@vue/runtime-core' {
readonly useIntervalFn: UnwrapRef<typeof import('@vueuse/core')['useIntervalFn']> readonly useIntervalFn: UnwrapRef<typeof import('@vueuse/core')['useIntervalFn']>
readonly useKeyModifier: UnwrapRef<typeof import('@vueuse/core')['useKeyModifier']> readonly useKeyModifier: UnwrapRef<typeof import('@vueuse/core')['useKeyModifier']>
readonly useLastChanged: UnwrapRef<typeof import('@vueuse/core')['useLastChanged']> readonly useLastChanged: UnwrapRef<typeof import('@vueuse/core')['useLastChanged']>
readonly useLink: UnwrapRef<typeof import('vue-router')['useLink']>
readonly useLocalStorage: UnwrapRef<typeof import('@vueuse/core')['useLocalStorage']> readonly useLocalStorage: UnwrapRef<typeof import('@vueuse/core')['useLocalStorage']>
readonly useLogSearchContext: UnwrapRef<typeof import('./composable/logSearchContext')['useLogSearchContext']> readonly useLogSearchContext: UnwrapRef<typeof import('./composable/logSearchContext')['useLogSearchContext']>
readonly useLoggingContext: UnwrapRef<typeof import('./composable/logContext')['useLoggingContext']> readonly useLoggingContext: UnwrapRef<typeof import('./composable/logContext')['useLoggingContext']>
@@ -1009,8 +1006,8 @@ declare module '@vue/runtime-core' {
readonly useRefHistory: UnwrapRef<typeof import('@vueuse/core')['useRefHistory']> readonly useRefHistory: UnwrapRef<typeof import('@vueuse/core')['useRefHistory']>
readonly useReleases: UnwrapRef<typeof import('./stores/releases')['useReleases']> readonly useReleases: UnwrapRef<typeof import('./stores/releases')['useReleases']>
readonly useResizeObserver: UnwrapRef<typeof import('@vueuse/core')['useResizeObserver']> readonly useResizeObserver: UnwrapRef<typeof import('@vueuse/core')['useResizeObserver']>
readonly useRoute: UnwrapRef<typeof import('vue-router')['useRoute']> readonly useRoute: UnwrapRef<typeof import('vue-router/auto')['useRoute']>
readonly useRouter: UnwrapRef<typeof import('vue-router')['useRouter']> readonly useRouter: UnwrapRef<typeof import('vue-router/auto')['useRouter']>
readonly useScreenOrientation: UnwrapRef<typeof import('@vueuse/core')['useScreenOrientation']> readonly useScreenOrientation: UnwrapRef<typeof import('@vueuse/core')['useScreenOrientation']>
readonly useScreenSafeArea: UnwrapRef<typeof import('@vueuse/core')['useScreenSafeArea']> readonly useScreenSafeArea: UnwrapRef<typeof import('@vueuse/core')['useScreenSafeArea']>
readonly useScriptTag: UnwrapRef<typeof import('@vueuse/core')['useScriptTag']> readonly useScriptTag: UnwrapRef<typeof import('@vueuse/core')['useScriptTag']>

View File

@@ -66,7 +66,7 @@
<tbody> <tbody>
<tr v-for="container in paginated" :key="container.id"> <tr v-for="container in paginated" :key="container.id">
<td v-if="isVisible('name')"> <td v-if="isVisible('name')">
<router-link :to="{ name: 'container-id', params: { id: container.id } }" :title="container.name"> <router-link :to="{ name: '/container/[id]', params: { id: container.id } }" :title="container.name">
{{ container.name }} {{ container.name }}
</router-link> </router-link>
</td> </td>

View File

@@ -75,6 +75,6 @@ describe("<FuzzySearchModal />", () => {
const wrapper = createFuzzySearchModal(); const wrapper = createFuzzySearchModal();
await wrapper.find("input").setValue("baz"); await wrapper.find("input").setValue("baz");
await wrapper.find("input").trigger("keydown.enter"); await wrapper.find("input").trigger("keydown.enter");
expect(useRouter().push).toHaveBeenCalledWith({ name: "container-id", params: { id: "567" } }); expect(useRouter().push).toHaveBeenCalledWith({ name: "/container/[id]", params: { id: "567" } });
}); });
}); });

View File

@@ -166,11 +166,11 @@ useFocus(input, { initialValue: true });
function selected(item: Item) { function selected(item: Item) {
if (item.type === "container") { if (item.type === "container") {
router.push({ name: "container-id", params: { id: item.id } }); router.push({ name: "/container/[id]", params: { id: item.id } });
} else if (item.type === "service") { } else if (item.type === "service") {
router.push({ name: "service-name", params: { name: item.id } }); router.push({ name: "/service/[name]", params: { name: item.id } });
} else if (item.type === "stack") { } else if (item.type === "stack") {
router.push({ name: "stack-name", params: { name: item.id } }); router.push({ name: "/stack/[name]", params: { name: item.id } });
} }
close(); close();
} }

View File

@@ -33,7 +33,7 @@
<router-link <router-link
:to="{ :to="{
name: 'merged-name', name: '/merged/[name]',
query: { id: containers.map(({ id }) => id) }, query: { id: containers.map(({ id }) => id) },
params: { name: label.replace('label.', '') }, params: { name: label.replace('label.', '') },
}" }"
@@ -48,7 +48,7 @@
<li v-for="item in containers" :class="item.state" :key="item.id"> <li v-for="item in containers" :class="item.state" :key="item.id">
<Popup> <Popup>
<router-link <router-link
:to="{ name: 'container-id', params: { id: item.id } }" :to="{ name: '/container/[id]', params: { id: item.id } }"
active-class="active-primary" active-class="active-primary"
@click.alt.stop.prevent="pinnedStore.pinContainer(item)" @click.alt.stop.prevent="pinnedStore.pinContainer(item)"
:title="item.name" :title="item.name"

View File

@@ -16,7 +16,7 @@
</Dropdown> </Dropdown>
<router-link <router-link
:to="{ name: 'settings' }" :to="{ name: '/settings' }"
:aria-label="$t('title.settings')" :aria-label="$t('title.settings')"
data-testid="settings" data-testid="settings"
class="btn btn-circle btn-sm" class="btn btn-circle btn-sm"

View File

@@ -17,7 +17,7 @@
$t("button.cancel") $t("button.cancel")
}}</TimedButton> }}</TimedButton>
<router-link <router-link
:to="{ name: 'container-id', params: { id: nextContainer.id } }" :to="{ name: '/container/[id]', params: { id: nextContainer.id } }"
class="btn btn-primary btn-sm" class="btn btn-primary btn-sm"
v-else v-else
> >
@@ -59,7 +59,7 @@ const nextContainer = computed(
const followEligible = computed( const followEligible = computed(
() => () =>
router.currentRoute.value.name === "container-id" && router.currentRoute.value.name === "/container/[id]" &&
logEntry.event === "container-stopped" && logEntry.event === "container-stopped" &&
containers.value.length === 1 && containers.value.length === 1 &&
nextContainer.value !== undefined, nextContainer.value !== undefined,
@@ -74,7 +74,7 @@ function redirectNow() {
}, },
{ expire: 5000 }, { expire: 5000 },
); );
router.push({ name: "container-id", params: { id: nextContainer.value?.id } }); router.push({ name: "/container/[id]", params: { id: nextContainer.value?.id } });
} }
</script> </script>

View File

@@ -1,7 +1,7 @@
<template> <template>
<aside class="fixed h-screen w-[inherit] overflow-auto p-3" data-testid="navigation"> <aside class="fixed h-screen w-[inherit] overflow-auto p-3" data-testid="navigation">
<h1> <h1>
<router-link :to="{ name: 'index' }"> <router-link :to="{ name: '/' }">
<svg class="h-14 w-28 fill-secondary"> <svg class="h-14 w-28 fill-secondary">
<use href="#logo"></use> <use href="#logo"></use>
</svg> </svg>

View File

@@ -7,7 +7,7 @@
{{ name }} {{ name }}
<router-link <router-link
:to="{ name: 'stack-name', params: { name } }" :to="{ name: '/stack/[name]', params: { name } }"
class="btn btn-square btn-outline btn-primary btn-xs" class="btn btn-square btn-outline btn-primary btn-xs"
active-class="btn-active" active-class="btn-active"
:title="$t('tooltip.merge-services')" :title="$t('tooltip.merge-services')"
@@ -17,7 +17,10 @@
</summary> </summary>
<ul> <ul>
<li v-for="service in services" :key="service.name"> <li v-for="service in services" :key="service.name">
<router-link :to="{ name: 'service-name', params: { name: service.name } }" active-class="active-primary"> <router-link
:to="{ name: '/service/[name]', params: { name: service.name } }"
active-class="active-primary"
>
<ph:stack-simple /> <ph:stack-simple />
<div class="truncate"> <div class="truncate">
{{ service.name }} {{ service.name }}
@@ -36,7 +39,10 @@
</summary> </summary>
<ul> <ul>
<li v-for="service in serivcesWithoutStacks" :key="service.name"> <li v-for="service in serivcesWithoutStacks" :key="service.name">
<router-link :to="{ name: 'service-name', params: { name: service.name } }" active-class="active-primary"> <router-link
:to="{ name: '/service/[name]', params: { name: service.name } }"
active-class="active-primary"
>
<ph:stack-simple /> <ph:stack-simple />
<div class="truncate"> <div class="truncate">
{{ service.name }} {{ service.name }}
@@ -55,7 +61,7 @@
</summary> </summary>
<ul> <ul>
<li v-for="group in customGroups" :key="group.name"> <li v-for="group in customGroups" :key="group.name">
<router-link :to="{ name: 'group-name', params: { name: group.name } }" active-class="active-primary"> <router-link :to="{ name: '/group/[name]', params: { name: group.name } }" active-class="active-primary">
<ph:stack-simple /> <ph:stack-simple />
<div class="truncate"> <div class="truncate">
{{ group.name }} {{ group.name }}

View File

@@ -1,7 +1,7 @@
<template> <template>
<nav class="fixed top-0 z-10 w-full border-b border-base-content/20 bg-base p-2" data-testid="navigation"> <nav class="fixed top-0 z-10 w-full border-b border-base-content/20 bg-base p-2" data-testid="navigation">
<div class="flex items-center"> <div class="flex items-center">
<router-link :to="{ name: 'index' }"> <router-link :to="{ name: '/' }">
<svg class="h-14 w-28 fill-secondary"> <svg class="h-14 w-28 fill-secondary">
<use href="#logo"></use> <use href="#logo"></use>
</svg> </svg>
@@ -35,7 +35,7 @@
<li class="menu-title">{{ $t("label.containers") }}</li> <li class="menu-title">{{ $t("label.containers") }}</li>
<li v-for="item in sortedContainers" :key="item.id" :class="item.state"> <li v-for="item in sortedContainers" :key="item.id" :class="item.state">
<router-link <router-link
:to="{ name: 'container-id', params: { id: item.id } }" :to="{ name: '/container/[id]', params: { id: item.id } }"
active-class="active-primary" active-class="active-primary"
class="truncate" class="truncate"
:title="item.name" :title="item.name"

View File

@@ -1,12 +1,11 @@
import { type App } from "vue"; import { type App } from "vue";
import { createRouter, createWebHistory } from "vue-router"; import { createRouter, createWebHistory } from "vue-router";
import pages from "~pages"; import { routes } from "vue-router/auto-routes";
import { setupLayouts } from "virtual:generated-layouts"; import { setupLayouts } from "virtual:generated-layouts";
const routes = setupLayouts(pages);
export const router = createRouter({ export const router = createRouter({
history: createWebHistory(withBase("/")), history: createWebHistory(withBase("/")),
routes, routes: setupLayouts(routes),
}); });
export const install = (app: App) => { export const install = (app: App) => {

View File

@@ -11,10 +11,11 @@
</template> </template>
<script lang="ts" setup> <script lang="ts" setup>
const { id } = defineProps<{ id: string }>(); const route = useRoute("/container/[id]");
const id = toRef(() => route.params.id);
const containerStore = useContainerStore(); const containerStore = useContainerStore();
const currentContainer = containerStore.currentContainer($$(id)); const currentContainer = containerStore.currentContainer(id);
const { ready } = storeToRefs(containerStore); const { ready } = storeToRefs(containerStore);
const pinnedLogsStore = usePinnedLogsStore(); const pinnedLogsStore = usePinnedLogsStore();

View File

@@ -1,10 +1,10 @@
<template> <template>
<Search /> <Search />
<GroupedLog :name="name" :scrollable="pinnedLogs.length > 0" /> <GroupedLog :name="route.params.name" :scrollable="pinnedLogs.length > 0" />
</template> </template>
<script lang="ts" setup> <script lang="ts" setup>
const { name } = defineProps<{ name: string }>(); const route = useRoute("/group/[name]");
const swarmStore = useSwarmStore(); const swarmStore = useSwarmStore();
const { customGroups } = storeToRefs(swarmStore); const { customGroups } = storeToRefs(swarmStore);
@@ -12,7 +12,7 @@ const { customGroups } = storeToRefs(swarmStore);
const pinnedLogsStore = usePinnedLogsStore(); const pinnedLogsStore = usePinnedLogsStore();
const { pinnedLogs } = storeToRefs(pinnedLogsStore); const { pinnedLogs } = storeToRefs(pinnedLogsStore);
const group = computed(() => customGroups.value.find((g) => g.name === name)); const group = computed(() => customGroups.value.find((g) => g.name === route.params.name));
watchEffect(() => { watchEffect(() => {
if (group.value?.name) { if (group.value?.name) {

View File

@@ -7,7 +7,7 @@
const containerStore = useContainerStore(); const containerStore = useContainerStore();
const { ready } = storeToRefs(containerStore); const { ready } = storeToRefs(containerStore);
const route = useRoute(); const route = useRoute("/merged/[name]");
const pinnedLogsStore = usePinnedLogsStore(); const pinnedLogsStore = usePinnedLogsStore();
const { pinnedLogs } = storeToRefs(pinnedLogsStore); const { pinnedLogs } = storeToRefs(pinnedLogsStore);

View File

@@ -1,10 +1,10 @@
<template> <template>
<Search /> <Search />
<ServiceLog :name="name" :scrollable="pinnedLogs.length > 0" /> <ServiceLog :name="route.params.name" :scrollable="pinnedLogs.length > 0" />
</template> </template>
<script lang="ts" setup> <script lang="ts" setup>
const { name } = defineProps<{ name: string }>(); const route = useRoute("/service/[name]");
const containerStore = useContainerStore(); const containerStore = useContainerStore();
const { ready } = storeToRefs(containerStore); const { ready } = storeToRefs(containerStore);
@@ -14,7 +14,7 @@ const { pinnedLogs } = storeToRefs(pinnedLogsStore);
const stackStore = useSwarmStore(); const stackStore = useSwarmStore();
const { services } = storeToRefs(stackStore); const { services } = storeToRefs(stackStore);
const service = computed(() => services.value.find((s) => s.name === name)); const service = computed(() => services.value.find((s) => s.name === route.params.name));
watchEffect(() => { watchEffect(() => {
if (ready.value) { if (ready.value) {

View File

@@ -10,14 +10,14 @@ watch(visibleContainers, (newValue) => {
if (route.query.name) { if (route.query.name) {
const [container, _] = visibleContainers.value.filter((c) => c.name == route.query.name); const [container, _] = visibleContainers.value.filter((c) => c.name == route.query.name);
if (container) { if (container) {
router.push({ name: "container-id", params: { id: container.id } }); router.push({ name: "/container/[id]", params: { id: container.id } });
} else { } else {
console.error(`No containers found matching name=${route.query.name}. Redirecting to /`); console.error(`No containers found matching name=${route.query.name}. Redirecting to /`);
router.push({ name: "index" }); router.push({ name: "/" });
} }
} else { } else {
console.error(`Expection query parameter name to be set. Redirecting to /`); console.error(`Expection query parameter name to be set. Redirecting to /`);
router.push({ name: "index" }); router.push({ name: "/" });
} }
} }
}); });

View File

@@ -1,10 +1,10 @@
<template> <template>
<Search /> <Search />
<StackLog :name="name" :scrollable="pinnedLogs.length > 0" /> <StackLog :name="route.params.name" :scrollable="pinnedLogs.length > 0" />
</template> </template>
<script lang="ts" setup> <script lang="ts" setup>
const { name } = defineProps<{ name: string }>(); const route = useRoute("/stack/[name]");
const containerStore = useContainerStore(); const containerStore = useContainerStore();
const { ready } = storeToRefs(containerStore); const { ready } = storeToRefs(containerStore);
@@ -14,7 +14,7 @@ const { pinnedLogs } = storeToRefs(pinnedLogsStore);
const stackStore = useSwarmStore(); const stackStore = useSwarmStore();
const { stacks } = storeToRefs(stackStore); const { stacks } = storeToRefs(stackStore);
const stack = computed(() => stacks.value.find((s) => s.name === name)); const stack = computed(() => stacks.value.find((s) => s.name === route.params.name));
watchEffect(() => { watchEffect(() => {
if (ready.value) { if (ready.value) {

32
assets/typed-router.d.ts vendored Normal file
View File

@@ -0,0 +1,32 @@
/* eslint-disable */
/* prettier-ignore */
// @ts-nocheck
// Generated by unplugin-vue-router. ‼️ DO NOT MODIFY THIS FILE ‼️
// It's recommended to commit this file.
// Make sure to add this file to your tsconfig.json file as an "includes" or "files" entry.
declare module 'vue-router/auto-routes' {
import type {
RouteRecordInfo,
ParamValue,
ParamValueOneOrMore,
ParamValueZeroOrMore,
ParamValueZeroOrOne,
} from 'unplugin-vue-router/types'
/**
* Route name map generated by unplugin-vue-router
*/
export interface RouteNamedMap {
'/': RouteRecordInfo<'/', '/', Record<never, never>, Record<never, never>>,
'/[...all]': RouteRecordInfo<'/[...all]', '/:all(.*)', { all: ParamValue<true> }, { all: ParamValue<false> }>,
'/container/[id]': RouteRecordInfo<'/container/[id]', '/container/:id', { id: ParamValue<true> }, { id: ParamValue<false> }>,
'/group/[name]': RouteRecordInfo<'/group/[name]', '/group/:name', { name: ParamValue<true> }, { name: ParamValue<false> }>,
'/login': RouteRecordInfo<'/login', '/login', Record<never, never>, Record<never, never>>,
'/merged/[name]': RouteRecordInfo<'/merged/[name]', '/merged/:name', { name: ParamValue<true> }, { name: ParamValue<false> }>,
'/service/[name]': RouteRecordInfo<'/service/[name]', '/service/:name', { name: ParamValue<true> }, { name: ParamValue<false> }>,
'/settings': RouteRecordInfo<'/settings', '/settings', Record<never, never>, Record<never, never>>,
'/show': RouteRecordInfo<'/show', '/show', Record<never, never>, Record<never, never>>,
'/stack/[name]': RouteRecordInfo<'/stack/[name]', '/stack/:name', { name: ParamValue<true> }, { name: ParamValue<false> }>,
}
}

View File

@@ -31,6 +31,7 @@
"@iconify-json/carbon": "^1.1.35", "@iconify-json/carbon": "^1.1.35",
"@iconify-json/cil": "^1.1.8", "@iconify-json/cil": "^1.1.8",
"@iconify-json/ic": "^1.1.17", "@iconify-json/ic": "^1.1.17",
"@iconify-json/material-symbols": "^1.1.82",
"@iconify-json/mdi": "^1.1.66", "@iconify-json/mdi": "^1.1.66",
"@iconify-json/mdi-light": "^1.1.10", "@iconify-json/mdi-light": "^1.1.10",
"@iconify-json/octicon": "^1.1.54", "@iconify-json/octicon": "^1.1.54",
@@ -64,16 +65,16 @@
"unplugin-icons": "^0.19.0", "unplugin-icons": "^0.19.0",
"unplugin-vue-components": "^0.27.0", "unplugin-vue-components": "^0.27.0",
"unplugin-vue-macros": "^2.9.5", "unplugin-vue-macros": "^2.9.5",
"unplugin-vue-router": "^0.9.1",
"vite": "5.3.1", "vite": "5.3.1",
"vitepress": "1.2.3",
"vite-plugin-compression2": "^1.1.1", "vite-plugin-compression2": "^1.1.1",
"vite-plugin-pages": "^0.32.2",
"vite-plugin-vue-layouts": "^0.11.0", "vite-plugin-vue-layouts": "^0.11.0",
"vue": "^3.4.29", "vue": "^3.4.29",
"vue-i18n": "^9.13.1", "vue-i18n": "^9.13.1",
"vue-router": "^4.3.3" "vue-router": "^4.3.3"
}, },
"devDependencies": { "devDependencies": {
"@iconify-json/material-symbols": "^1.1.82",
"@pinia/testing": "^0.1.3", "@pinia/testing": "^0.1.3",
"@playwright/test": "^1.44.1", "@playwright/test": "^1.44.1",
"@types/d3-array": "^3.2.1", "@types/d3-array": "^3.2.1",
@@ -98,7 +99,6 @@
"simple-git-hooks": "^2.11.1", "simple-git-hooks": "^2.11.1",
"ts-node": "^10.9.2", "ts-node": "^10.9.2",
"typescript": "^5.4.5", "typescript": "^5.4.5",
"vitepress": "1.2.3",
"vitest": "^1.6.0", "vitest": "^1.6.0",
"vue-component-type-helpers": "^2.0.21", "vue-component-type-helpers": "^2.0.21",
"vue-tsc": "^2.0.21" "vue-tsc": "^2.0.21"

593
pnpm-lock.yaml generated

File diff suppressed because it is too large Load Diff

View File

@@ -8,7 +8,7 @@
"esModuleInterop": true, "esModuleInterop": true,
"incremental": false, "incremental": false,
"skipLibCheck": true, "skipLibCheck": true,
"moduleResolution": "node", "moduleResolution": "Bundler",
"resolveJsonModule": true, "resolveJsonModule": true,
"noUnusedLocals": true, "noUnusedLocals": true,
"strictNullChecks": true, "strictNullChecks": true,
@@ -20,12 +20,11 @@
"types": [ "types": [
"vitest", "vitest",
"vite/client", "vite/client",
"vite-plugin-pages/client",
"vite-plugin-vue-layouts/client", "vite-plugin-vue-layouts/client",
"unplugin-vue-macros/macros-global" "unplugin-vue-macros/macros-global",
"unplugin-vue-router/client"
] ]
}, },
"include": ["assets/**/*.ts", "assets/**/*.d.ts", "assets/**/*.vue"],
"exclude": ["dist", "node_modules"] "exclude": ["dist", "node_modules", "e2e"]
} }

View File

@@ -6,10 +6,11 @@ import Icons from "unplugin-icons/vite";
import Components from "unplugin-vue-components/vite"; import Components from "unplugin-vue-components/vite";
import AutoImport from "unplugin-auto-import/vite"; import AutoImport from "unplugin-auto-import/vite";
import IconsResolver from "unplugin-icons/resolver"; import IconsResolver from "unplugin-icons/resolver";
import Pages from "vite-plugin-pages"; import VueRouter from "unplugin-vue-router/vite";
import Layouts from "vite-plugin-vue-layouts"; import Layouts from "vite-plugin-vue-layouts";
import VueI18nPlugin from "@intlify/unplugin-vue-i18n/vite"; import VueI18nPlugin from "@intlify/unplugin-vue-i18n/vite";
import { compression } from "vite-plugin-compression2"; import { compression } from "vite-plugin-compression2";
import { VueRouterAutoImports } from "unplugin-vue-router";
export default defineConfig(() => ({ export default defineConfig(() => ({
resolve: { resolve: {
@@ -32,13 +33,17 @@ export default defineConfig(() => ({
vue: Vue(), vue: Vue(),
}, },
}), }),
VueRouter({
routesFolder: {
src: "./assets/pages",
},
dts: "./assets/typed-router.d.ts",
importMode: "sync",
}),
Icons({ Icons({
autoInstall: true, autoInstall: true,
}), }),
Pages({
dirs: "assets/pages",
importMode: "sync",
}),
Layouts({ Layouts({
layoutsDirs: "assets/layouts", layoutsDirs: "assets/layouts",
}), }),
@@ -53,7 +58,7 @@ export default defineConfig(() => ({
dts: "assets/components.d.ts", dts: "assets/components.d.ts",
}), }),
AutoImport({ AutoImport({
imports: ["vue", "vue-router", "vue-i18n", "vue/macros", "pinia", "@vueuse/head", "@vueuse/core"], imports: ["vue", VueRouterAutoImports, "vue-i18n", "vue/macros", "pinia", "@vueuse/head", "@vueuse/core"],
dts: "assets/auto-imports.d.ts", dts: "assets/auto-imports.d.ts",
dirs: ["assets/composable", "assets/stores", "assets/utils"], dirs: ["assets/composable", "assets/stores", "assets/utils"],
vueTemplate: true, vueTemplate: true,