Restructure UX and seed a fully simulated organisation
Rework the dashboard, environment topology view, header navigation, and status rendering, and standardise selects on a shadcn-vue component. Replace the thin database seeder with a SimulatedEnvironmentSeeder that builds a fully wired, mostly-running organisation (ACTIVE server fleet, managed + GHCR registries, Gitea source provider, ClipBin app with production/staging environments, services, slices, endpoints, managed variables, build artifacts, and a completed/in-progress/failed operations history) so the new UI renders against realistic data.
This commit is contained in:
@@ -5,17 +5,20 @@ import ServiceStatus from "@/enums/ServiceStatus";
|
||||
import ServiceType from "@/enums/ServiceType";
|
||||
import { DoorOpenIcon } from "lucide-vue-next";
|
||||
|
||||
withDefaults(defineProps<{
|
||||
icon?: object | Function;
|
||||
serviceType?: string;
|
||||
serviceCategory?: string;
|
||||
status?: string;
|
||||
}>(), {
|
||||
icon: () => DoorOpenIcon,
|
||||
serviceType: ServiceType.GATEWAY,
|
||||
serviceCategory: ServiceCategory.DATABASE,
|
||||
status: ServiceStatus.UNKNOWN,
|
||||
});
|
||||
withDefaults(
|
||||
defineProps<{
|
||||
icon?: object | Function;
|
||||
serviceType?: string;
|
||||
serviceCategory?: string;
|
||||
status?: string;
|
||||
}>(),
|
||||
{
|
||||
icon: () => DoorOpenIcon,
|
||||
serviceType: ServiceType.GATEWAY,
|
||||
serviceCategory: ServiceCategory.DATABASE,
|
||||
status: ServiceStatus.UNKNOWN,
|
||||
},
|
||||
);
|
||||
</script>
|
||||
<template>
|
||||
<Card
|
||||
|
||||
19
resources/js/components/environments/SpecRow.vue
Normal file
19
resources/js/components/environments/SpecRow.vue
Normal file
@@ -0,0 +1,19 @@
|
||||
<script setup lang="ts">
|
||||
defineProps<{
|
||||
icon?: object | Function;
|
||||
label: string;
|
||||
value?: string | number | null;
|
||||
}>();
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<div class="flex items-center justify-between gap-3 text-sm">
|
||||
<span class="flex items-center gap-2 text-muted-foreground">
|
||||
<component :is="icon" v-if="icon" class="size-4 opacity-70" />
|
||||
{{ label }}
|
||||
</span>
|
||||
<span class="truncate text-right font-medium">
|
||||
<slot>{{ value ?? "—" }}</slot>
|
||||
</span>
|
||||
</div>
|
||||
</template>
|
||||
29
resources/js/components/environments/TopologyCard.vue
Normal file
29
resources/js/components/environments/TopologyCard.vue
Normal file
@@ -0,0 +1,29 @@
|
||||
<script setup lang="ts">
|
||||
import StatusIndicator from "@/components/StatusIndicator.vue";
|
||||
import { Card } from "@/components/ui/card";
|
||||
|
||||
defineProps<{
|
||||
title: string;
|
||||
subtitle?: string | null;
|
||||
icon?: object | Function;
|
||||
status?: string | null;
|
||||
}>();
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<Card class="overflow-hidden">
|
||||
<div class="flex items-center justify-between gap-3 border-b bg-muted/30 px-4 py-3">
|
||||
<div class="flex min-w-0 items-center gap-2">
|
||||
<component :is="icon" v-if="icon" class="size-4 shrink-0 opacity-70" />
|
||||
<span class="truncate font-semibold">{{ title }}</span>
|
||||
<span v-if="subtitle" class="truncate text-xs text-muted-foreground">{{
|
||||
subtitle
|
||||
}}</span>
|
||||
</div>
|
||||
<StatusIndicator v-if="status" :status="status" />
|
||||
</div>
|
||||
<div class="grid gap-2.5 p-4">
|
||||
<slot />
|
||||
</div>
|
||||
</Card>
|
||||
</template>
|
||||
Reference in New Issue
Block a user