From b1e4b55ba1f95ae24e457e50d1a33b7ad4496f0b Mon Sep 17 00:00:00 2001 From: mbecker20 Date: Thu, 4 Jul 2024 14:41:40 -0700 Subject: [PATCH] more responsive --- frontend/package.json | 2 +- frontend/src/components/topbar.tsx | 371 +++----------------------- frontend/src/pages/home/dashboard.tsx | 34 +-- 3 files changed, 61 insertions(+), 346 deletions(-) diff --git a/frontend/package.json b/frontend/package.json index a1f8d870d..22566fcd3 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -4,7 +4,7 @@ "version": "0.0.0", "type": "module", "scripts": { - "dev": "vite", + "dev": "vite --host", "build": "tsc && vite build", "lint": "eslint . --ext ts,tsx --report-unused-disable-directives --max-warnings 0", "preview": "vite preview", diff --git a/frontend/src/components/topbar.tsx b/frontend/src/components/topbar.tsx index 63a2ec324..10e630639 100644 --- a/frontend/src/components/topbar.tsx +++ b/frontend/src/components/topbar.tsx @@ -7,9 +7,7 @@ import { Boxes, FileQuestion, FolderTree, - Home, Keyboard, - SearchX, Settings, User, Users, @@ -23,32 +21,16 @@ import { DropdownMenuTrigger, } from "@ui/dropdown-menu"; import { Button } from "@ui/button"; -import { Link, useNavigate, useParams } from "react-router-dom"; -import { - RESOURCE_TARGETS, - filterBySplit, - usableResourcePath, -} from "@lib/utils"; +import { Link } from "react-router-dom"; +import { RESOURCE_TARGETS, usableResourcePath } from "@lib/utils"; import { OmniSearch, OmniDialog } from "./omnibar"; import { WsStatusIndicator } from "@lib/socket"; import { TopbarUpdates } from "./updates/topbar"; -import { Logout, UserAvatar } from "./util"; +import { Logout } from "./util"; import { ThemeToggle } from "@ui/theme"; -import { UsableResource } from "@types"; import { useAtom } from "jotai"; -import { Popover, PopoverContent, PopoverTrigger } from "@ui/popover"; import { ReactNode, useState } from "react"; -import { - Command, - CommandEmpty, - CommandGroup, - CommandInput, - CommandItem, - CommandList, -} from "@ui/command"; -import { ResourceLink } from "./resources/common"; import { HomeView, homeViewAtom } from "@main"; -import { Types } from "@monitor/client"; import { Dialog, DialogContent, @@ -65,26 +47,18 @@ export const Topbar = () => { return (
-
+
- {/* */} - MONITOR +
MONITOR
-
- - -
+
{ ); }; -const PrimaryDropdown = () => { +const MobileDropdown = () => { const type = useResourceParamType(); const Components = type && ResourceComponents[type]; + const [view, setView] = useAtom(homeViewAtom); const [icon, title] = Components ? [ @@ -126,8 +101,12 @@ const PrimaryDropdown = () => { ? "Sync" : type) + "s", ] - : location.pathname === "/" - ? [, "Home"] + : location.pathname === "/" && view === "Dashboard" + ? [, "Dashboard"] + : location.pathname === "/" && view === "Resources" + ? [, "Resources"] + : location.pathname === "/" && view === "Tree" + ? [, "Tree"] : location.pathname === "/settings" ? [, "Settings"] : location.pathname === "/alerts" @@ -139,7 +118,6 @@ const PrimaryDropdown = () => { : location.pathname.split("/")[1] === "users" ? [, "Users"] : [, "Unknown"]; - // : [, "Dashboard"]; return ( @@ -155,16 +133,34 @@ const PrimaryDropdown = () => { } + label="Dashboard" + icon={} to="/" + onClick={() => setView("Dashboard")} + /> + } + to="/" + onClick={() => setView("Resources")} + /> + } + to="/" + onClick={() => setView("Tree")} /> {RESOURCE_TARGETS.map((type) => { const RTIcon = ResourceComponents[type].Icon; - const name = type === "ServerTemplate" ? "Template" : type; + const name = + type === "ServerTemplate" + ? "Template" + : type === "ResourceSync" + ? "Sync" + : type; return ( void; }) => { return ( - + {icon} {label} @@ -221,296 +219,11 @@ const DropdownLinkItem = ({ ); }; -const ICONS = { - Dashboard: () => , - Resources: () => , - Tree: () => , -}; - -const SecondaryDropdown = () => { - const [view, setView] = useAtom(homeViewAtom); - - const type = useResourceParamType(); - if (type) return ; - - if (location.pathname === "/") { - const Icon = ICONS[view]; - - return ( - - - - - - - {Object.entries(ICONS).map(([view, Icon]) => ( - setView(view as HomeView)} - > - - {view} - - ))} - - - - ); - } - - const [_, base, id] = location.pathname.split("/"); - - if (base === "users") { - return ; - } else if (base === "user-groups") { - return ; - } -}; - -const ResourcesDropdown = ({ type }: { type: UsableResource }) => { - const nav = useNavigate(); - const id = useParams().id as string; - const list = useRead(`List${type}s`, {}).data ?? []; - - const [open, setOpen] = useState(false); - const [search, setSearch] = useState(""); - - const selected = list?.find((i) => i.id === id); - const Components = ResourceComponents[type]; - - const filtered = filterBySplit( - list as Types.ResourceListItem[], - search, - (item) => item.name - ); - - return ( - - - - - - - - - - {`No ${type}s Found`} - - - - - { - setOpen(false); - nav(`/${usableResourcePath(type)}`); - }} - > - - - {filtered?.map((resource) => ( - { - setOpen(false); - nav(`/${usableResourcePath(type)}/${resource.id}`); - }} - > - - - ))} - - - - - - ); -}; - -const UserGroupDropdown = ({ group_id }: { group_id: string | undefined }) => { - const nav = useNavigate(); - const [open, setOpen] = useState(false); - const [search, setSearch] = useState(""); - - const groups = useRead("ListUserGroups", {}).data ?? []; - - const selected = group_id - ? groups?.find((user) => user._id?.$oid === group_id) - : undefined; - - const filtered = filterBySplit( - groups as Types.UserGroup[], - search, - (item) => item.name - ); - - return ( - - - - - - - - - - No User Groups Found - - - - - { - setOpen(false); - nav(`/users`); - }} - > - - - {filtered?.map((group) => ( - { - setOpen(false); - nav(`/user-groups/${group._id?.$oid}`); - }} - > - - - ))} - - - - - - ); -}; - -const UsersDropdown = ({ user_id }: { user_id: string | undefined }) => { - const nav = useNavigate(); - const [open, setOpen] = useState(false); - const [search, setSearch] = useState(""); - - const users = useRead("ListUsers", {}).data ?? []; - - const selected = user_id - ? users?.find((user) => user._id?.$oid === user_id) - : undefined; - const avatar = (selected?.config.data as { avatar?: string })?.avatar; - - const filtered = filterBySplit( - users as Types.User[], - search, - (item) => item.username - ); - - return ( - - - - - - - - - - No Users Found - - - - - { - setOpen(false); - nav(`/users`); - }} - > - - - {filtered?.map((user) => ( - { - setOpen(false); - nav(`/users/${user._id?.$oid}`); - }} - > - - - ))} - - - - - - ); -}; - const KeyboardShortcuts = () => { return ( - diff --git a/frontend/src/pages/home/dashboard.tsx b/frontend/src/pages/home/dashboard.tsx index e275b906d..24f444238 100644 --- a/frontend/src/pages/home/dashboard.tsx +++ b/frontend/src/pages/home/dashboard.tsx @@ -48,23 +48,25 @@ const ResourceRow = ({ type }: { type: UsableResource }) => { return (
-
- -
-
-
- -

Recent {type}s

+
+
+
-
- {ids.map((id, i) => ( - 3 && "hidden 2xl:block"} - /> - ))} +
+
+ +

Recent {type}s

+
+
+ {ids.map((id, i) => ( + 3 && "hidden 2xl:block"} + /> + ))} +