This commit is contained in:
Saeed Vaziry
2025-06-04 08:08:20 +02:00
parent efacadba10
commit c3f69f3247
114 changed files with 4032 additions and 765 deletions

View File

@ -103,7 +103,7 @@ export function AppSidebar() {
},
{
title: 'Application',
href: route('sites.show', { server: page.props.server?.id || 0, site: page.props.site?.id || 0 }),
href: route('application', { server: page.props.server?.id || 0, site: page.props.site?.id || 0 }),
icon: RocketIcon,
},
]

View File

@ -129,7 +129,7 @@ export function AppSidebar({ secondNavItems, secondNavTitle }: { secondNavItems?
<Collapsible key={`${item.title}-${item.href}`} defaultOpen={isActive} className="group/collapsible">
<SidebarMenuItem>
<CollapsibleTrigger asChild>
<SidebarMenuButton disabled={item.isDisabled || false}>
<SidebarMenuButton disabled={item.isDisabled || false} hidden={item.hidden}>
{item.icon && <item.icon />}
<span>{item.title}</span>
<ChevronRightIcon className="ml-auto transition-transform group-data-[state=open]/collapsible:rotate-90" />
@ -162,7 +162,7 @@ export function AppSidebar({ secondNavItems, secondNavTitle }: { secondNavItems?
}
return (
<SidebarMenuItem key={`${item.title}-${item.href}`}>
<SidebarMenuItem key={`${item.title}-${item.href}`} hidden={item.hidden}>
<SidebarMenuButton onClick={() => router.visit(item.href)} isActive={isActive} disabled={item.isDisabled || false}>
{item.icon && <item.icon />}
<span>{item.title}</span>

View File

@ -17,7 +17,7 @@ export default function CopyableBadge({ text }: { text: string }) {
<Tooltip>
<TooltipTrigger asChild>
<div className="inline-flex cursor-pointer justify-start space-x-2 truncate" onClick={copyToClipboard}>
<Badge variant={copySuccess ? 'success' : 'outline'} className="block max-w-[150px] overflow-ellipsis">
<Badge variant={copySuccess ? 'success' : 'outline'} className="block max-w-[200px] overflow-ellipsis">
{text}
</Badge>
</div>

View File

@ -15,15 +15,26 @@ import { Avatar, AvatarFallback } from '@/components/ui/avatar';
import { type Site } from '@/types/site';
import type { SharedData } from '@/types';
import CreateSite from '@/pages/sites/components/create-site';
import siteHelper from '@/lib/site-helper';
export function SiteSwitch() {
const page = usePage<SharedData>();
const [selectedSite, setSelectedSite] = useState(page.props.site || null);
const storedSite = siteHelper.getStoredSite();
const [selectedSite, setSelectedSite] = useState(page.props.site || storedSite || null);
const initials = useInitials();
const form = useForm();
if (storedSite && page.props.site && storedSite.id !== page.props.site.id) {
siteHelper.storeSite(page.props.site);
}
if (storedSite && page.props.serverSites && !page.props.serverSites.find((site) => site.id === storedSite.id)) {
siteHelper.storeSite();
}
const handleSiteChange = (site: Site) => {
setSelectedSite(site);
siteHelper.storeSite(site);
form.post(route('sites.switch', { server: site.server_id, site: site.id }));
};

View File

@ -43,7 +43,7 @@ export default function DynamicField({ value, onChange, config, error }: Dynamic
<Label htmlFor={config.name} className="capitalize">
{label}
</Label>
<Select value={value as string} onValueChange={onChange}>
<Select defaultValue={value as string} onValueChange={onChange}>
<SelectTrigger id={config.name}>
<SelectValue placeholder={config.placeholder || `Select ${label}`} />
</SelectTrigger>
@ -74,7 +74,14 @@ export default function DynamicField({ value, onChange, config, error }: Dynamic
<Label htmlFor={config.name} className="capitalize">
{label}
</Label>
<Input type="text" name={config.name} id={config.name} value={(value as string) || ''} onChange={(e) => onChange(e.target.value)} {...props} />
<Input
type="text"
name={config.name}
id={config.name}
defaultValue={(value as string) || ''}
onChange={(e) => onChange(e.target.value)}
{...props}
/>
{config.description && <p className="text-muted-foreground text-xs">{config.description}</p>}
<InputError message={error} />
</FormField>