diff --git a/src/app/dashboard/lenses/actions/lens.action.tsx b/src/actions/lens.action.tsx similarity index 100% rename from src/app/dashboard/lenses/actions/lens.action.tsx rename to src/actions/lens.action.tsx diff --git a/src/app/dashboard/lenses/actions/lens.schema.tsx b/src/actions/lens.schema.tsx similarity index 100% rename from src/app/dashboard/lenses/actions/lens.schema.tsx rename to src/actions/lens.schema.tsx diff --git a/src/app/dashboard/profiles/actions/profile.action.tsx b/src/actions/profile.action.tsx similarity index 100% rename from src/app/dashboard/profiles/actions/profile.action.tsx rename to src/actions/profile.action.tsx diff --git a/src/app/dashboard/profiles/actions/profile.schema.tsx b/src/actions/profile.schema.tsx similarity index 100% rename from src/app/dashboard/profiles/actions/profile.schema.tsx rename to src/actions/profile.schema.tsx diff --git a/src/app/dashboard/lenses/[id]/page.tsx b/src/app/dashboard/lenses/[id]/page.tsx index 1a7af720..8a8ca46f 100644 --- a/src/app/dashboard/lenses/[id]/page.tsx +++ b/src/app/dashboard/lenses/[id]/page.tsx @@ -18,8 +18,8 @@ import { import { Separator } from '@/components/ui/separator' import { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs' import DateFormat from '@/components/date-format' -import { ActionsDropdown } from './components/actions-dropdown' -import { PublishButton } from './components/publish-button' +import { ActionsDropdown } from '@/components/lenses/actions-dropdown' +import { PublishButton } from '@/components/lenses/publish-button' export type PageProps = { params: { id: string } @@ -31,10 +31,7 @@ export default async function Page({ params }: PageProps) { return ( <> - - {lens?.name} - {lens?.description} - + {lens?.name} {lens?.isDraft && } diff --git a/src/app/dashboard/lenses/new/page.tsx b/src/app/dashboard/lenses/new/page.tsx index f08bdc7d..246717f2 100644 --- a/src/app/dashboard/lenses/new/page.tsx +++ b/src/app/dashboard/lenses/new/page.tsx @@ -1,6 +1,6 @@ import { SubNav, SubNavTitle, SubNavSubtitle } from '@/components/sub-nav' import { Section } from '@/components/section' -import { NewSolutionForm } from './components/new-form' +import { NewSolutionForm } from '@/components/lenses/new-form' export default function Page() { return ( @@ -8,7 +8,9 @@ export default function Page() { New Lens - Lenses help to evalute workloads. + + Measure workloads against best practices. +
diff --git a/src/app/dashboard/lenses/page.tsx b/src/app/dashboard/lenses/page.tsx index 940b1620..42f22a21 100644 --- a/src/app/dashboard/lenses/page.tsx +++ b/src/app/dashboard/lenses/page.tsx @@ -1,4 +1,4 @@ -import { AddLensButton } from './components/add-button' +import { AddLensButton } from '@/components/lenses/add-button' import { SubNav, SubNavTitle, @@ -6,7 +6,7 @@ import { SubNavSubtitle } from '@/components/sub-nav' import { Main } from '@/components/main' -import { LensesDataTable } from './components/data-table' +import { LensesDataTable } from '@/components/lenses/data-table' export default function Lenses() { return ( @@ -14,7 +14,9 @@ export default function Lenses() { Lenses - Review specifications for workloads + + Measure any architecture against best practices. + diff --git a/src/app/dashboard/profiles/[id]/components/actions-dropdown.tsx b/src/app/dashboard/profiles/[id]/components/actions-dropdown.tsx index d0878710..0b044c79 100644 --- a/src/app/dashboard/profiles/[id]/components/actions-dropdown.tsx +++ b/src/app/dashboard/profiles/[id]/components/actions-dropdown.tsx @@ -12,7 +12,7 @@ import { import { useRouter } from 'next/navigation' import type { Profile } from '@/db/models/profile' import { useAction } from '@/trpc/client' -import { rhfActionDeleteProfile } from '@/app/dashboard/profiles/actions/profile.action' +import { rhfActionDeleteProfile } from '@/actions/profile.action' interface ActionsDropdownProps { profile?: Profile | null diff --git a/src/app/dashboard/profiles/[id]/components/publish-button.tsx b/src/app/dashboard/profiles/[id]/components/publish-button.tsx index c2805c73..dfd54c85 100644 --- a/src/app/dashboard/profiles/[id]/components/publish-button.tsx +++ b/src/app/dashboard/profiles/[id]/components/publish-button.tsx @@ -2,7 +2,7 @@ import { Button } from '@/components/ui/button' import { useAction } from '@/trpc/client' -import { rhfActionPushlishLens } from '@/app/dashboard/lenses/actions/lens.action' +import { rhfActionPushlishLens } from '@/actions/lens.action' interface PublishButtonProps { lensId: string diff --git a/src/app/dashboard/profiles/new/page.tsx b/src/app/dashboard/profiles/new/page.tsx index 501047da..61211c83 100644 --- a/src/app/dashboard/profiles/new/page.tsx +++ b/src/app/dashboard/profiles/new/page.tsx @@ -1,4 +1,4 @@ -import { Suspense, use, useDeferredValue } from 'react' +import { Suspense } from 'react' import { SubNav, SubNavTitle, SubNavSubtitle } from '@/components/sub-nav' import { Section } from '@/components/section' import { NewProfileForm } from '@/components/dashboard/profiles/new-form' diff --git a/src/app/dashboard/profiles/page.tsx b/src/app/dashboard/profiles/page.tsx index 4d227b8f..83f1f2ad 100644 --- a/src/app/dashboard/profiles/page.tsx +++ b/src/app/dashboard/profiles/page.tsx @@ -6,7 +6,7 @@ import { } from '@/components/sub-nav' import { Main } from '@/components/main' import { AddProfileButton } from '@/components/dashboard/profiles/add-button' -import { ProfileDataTable } from '@/components/dashboard/profiles/data-table' +import { ProfilesDataTable } from '@/components/dashboard/profiles/data-table' export default function Page() { return ( @@ -14,16 +14,14 @@ export default function Page() {

Profiles

- - Provide business context for a workload - + Business context of a workload.
- +
) diff --git a/src/app/dashboard/workloads/new/components/new-form.schema.tsx b/src/app/dashboard/workloads/new/components/new-form.schema.tsx index 884a2e04..31eb4b76 100644 --- a/src/app/dashboard/workloads/new/components/new-form.schema.tsx +++ b/src/app/dashboard/workloads/new/components/new-form.schema.tsx @@ -3,7 +3,7 @@ import { z } from 'zod' export const rhfActionSchema = z.object({ name: z.string().min(3, {}).default(''), lensesIds: z.array(z.string().uuid()).min(1).default([]), - environmentsIds: z.array(z.bigint()).min(1).default([]), + environmentsIds: z.array(z.coerce.bigint()).min(1).default([]), description: z .string() .min(10, { diff --git a/src/components/dashboard/profiles/data-columns.tsx b/src/components/dashboard/profiles/data-columns.tsx index 3234a82d..daf01c27 100644 --- a/src/components/dashboard/profiles/data-columns.tsx +++ b/src/components/dashboard/profiles/data-columns.tsx @@ -4,7 +4,7 @@ import { ColumnDef } from '@tanstack/react-table' import { Checkbox } from '@/components/ui/checkbox' import { Profile } from '@/db/models/profile' import { DataTableColumnHeader } from '@/components/data-table-column-header' -import { DataTableRowActions } from '@/components/data-table-row-actions' +import { DataTableRowActions } from './data-rows-actions' import Link from 'next/link' export const columns: ColumnDef[] = [ diff --git a/src/components/dashboard/profiles/data-rows-actions.tsx b/src/components/dashboard/profiles/data-rows-actions.tsx index 186bfbba..547714dc 100644 --- a/src/components/dashboard/profiles/data-rows-actions.tsx +++ b/src/components/dashboard/profiles/data-rows-actions.tsx @@ -2,7 +2,6 @@ import { DotsHorizontalIcon } from '@radix-ui/react-icons' import { Row } from '@tanstack/react-table' - import { Button } from '@/components/ui/button' import { api } from '@/trpc/client' import { @@ -11,9 +10,6 @@ import { DropdownMenuItem, DropdownMenuSeparator, DropdownMenuShortcut, - DropdownMenuSub, - DropdownMenuSubContent, - DropdownMenuSubTrigger, DropdownMenuTrigger } from '@/components/ui/dropdown-menu' import Link from 'next/link' @@ -43,24 +39,10 @@ export function DataTableRowActions({ - + View Make a copy - Favorite - - - Labels - - {/* - {labels.map(label => ( - - {label.label} - - ))} - */} - - deleteWorkload(id)}> Delete diff --git a/src/components/dashboard/profiles/data-table.tsx b/src/components/dashboard/profiles/data-table.tsx index 3f3d8e0e..6bcd2c97 100644 --- a/src/components/dashboard/profiles/data-table.tsx +++ b/src/components/dashboard/profiles/data-table.tsx @@ -5,13 +5,13 @@ import { DataTable } from '@/components/data-table' import { useQuery } from '@/lib/api' import { api } from '@/trpc/client' -export function ProfileDataTable() { +export function ProfilesDataTable() { const query = useQuery(({ pageIndex: offset, pageSize: limit }) => api.profiles.list.query({ offset, limit }) ) return ( -
+
) diff --git a/src/components/fancy-multi-select.tsx b/src/components/fancy-multi-select.tsx index 3e301690..7412df59 100644 --- a/src/components/fancy-multi-select.tsx +++ b/src/components/fancy-multi-select.tsx @@ -1,8 +1,7 @@ 'use client' -import * as React from 'react' +import { useEffect, useCallback, useState, useRef } from 'react' import { X } from 'lucide-react' - import { Badge } from '@/components/ui/badge' import { Command, CommandGroup, CommandItem } from '@/components/ui/command' import { Command as CommandPrimitive } from 'cmdk' @@ -24,29 +23,26 @@ export function FancyMultiSelect({ onValueChange, dataValues = [] }: FancyMultiSelectProps) { - const inputRef = React.useRef(null) - const [open, setOpen] = React.useState(false) - const [selected, setSelected] = React.useState[]>([ + const inputRef = useRef(null) + const [open, setOpen] = useState(false) + const [selected, setSelected] = useState[]>([ dataValues[0] ]) - const [inputValue, setInputValue] = React.useState('') + const [inputValue, setInputValue] = useState('') - React.useEffect(() => { + useEffect(() => { onValueChange?.(selected.map(s => s.value)) }, [selected, onValueChange]) - const handleSelect = React.useCallback((value: FancyMultiSelectValue) => { + const handleSelect = useCallback((value: FancyMultiSelectValue) => { setSelected(prev => [...prev, value]) }, []) - const handleUnselect = React.useCallback( - (select: FancyMultiSelectValue) => { - setSelected(prev => prev.filter(s => s.value !== select.value)) - }, - [] - ) + const handleUnselect = useCallback((select: FancyMultiSelectValue) => { + setSelected(prev => prev.filter(s => s.value !== select.value)) + }, []) - const handleKeyDown = React.useCallback( + const handleKeyDown = useCallback( (e: React.KeyboardEvent) => { const input = inputRef.current if (input) { diff --git a/src/app/dashboard/lenses/[id]/components/actions-dropdown.tsx b/src/components/lenses/actions-dropdown.tsx similarity index 94% rename from src/app/dashboard/lenses/[id]/components/actions-dropdown.tsx rename to src/components/lenses/actions-dropdown.tsx index fddce44e..9a63c9d5 100644 --- a/src/app/dashboard/lenses/[id]/components/actions-dropdown.tsx +++ b/src/components/lenses/actions-dropdown.tsx @@ -12,7 +12,7 @@ import { import { useRouter } from 'next/navigation' import { Lens } from '@/db/models/lens' import { useAction } from '@/trpc/client' -import { rhfActionDeleteLens } from '@/app/dashboard/lenses/actions/lens.action' +import { rhfActionDeleteLens } from '@/actions/lens.action' interface ActionsDropdownProps { lens?: Lens | null diff --git a/src/app/dashboard/lenses/components/add-button.tsx b/src/components/lenses/add-button.tsx similarity index 100% rename from src/app/dashboard/lenses/components/add-button.tsx rename to src/components/lenses/add-button.tsx diff --git a/src/app/dashboard/lenses/components/data-columns.tsx b/src/components/lenses/data-columns.tsx similarity index 96% rename from src/app/dashboard/lenses/components/data-columns.tsx rename to src/components/lenses/data-columns.tsx index cd7f1184..2704add3 100644 --- a/src/app/dashboard/lenses/components/data-columns.tsx +++ b/src/components/lenses/data-columns.tsx @@ -4,7 +4,7 @@ import { ColumnDef } from '@tanstack/react-table' import { Checkbox } from '@/components/ui/checkbox' import { Lens } from '@/db/models/lens' import { DataTableColumnHeader } from '@/components/data-table-column-header' -import { DataTableRowActions } from '@/app/dashboard/lenses/components/data-rows-actions' +import { DataTableRowActions } from '@/components/lenses/data-rows-actions' import { buttonVariants } from '@/components/ui/button' import { cn } from '@/lib/utils' import Link from 'next/link' @@ -87,6 +87,7 @@ export const columns: ColumnDef[] = [ ), cell: ({ row }) => { + console.log(row) return (
diff --git a/src/app/dashboard/lenses/components/data-rows-actions.tsx b/src/components/lenses/data-rows-actions.tsx similarity index 69% rename from src/app/dashboard/lenses/components/data-rows-actions.tsx rename to src/components/lenses/data-rows-actions.tsx index 3c965a35..e0fa6f5f 100644 --- a/src/app/dashboard/lenses/components/data-rows-actions.tsx +++ b/src/components/lenses/data-rows-actions.tsx @@ -16,7 +16,7 @@ import { } from '@/components/ui/dropdown-menu' import Link from 'next/link' import { useAction } from '@/trpc/client' -import { rhfActionDeleteLens } from '../actions/lens.action' +import { rhfActionDeleteLens } from '@/actions/lens.action' interface DataTableRowActionsProps { row: Row @@ -46,21 +46,6 @@ export function DataTableRowActions({ View - Make a copy - Favorite - - - Labels - - {/* - {labels.map(label => ( - - {label.label} - - ))} - */} - - deleteLens(id)}> Delete diff --git a/src/app/dashboard/lenses/components/data-table.tsx b/src/components/lenses/data-table.tsx similarity index 80% rename from src/app/dashboard/lenses/components/data-table.tsx rename to src/components/lenses/data-table.tsx index fe7136de..34395185 100644 --- a/src/app/dashboard/lenses/components/data-table.tsx +++ b/src/components/lenses/data-table.tsx @@ -2,7 +2,6 @@ import { columns } from './data-columns' import { DataTable } from '@/components/data-table' -import type { Lens } from '@/db/models/lens' import { useQuery } from '@/lib/api' import { api } from '@/trpc/client' @@ -13,7 +12,7 @@ export function LensesDataTable() { return (
- columns={columns} query={query()} /> +
) } diff --git a/src/app/dashboard/lenses/new/components/new-form.action.tsx b/src/components/lenses/new-form.action.tsx similarity index 88% rename from src/app/dashboard/lenses/new/components/new-form.action.tsx rename to src/components/lenses/new-form.action.tsx index 667597f8..bff18b57 100644 --- a/src/app/dashboard/lenses/new/components/new-form.action.tsx +++ b/src/components/lenses/new-form.action.tsx @@ -4,13 +4,11 @@ import 'server-only' import { createAction, protectedProcedure } from '@/server/trpc' import { rhfActionSchema } from './new-form.schema' import { createLens } from '@/db/services/lenses' -import { v4 as uuidv4 } from 'uuid' export const rhfAction = createAction( protectedProcedure.input(rhfActionSchema).mutation( async opts => await createLens({ - id: uuidv4(), name: opts.input.name, description: opts.input.description, spec: opts.input.spec diff --git a/src/app/dashboard/lenses/new/components/new-form.schema.tsx b/src/components/lenses/new-form.schema.tsx similarity index 100% rename from src/app/dashboard/lenses/new/components/new-form.schema.tsx rename to src/components/lenses/new-form.schema.tsx diff --git a/src/app/dashboard/lenses/new/components/new-form.tsx b/src/components/lenses/new-form.tsx similarity index 84% rename from src/app/dashboard/lenses/new/components/new-form.tsx rename to src/components/lenses/new-form.tsx index c9035bfe..83ac8162 100644 --- a/src/app/dashboard/lenses/new/components/new-form.tsx +++ b/src/components/lenses/new-form.tsx @@ -9,8 +9,9 @@ import { FormMessage, FormField } from '@/components/ui/form' +import type { PropsWithChildren } from 'react' import { Textarea } from '@/components/ui/textarea' -import { useEffect } from 'react' +import { useEffect, useMemo } from 'react' import { Input } from '@/components/ui/input' import { Button } from '@/components/ui/button' import { zodResolver } from '@hookform/resolvers/zod' @@ -21,11 +22,11 @@ import { z } from 'zod' import { useAction } from '@/trpc/client' import { useRouter } from 'next/navigation' -export type NewSolutionFormProps = { - className?: string -} +export type NewSolutionFormProps = {} -export function NewSolutionForm({ ...props }: NewSolutionFormProps) { +export function NewSolutionForm({ + ...props +}: PropsWithChildren) { const form = useForm>({ resolver: zodResolver(rhfActionSchema), defaultValues: { @@ -41,11 +42,16 @@ export function NewSolutionForm({ ...props }: NewSolutionFormProps) { await mutation.mutateAsync({ ...data }) } + const isLoading = useMemo( + () => mutation.status === 'loading', + [mutation.status] + ) + useEffect(() => { if (mutation.status === 'success') { router.push(`/dashboard/lenses/${mutation.data?.id}`) } - }) + }, [mutation.status, mutation.data?.id, router]) const fileRef = form.register('spec', { required: true }) @@ -66,7 +72,7 @@ export function NewSolutionForm({ ...props }: NewSolutionFormProps) {

Name

- + Give it a great name. @@ -82,7 +88,7 @@ export function NewSolutionForm({ ...props }: NewSolutionFormProps) { @@ -102,6 +108,7 @@ export function NewSolutionForm({ ...props }: NewSolutionFormProps) {