mirror of
https://github.com/Laupetin/OpenAssetTools.git
synced 2025-11-18 03:02:07 +00:00
chore: show game and platform tags in modman header
This commit is contained in:
@@ -1,5 +1,5 @@
|
|||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import ModManHeader from "./components/ModManHeader.vue";
|
import ModManHeader from "./components/header/ModManHeader.vue";
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
|
|||||||
@@ -1,11 +1,12 @@
|
|||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import Button from "primevue/button";
|
import Button from "primevue/button";
|
||||||
import { useRouter } from "vue-router";
|
import { useRoute, useRouter } from "vue-router";
|
||||||
import IconArrowLeft from "./icons/IconArrowLeft.vue";
|
import IconArrowLeft from "../icons/IconArrowLeft.vue";
|
||||||
import IconGear from "./icons/IconGear.vue";
|
import IconGear from "../icons/IconGear.vue";
|
||||||
import { useRouteMeta } from "@/router/RouteMeta";
|
import { useRouteMeta } from "@/router/RouteMeta.ts";
|
||||||
|
|
||||||
const { routeDisplayName, routeNavigateBackTo } = useRouteMeta();
|
const route = useRoute();
|
||||||
|
const { headerTitle, routeNavigateBackTo } = useRouteMeta();
|
||||||
const router = useRouter();
|
const router = useRouter();
|
||||||
|
|
||||||
function onClickBack() {
|
function onClickBack() {
|
||||||
@@ -30,7 +31,10 @@ function onClickBack() {
|
|||||||
</template>
|
</template>
|
||||||
</Button>
|
</Button>
|
||||||
</div>
|
</div>
|
||||||
<h1 class="title">{{ routeDisplayName }}</h1>
|
<h1 class="title">
|
||||||
|
<span v-if="typeof headerTitle === 'string'">{{ headerTitle }}</span>
|
||||||
|
<component v-else :is="headerTitle" v-bind="route.params" />
|
||||||
|
</h1>
|
||||||
<div class="header-section right">
|
<div class="header-section right">
|
||||||
<Button variant="text" severity="secondary" aria-label="Settings">
|
<Button variant="text" severity="secondary" aria-label="Settings">
|
||||||
<template #icon>
|
<template #icon>
|
||||||
@@ -1,9 +1,11 @@
|
|||||||
import { computed } from "vue";
|
import { type Component, computed } from "vue";
|
||||||
import { useRoute, type RouteLocationNormalizedGeneric } from "vue-router";
|
import { useRoute, type RouteLocationNormalizedGeneric } from "vue-router";
|
||||||
|
|
||||||
|
type HeaderTitleFunc = (route: RouteLocationNormalizedGeneric) => string;
|
||||||
export interface TypedRouteMeta {
|
export interface TypedRouteMeta {
|
||||||
backTo?: string;
|
backTo?: string;
|
||||||
nameFunc?(route: RouteLocationNormalizedGeneric): string;
|
headerTitleFunc?: HeaderTitleFunc;
|
||||||
|
headerTitleComponent?: Component;
|
||||||
}
|
}
|
||||||
|
|
||||||
export type RouteMeta = TypedRouteMeta & Record<string, unknown>;
|
export type RouteMeta = TypedRouteMeta & Record<string, unknown>;
|
||||||
@@ -12,13 +14,17 @@ export function useRouteMeta() {
|
|||||||
const route = useRoute();
|
const route = useRoute();
|
||||||
const meta = computed<RouteMeta>(() => route.meta as RouteMeta);
|
const meta = computed<RouteMeta>(() => route.meta as RouteMeta);
|
||||||
|
|
||||||
const routeDisplayName = computed<string>(() => {
|
const headerTitle = computed<string | Component>(() => {
|
||||||
if (meta.value.nameFunc) return meta.value.nameFunc(route);
|
if (meta.value.headerTitleFunc) {
|
||||||
|
return meta.value.headerTitleFunc(route);
|
||||||
|
} else if (meta.value.headerTitleComponent) {
|
||||||
|
return meta.value.headerTitleComponent;
|
||||||
|
}
|
||||||
|
|
||||||
return String(route.name);
|
return String(route.name);
|
||||||
});
|
});
|
||||||
|
|
||||||
const routeNavigateBackTo = computed<string | null>(() => meta.value.backTo ?? null);
|
const routeNavigateBackTo = computed<string | null>(() => meta.value.backTo ?? null);
|
||||||
|
|
||||||
return { routeDisplayName, routeNavigateBackTo };
|
return { headerTitle, routeNavigateBackTo };
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ import { PAGE } from "./Page";
|
|||||||
import ZoneInspector from "@/view/inspect/ZoneInspector.vue";
|
import ZoneInspector from "@/view/inspect/ZoneInspector.vue";
|
||||||
import InspectDetails from "@/view/inspect_details/InspectDetails.vue";
|
import InspectDetails from "@/view/inspect_details/InspectDetails.vue";
|
||||||
import type { RouteMeta } from "./RouteMeta";
|
import type { RouteMeta } from "./RouteMeta";
|
||||||
|
import InspectDetailsHeader from "@/view/inspect_details/InspectDetailsHeader.vue";
|
||||||
|
|
||||||
const ROUTES: RouteRecordRaw[] = [
|
const ROUTES: RouteRecordRaw[] = [
|
||||||
{
|
{
|
||||||
@@ -19,7 +20,7 @@ const ROUTES: RouteRecordRaw[] = [
|
|||||||
component: InspectDetails,
|
component: InspectDetails,
|
||||||
meta: {
|
meta: {
|
||||||
backTo: PAGE.INSPECT.SELECT_ZONE,
|
backTo: PAGE.INSPECT.SELECT_ZONE,
|
||||||
nameFunc: (route) => `Zone details: ${route.params["zoneName"]}`,
|
headerTitleComponent: InspectDetailsHeader,
|
||||||
} satisfies RouteMeta,
|
} satisfies RouteMeta,
|
||||||
props: true,
|
props: true,
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -39,6 +39,10 @@ export const useZoneStore = defineStore("zone", () => {
|
|||||||
return lastPercentageByZoneName.value[zoneName] ?? 100;
|
return lastPercentageByZoneName.value[zoneName] ?? 100;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function getLoadedZoneByName(zoneName: string) {
|
||||||
|
return loadedZones.value.find((zone) => zone.name === zoneName) ?? null;
|
||||||
|
}
|
||||||
|
|
||||||
// Initially get all loaded zones
|
// Initially get all loaded zones
|
||||||
webviewBinds.getZones().then((allZones) => {
|
webviewBinds.getZones().then((allZones) => {
|
||||||
loadedZones.value = allZones;
|
loadedZones.value = allZones;
|
||||||
@@ -68,5 +72,6 @@ export const useZoneStore = defineStore("zone", () => {
|
|||||||
lastPercentageByZoneName,
|
lastPercentageByZoneName,
|
||||||
loadFastFile,
|
loadFastFile,
|
||||||
getPercentageForZoneBeingLoaded,
|
getPercentageForZoneBeingLoaded,
|
||||||
|
getLoadedZoneByName,
|
||||||
};
|
};
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -75,8 +75,8 @@ const meterItems = computed<MeterItem[]>(() => {
|
|||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
const selectedZoneDetails = computed<ZoneDto | null>(
|
const selectedZoneDetails = computed<ZoneDto | null>(() =>
|
||||||
() => zoneStore.loadedZones.find((zone) => zone.name === props.selectedZone) ?? null,
|
props.selectedZone ? zoneStore.getLoadedZoneByName(props.selectedZone) : null,
|
||||||
);
|
);
|
||||||
|
|
||||||
const router = useRouter();
|
const router = useRouter();
|
||||||
|
|||||||
@@ -0,0 +1,31 @@
|
|||||||
|
<script setup lang="ts">
|
||||||
|
import { computed } from "vue";
|
||||||
|
import type { ZoneDto } from "@/native/ZoneBinds.ts";
|
||||||
|
import { useZoneStore } from "@/stores/ZoneStore.ts";
|
||||||
|
import Tag from "primevue/tag";
|
||||||
|
|
||||||
|
const zoneStore = useZoneStore();
|
||||||
|
const props = defineProps<{
|
||||||
|
zoneName: string;
|
||||||
|
}>();
|
||||||
|
|
||||||
|
const zoneDetails = computed<ZoneDto | null>(() =>
|
||||||
|
props.zoneName ? zoneStore.getLoadedZoneByName(props.zoneName) : null,
|
||||||
|
);
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<template>
|
||||||
|
<span>
|
||||||
|
<span>Inspect zone: {{ zoneName }}</span>
|
||||||
|
<template v-if="zoneDetails">
|
||||||
|
<Tag class="zone-header-tag" :value="zoneDetails.game" severity="secondary" />
|
||||||
|
<Tag class="zone-header-tag" :value="zoneDetails.platform" severity="secondary" />
|
||||||
|
</template>
|
||||||
|
</span>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<style scoped lang="scss">
|
||||||
|
.zone-header-tag {
|
||||||
|
margin-left: 0.5em;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
Reference in New Issue
Block a user