From 237907de41e8eba8ecdb7620f5651debf2ae2885 Mon Sep 17 00:00:00 2001 From: Andras Bacsai Date: Thu, 13 Feb 2025 15:09:55 +0100 Subject: [PATCH] feat(ui): add hover card for project environments in dashboard --- app/Http/Controllers/InertiaController.php | 18 ++++- resources/js/Pages/Dashboard.vue | 10 ++- resources/js/components/ResourceBox.vue | 68 +++++++++++++++---- .../js/components/ui/hover-card/HoverCard.vue | 14 ++++ .../ui/hover-card/HoverCardContent.vue | 37 ++++++++++ .../ui/hover-card/HoverCardTrigger.vue | 11 +++ .../js/components/ui/hover-card/index.ts | 3 + .../js/components/ui/menubar/Menubar.vue | 35 ++++++++++ .../ui/menubar/MenubarCheckboxItem.vue | 40 +++++++++++ .../components/ui/menubar/MenubarContent.vue | 43 ++++++++++++ .../js/components/ui/menubar/MenubarGroup.vue | 11 +++ .../js/components/ui/menubar/MenubarItem.vue | 35 ++++++++++ .../js/components/ui/menubar/MenubarLabel.vue | 13 ++++ .../js/components/ui/menubar/MenubarMenu.vue | 11 +++ .../ui/menubar/MenubarRadioGroup.vue | 20 ++++++ .../ui/menubar/MenubarRadioItem.vue | 40 +++++++++++ .../ui/menubar/MenubarSeparator.vue | 19 ++++++ .../components/ui/menubar/MenubarShortcut.vue | 14 ++++ .../js/components/ui/menubar/MenubarSub.vue | 19 ++++++ .../ui/menubar/MenubarSubContent.vue | 39 +++++++++++ .../ui/menubar/MenubarSubTrigger.vue | 30 ++++++++ .../components/ui/menubar/MenubarTrigger.vue | 29 ++++++++ resources/js/components/ui/menubar/index.ts | 15 ++++ resources/js/types/ProjectType.ts | 3 + 24 files changed, 556 insertions(+), 21 deletions(-) create mode 100644 resources/js/components/ui/hover-card/HoverCard.vue create mode 100644 resources/js/components/ui/hover-card/HoverCardContent.vue create mode 100644 resources/js/components/ui/hover-card/HoverCardTrigger.vue create mode 100644 resources/js/components/ui/hover-card/index.ts create mode 100644 resources/js/components/ui/menubar/Menubar.vue create mode 100644 resources/js/components/ui/menubar/MenubarCheckboxItem.vue create mode 100644 resources/js/components/ui/menubar/MenubarContent.vue create mode 100644 resources/js/components/ui/menubar/MenubarGroup.vue create mode 100644 resources/js/components/ui/menubar/MenubarItem.vue create mode 100644 resources/js/components/ui/menubar/MenubarLabel.vue create mode 100644 resources/js/components/ui/menubar/MenubarMenu.vue create mode 100644 resources/js/components/ui/menubar/MenubarRadioGroup.vue create mode 100644 resources/js/components/ui/menubar/MenubarRadioItem.vue create mode 100644 resources/js/components/ui/menubar/MenubarSeparator.vue create mode 100644 resources/js/components/ui/menubar/MenubarShortcut.vue create mode 100644 resources/js/components/ui/menubar/MenubarSub.vue create mode 100644 resources/js/components/ui/menubar/MenubarSubContent.vue create mode 100644 resources/js/components/ui/menubar/MenubarSubTrigger.vue create mode 100644 resources/js/components/ui/menubar/MenubarTrigger.vue create mode 100644 resources/js/components/ui/menubar/index.ts diff --git a/app/Http/Controllers/InertiaController.php b/app/Http/Controllers/InertiaController.php index 2f5d2cbf8b..95997f731e 100644 --- a/app/Http/Controllers/InertiaController.php +++ b/app/Http/Controllers/InertiaController.php @@ -11,7 +11,20 @@ class InertiaController extends Controller public function dashboard() { $servers = Server::isUsable()->get(); - + $projects = Project::ownedByCurrentTeam()->orderBy('created_at')->with('environments')->get(); + $projects = $projects->map(function ($project) { + return [ + 'name' => $project->name, + 'description' => $project->description, + 'uuid' => $project->uuid, + 'environments' => $project->environments()->get()->map(function ($environment) { + return [ + 'name' => $environment->name, + 'uuid' => $environment->uuid, + ]; + }), + ]; + }); $destinations = collect($servers)->flatMap(function ($server) { return $server->destinations(); }); @@ -30,9 +43,8 @@ public function dashboard() 'uuid' => $server->uuid, ]; }); - return Inertia::render('Dashboard', [ - 'projects' => Project::ownedByCurrentTeam()->orderBy('created_at')->get(['name', 'description', 'uuid']), + 'projects' => $projects, // Should not add proxy 'servers' => $servers, 'sources' => currentTeam()->sources(), diff --git a/resources/js/Pages/Dashboard.vue b/resources/js/Pages/Dashboard.vue index 3c3daaf293..22a8543e5f 100644 --- a/resources/js/Pages/Dashboard.vue +++ b/resources/js/Pages/Dashboard.vue @@ -6,7 +6,11 @@ import { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs' import ResourceBox from '@/components/ResourceBox.vue' import { ScrollArea, ScrollBar } from '@/components/ui/scroll-area' import MainView from '@/components/MainView.vue' - +import { + HoverCard, + HoverCardContent, + HoverCardTrigger, +} from '@/components/ui/hover-card' import type { User } from '@/types/UserType' import type { Project } from '@/types/ProjectType' @@ -111,7 +115,7 @@ const breadcrumb = ref([
+ :description="project.description" :environments="project.environments" />
([
+ :description="project.description" :environments="project.environments" />
diff --git a/resources/js/components/ResourceBox.vue b/resources/js/components/ResourceBox.vue index de8190a166..7e9002d2ed 100644 --- a/resources/js/components/ResourceBox.vue +++ b/resources/js/components/ResourceBox.vue @@ -2,6 +2,8 @@ import { Link } from '@inertiajs/vue3' import { Server, GitBranch, Map, BriefcaseBusiness, Plus, Earth } from 'lucide-vue-next' import { computed } from 'vue'; +import { HoverCard, HoverCardContent, HoverCardTrigger } from '@/components/ui/hover-card' +import { Environment } from '@/types/EnvironmentType'; const props = defineProps<{ type: 'project' | 'server' | 'source' | 'destination' | 'environment'; @@ -9,9 +11,12 @@ const props = defineProps<{ name: string; description?: string; new?: boolean; + environments?: Environment[]; }>(); const isNew = computed(() => props.new) +const environments = computed(() => props.environments) +console.log(environments.value) diff --git a/resources/js/components/ui/hover-card/HoverCard.vue b/resources/js/components/ui/hover-card/HoverCard.vue new file mode 100644 index 0000000000..f17c9d1ffa --- /dev/null +++ b/resources/js/components/ui/hover-card/HoverCard.vue @@ -0,0 +1,14 @@ + + + diff --git a/resources/js/components/ui/hover-card/HoverCardContent.vue b/resources/js/components/ui/hover-card/HoverCardContent.vue new file mode 100644 index 0000000000..521c54b16a --- /dev/null +++ b/resources/js/components/ui/hover-card/HoverCardContent.vue @@ -0,0 +1,37 @@ + + + diff --git a/resources/js/components/ui/hover-card/HoverCardTrigger.vue b/resources/js/components/ui/hover-card/HoverCardTrigger.vue new file mode 100644 index 0000000000..3e300b95b8 --- /dev/null +++ b/resources/js/components/ui/hover-card/HoverCardTrigger.vue @@ -0,0 +1,11 @@ + + + diff --git a/resources/js/components/ui/hover-card/index.ts b/resources/js/components/ui/hover-card/index.ts new file mode 100644 index 0000000000..9e4ccc2aa4 --- /dev/null +++ b/resources/js/components/ui/hover-card/index.ts @@ -0,0 +1,3 @@ +export { default as HoverCard } from './HoverCard.vue' +export { default as HoverCardContent } from './HoverCardContent.vue' +export { default as HoverCardTrigger } from './HoverCardTrigger.vue' diff --git a/resources/js/components/ui/menubar/Menubar.vue b/resources/js/components/ui/menubar/Menubar.vue new file mode 100644 index 0000000000..525c587237 --- /dev/null +++ b/resources/js/components/ui/menubar/Menubar.vue @@ -0,0 +1,35 @@ + + + diff --git a/resources/js/components/ui/menubar/MenubarCheckboxItem.vue b/resources/js/components/ui/menubar/MenubarCheckboxItem.vue new file mode 100644 index 0000000000..c15733c466 --- /dev/null +++ b/resources/js/components/ui/menubar/MenubarCheckboxItem.vue @@ -0,0 +1,40 @@ + + + diff --git a/resources/js/components/ui/menubar/MenubarContent.vue b/resources/js/components/ui/menubar/MenubarContent.vue new file mode 100644 index 0000000000..fc25e7b2ca --- /dev/null +++ b/resources/js/components/ui/menubar/MenubarContent.vue @@ -0,0 +1,43 @@ + + + diff --git a/resources/js/components/ui/menubar/MenubarGroup.vue b/resources/js/components/ui/menubar/MenubarGroup.vue new file mode 100644 index 0000000000..853976b5e8 --- /dev/null +++ b/resources/js/components/ui/menubar/MenubarGroup.vue @@ -0,0 +1,11 @@ + + + diff --git a/resources/js/components/ui/menubar/MenubarItem.vue b/resources/js/components/ui/menubar/MenubarItem.vue new file mode 100644 index 0000000000..846ed7d3a8 --- /dev/null +++ b/resources/js/components/ui/menubar/MenubarItem.vue @@ -0,0 +1,35 @@ + + + diff --git a/resources/js/components/ui/menubar/MenubarLabel.vue b/resources/js/components/ui/menubar/MenubarLabel.vue new file mode 100644 index 0000000000..574ce49694 --- /dev/null +++ b/resources/js/components/ui/menubar/MenubarLabel.vue @@ -0,0 +1,13 @@ + + + diff --git a/resources/js/components/ui/menubar/MenubarMenu.vue b/resources/js/components/ui/menubar/MenubarMenu.vue new file mode 100644 index 0000000000..fec5ee5573 --- /dev/null +++ b/resources/js/components/ui/menubar/MenubarMenu.vue @@ -0,0 +1,11 @@ + + + diff --git a/resources/js/components/ui/menubar/MenubarRadioGroup.vue b/resources/js/components/ui/menubar/MenubarRadioGroup.vue new file mode 100644 index 0000000000..60a8cd1d9e --- /dev/null +++ b/resources/js/components/ui/menubar/MenubarRadioGroup.vue @@ -0,0 +1,20 @@ + + + diff --git a/resources/js/components/ui/menubar/MenubarRadioItem.vue b/resources/js/components/ui/menubar/MenubarRadioItem.vue new file mode 100644 index 0000000000..66672191fa --- /dev/null +++ b/resources/js/components/ui/menubar/MenubarRadioItem.vue @@ -0,0 +1,40 @@ + + + diff --git a/resources/js/components/ui/menubar/MenubarSeparator.vue b/resources/js/components/ui/menubar/MenubarSeparator.vue new file mode 100644 index 0000000000..8eceb683c7 --- /dev/null +++ b/resources/js/components/ui/menubar/MenubarSeparator.vue @@ -0,0 +1,19 @@ + + + diff --git a/resources/js/components/ui/menubar/MenubarShortcut.vue b/resources/js/components/ui/menubar/MenubarShortcut.vue new file mode 100644 index 0000000000..2968a91cb9 --- /dev/null +++ b/resources/js/components/ui/menubar/MenubarShortcut.vue @@ -0,0 +1,14 @@ + + + diff --git a/resources/js/components/ui/menubar/MenubarSub.vue b/resources/js/components/ui/menubar/MenubarSub.vue new file mode 100644 index 0000000000..6b76cd3e24 --- /dev/null +++ b/resources/js/components/ui/menubar/MenubarSub.vue @@ -0,0 +1,19 @@ + + + diff --git a/resources/js/components/ui/menubar/MenubarSubContent.vue b/resources/js/components/ui/menubar/MenubarSubContent.vue new file mode 100644 index 0000000000..b9a40ce412 --- /dev/null +++ b/resources/js/components/ui/menubar/MenubarSubContent.vue @@ -0,0 +1,39 @@ + + + diff --git a/resources/js/components/ui/menubar/MenubarSubTrigger.vue b/resources/js/components/ui/menubar/MenubarSubTrigger.vue new file mode 100644 index 0000000000..ae3b2a2f29 --- /dev/null +++ b/resources/js/components/ui/menubar/MenubarSubTrigger.vue @@ -0,0 +1,30 @@ + + + diff --git a/resources/js/components/ui/menubar/MenubarTrigger.vue b/resources/js/components/ui/menubar/MenubarTrigger.vue new file mode 100644 index 0000000000..c05050f8bc --- /dev/null +++ b/resources/js/components/ui/menubar/MenubarTrigger.vue @@ -0,0 +1,29 @@ + + + diff --git a/resources/js/components/ui/menubar/index.ts b/resources/js/components/ui/menubar/index.ts new file mode 100644 index 0000000000..600c23ea83 --- /dev/null +++ b/resources/js/components/ui/menubar/index.ts @@ -0,0 +1,15 @@ +export { default as Menubar } from './Menubar.vue' +export { default as MenubarCheckboxItem } from './MenubarCheckboxItem.vue' +export { default as MenubarContent } from './MenubarContent.vue' +export { default as MenubarGroup } from './MenubarGroup.vue' +export { default as MenubarItem } from './MenubarItem.vue' +export { default as MenubarLabel } from './MenubarLabel.vue' +export { default as MenubarMenu } from './MenubarMenu.vue' +export { default as MenubarRadioGroup } from './MenubarRadioGroup.vue' +export { default as MenubarRadioItem } from './MenubarRadioItem.vue' +export { default as MenubarSeparator } from './MenubarSeparator.vue' +export { default as MenubarShortcut } from './MenubarShortcut.vue' +export { default as MenubarSub } from './MenubarSub.vue' +export { default as MenubarSubContent } from './MenubarSubContent.vue' +export { default as MenubarSubTrigger } from './MenubarSubTrigger.vue' +export { default as MenubarTrigger } from './MenubarTrigger.vue' diff --git a/resources/js/types/ProjectType.ts b/resources/js/types/ProjectType.ts index d3ac6b60b3..be68979fa5 100644 --- a/resources/js/types/ProjectType.ts +++ b/resources/js/types/ProjectType.ts @@ -1,3 +1,5 @@ +import { Environment } from "./EnvironmentType"; + export interface Project { id: number; uuid: string; @@ -6,5 +8,6 @@ export interface Project { team_id: number; created_at: string; updated_at: string; + environments: Environment[]; }