Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -61,13 +61,27 @@ const baseSettings: WebServerSettings = {
errorPageTitle: null,
errorPageDescription: null,
metaTitle: null,
metaDescription: null,
ogImageUrl: null,
footerText: null,
passwordResetGuide: null,
supportEmail: null,
brandingEnabled: false,
appearanceEnabled: false,
metadataEnabled: false,
errorPagesEnabled: false,
forgotPasswordEnabled: false,
},
cleanupCacheApplications: false,
cleanupCacheOnCompose: false,
cleanupCacheOnPreviews: false,
remoteServersOnly: false,
enforceSSO: false,
hideHelpLinks: false,
hideSocialLinks: false,
hideSSOLogin: false,
showSSOInSidebar: true,
showWhitelabelingInSidebar: true,
createdAt: null,
updatedAt: new Date(),
};
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
import { HelpCircle } from "lucide-react";
import { toast } from "sonner";
import { Label } from "@/components/ui/label";
import { Switch } from "@/components/ui/switch";
import {
Tooltip,
TooltipContent,
TooltipProvider,
TooltipTrigger,
} from "@/components/ui/tooltip";
import { api } from "@/utils/api";

export const ToggleHideHelpLinks = () => {
const { data, refetch } = api.settings.getWebServerSettings.useQuery();
const { mutateAsync } = api.settings.updateHideHelpLinks.useMutation();

const handleToggle = async (checked: boolean) => {
try {
await mutateAsync({ hideHelpLinks: checked });
await refetch();
toast.success("Hide Help Links updated");
} catch {
toast.error("Error updating Hide Help Links");
}
};

return (
<div className="flex items-center gap-4">
<Switch checked={!!data?.hideHelpLinks} onCheckedChange={handleToggle} />
<TooltipProvider delayDuration={0}>
<Tooltip>
<TooltipTrigger asChild>
<Label className="text-primary flex items-center gap-1.5 cursor-pointer">
Hide Help Links
<HelpCircle className="size-4 text-muted-foreground" />
</Label>
</TooltipTrigger>
<TooltipContent side="top" className="max-w-sm">
<p>
When enabled, the Documentation and Support links are hidden from
the sidebar.
</p>
</TooltipContent>
</Tooltip>
</TooltipProvider>
</div>
);
};
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
import { HelpCircle } from "lucide-react";
import { toast } from "sonner";
import { Label } from "@/components/ui/label";
import { Switch } from "@/components/ui/switch";
import {
Tooltip,
TooltipContent,
TooltipProvider,
TooltipTrigger,
} from "@/components/ui/tooltip";
import { api } from "@/utils/api";

export const ToggleHideSocialLinks = () => {
const { data, refetch } = api.settings.getWebServerSettings.useQuery();
const { mutateAsync } = api.settings.updateHideSocialLinks.useMutation();

const handleToggle = async (checked: boolean) => {
try {
await mutateAsync({ hideSocialLinks: checked });
await refetch();
toast.success("Hide Social Links updated");
} catch {
toast.error("Error updating Hide Social Links");
}
};

return (
<div className="flex items-center gap-4">
<Switch
checked={!!data?.hideSocialLinks}
onCheckedChange={handleToggle}
/>
<TooltipProvider delayDuration={0}>
<Tooltip>
<TooltipTrigger asChild>
<Label className="text-primary flex items-center gap-1.5 cursor-pointer">
Hide Social Links
<HelpCircle className="size-4 text-muted-foreground" />
</Label>
</TooltipTrigger>
<TooltipContent side="top" className="max-w-sm">
<p>
When enabled, the GitHub, X, and Discord links are hidden from the
login and onboarding pages.
</p>
</TooltipContent>
</Tooltip>
</TooltipProvider>
</div>
);
};
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
import { HelpCircle } from "lucide-react";
import { toast } from "sonner";
import { Label } from "@/components/ui/label";
import { Switch } from "@/components/ui/switch";
import {
Tooltip,
TooltipContent,
TooltipProvider,
TooltipTrigger,
} from "@/components/ui/tooltip";
import { api } from "@/utils/api";

export const ToggleHideSSOLogin = () => {
const { data, refetch } = api.settings.getWebServerSettings.useQuery();
const { mutateAsync } = api.settings.updateHideSSOLogin.useMutation();

const handleToggle = async (checked: boolean) => {
try {
await mutateAsync({ hideSSOLogin: checked });
await refetch();
toast.success("Hide SSO Login updated");
} catch {
toast.error("Error updating Hide SSO Login");
}
};

return (
<div className="flex items-center gap-4">
<Switch checked={!!data?.hideSSOLogin} onCheckedChange={handleToggle} />
<TooltipProvider delayDuration={0}>
<Tooltip>
<TooltipTrigger asChild>
<Label className="text-primary flex items-center gap-1.5 cursor-pointer">
Hide SSO Login
<HelpCircle className="size-4 text-muted-foreground" />
</Label>
</TooltipTrigger>
<TooltipContent side="top" className="max-w-sm">
<p>
When enabled, the "Sign in with SSO" option is hidden from the
login page. Has no effect when "Enforce SSO" is on.
</p>
</TooltipContent>
</Tooltip>
</TooltipProvider>
</div>
);
};
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
import { HelpCircle } from "lucide-react";
import { toast } from "sonner";
import { Label } from "@/components/ui/label";
import { Switch } from "@/components/ui/switch";
import {
Tooltip,
TooltipContent,
TooltipProvider,
TooltipTrigger,
} from "@/components/ui/tooltip";
import { api } from "@/utils/api";

export const ToggleShowSSO = () => {
const { data, refetch } = api.settings.getWebServerSettings.useQuery();
const { mutateAsync } = api.settings.updateShowSSOInSidebar.useMutation();

const handleToggle = async (checked: boolean) => {
try {
await mutateAsync({ showSSOInSidebar: checked });
await refetch();
toast.success("Single Sign-On (SSO) updated");
} catch {
toast.error("Error updating Single Sign-On (SSO)");
}
};

return (
<div className="flex items-center gap-4">
<Switch
checked={data?.showSSOInSidebar !== false}
onCheckedChange={handleToggle}
/>
<TooltipProvider delayDuration={0}>
<Tooltip>
<TooltipTrigger asChild>
<Label className="text-primary flex items-center gap-1.5 cursor-pointer">
Single Sign-On (SSO)
<HelpCircle className="size-4 text-muted-foreground" />
</Label>
</TooltipTrigger>
<TooltipContent side="top" className="max-w-sm">
<p>When enabled, the SSO settings appear in the sidebar.</p>
</TooltipContent>
</Tooltip>
</TooltipProvider>
</div>
);
};
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
import { HelpCircle } from "lucide-react";
import { toast } from "sonner";
import { Label } from "@/components/ui/label";
import { Switch } from "@/components/ui/switch";
import {
Tooltip,
TooltipContent,
TooltipProvider,
TooltipTrigger,
} from "@/components/ui/tooltip";
import { api } from "@/utils/api";

export const ToggleShowWhitelabeling = () => {
const { data, refetch } = api.settings.getWebServerSettings.useQuery();
const { mutateAsync } =
api.settings.updateShowWhitelabelingInSidebar.useMutation();

const handleToggle = async (checked: boolean) => {
try {
await mutateAsync({ showWhitelabelingInSidebar: checked });
await refetch();
toast.success("Whitelabeling (Branding) updated");
} catch {
toast.error("Error updating Whitelabeling (Branding)");
}
};

return (
<div className="flex items-center gap-4">
<Switch
checked={data?.showWhitelabelingInSidebar !== false}
onCheckedChange={handleToggle}
/>
<TooltipProvider delayDuration={0}>
<Tooltip>
<TooltipTrigger asChild>
<Label className="text-primary flex items-center gap-1.5 cursor-pointer">
Whitelabeling (Branding)
<HelpCircle className="size-4 text-muted-foreground" />
</Label>
</TooltipTrigger>
<TooltipContent side="top" className="max-w-sm">
<p>
When enabled, the Whitelabeling settings appear in the sidebar.
</p>
</TooltipContent>
</Tooltip>
</TooltipProvider>
</div>
);
};
74 changes: 38 additions & 36 deletions apps/dokploy/components/layouts/onboarding-layout.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -39,43 +39,45 @@ export const OnboardingLayout = ({ children }: Props) => {
<div className="flex w-full flex-col justify-center space-y-6 max-w-lg mx-auto">
{children}
</div>
<div className="flex items-center gap-4 justify-center absolute bottom-4 right-4 text-muted-foreground">
<Button variant="ghost" size="icon">
<Link href="https://github.com/dokploy/dokploy">
<GithubIcon />
</Link>
</Button>
<Button variant="ghost" size="icon">
<Link href="https://x.com/getdokploy">
<svg
stroke="currentColor"
fill="currentColor"
strokeWidth="0"
viewBox="0 0 24 24"
xmlns="http://www.w3.org/2000/svg"
className="size-5"
>
<path d="M10.4883 14.651L15.25 21H22.25L14.3917 10.5223L20.9308 3H18.2808L13.1643 8.88578L8.75 3H1.75L9.26086 13.0145L2.31915 21H4.96917L10.4883 14.651ZM16.25 19L5.75 5H7.75L18.25 19H16.25Z" />
</svg>
</Link>
</Button>
<Button variant="ghost" size="icon">
<Link href="https://discord.com/invite/2tBnJ3jDJc">
<svg
xmlns="http://www.w3.org/2000/svg"
viewBox="0 0 48 48"
width="48px"
height="48px"
className={cn("size-6")}
>
<path
{!whitelabeling?.hideSocialLinks && (
<div className="flex items-center gap-4 justify-center absolute bottom-4 right-4 text-muted-foreground">
<Button variant="ghost" size="icon">
<Link href="https://github.com/dokploy/dokploy">
<GithubIcon />
</Link>
</Button>
<Button variant="ghost" size="icon">
<Link href="https://x.com/getdokploy">
<svg
stroke="currentColor"
fill="currentColor"
d="M39.248,10.177c-2.804-1.287-5.812-2.235-8.956-2.778c-0.057-0.01-0.114,0.016-0.144,0.068 c-0.387,0.688-0.815,1.585-1.115,2.291c-3.382-0.506-6.747-0.506-10.059,0c-0.3-0.721-0.744-1.603-1.133-2.291 c-0.03-0.051-0.087-0.077-0.144-0.068c-3.143,0.541-6.15,1.489-8.956,2.778c-0.024,0.01-0.045,0.028-0.059,0.051 c-5.704,8.522-7.267,16.835-6.5,25.044c0.003,0.04,0.026,0.079,0.057,0.103c3.763,2.764,7.409,4.442,10.987,5.554 c0.057,0.017,0.118-0.003,0.154-0.051c0.846-1.156,1.601-2.374,2.248-3.656c0.038-0.075,0.002-0.164-0.076-0.194 c-1.197-0.454-2.336-1.007-3.432-1.636c-0.087-0.051-0.094-0.175-0.014-0.234c0.231-0.173,0.461-0.353,0.682-0.534 c0.04-0.033,0.095-0.04,0.142-0.019c7.201,3.288,14.997,3.288,22.113,0c0.047-0.023,0.102-0.016,0.144,0.017 c0.22,0.182,0.451,0.363,0.683,0.536c0.08,0.059,0.075,0.183-0.012,0.234c-1.096,0.641-2.236,1.182-3.434,1.634 c-0.078,0.03-0.113,0.12-0.075,0.196c0.661,1.28,1.415,2.498,2.246,3.654c0.035,0.049,0.097,0.07,0.154,0.052 c3.595-1.112,7.241-2.79,11.004-5.554c0.033-0.024,0.054-0.061,0.057-0.101c0.917-9.491-1.537-17.735-6.505-25.044 C39.293,10.205,39.272,10.187,39.248,10.177z M16.703,30.273c-2.168,0-3.954-1.99-3.954-4.435s1.752-4.435,3.954-4.435 c2.22,0,3.989,2.008,3.954,4.435C20.658,28.282,18.906,30.273,16.703,30.273z M31.324,30.273c-2.168,0-3.954-1.99-3.954-4.435 s1.752-4.435,3.954-4.435c2.22,0,3.989,2.008,3.954,4.435C35.278,28.282,33.544,30.273,31.324,30.273z"
/>
</svg>
</Link>
</Button>
</div>
strokeWidth="0"
viewBox="0 0 24 24"
xmlns="http://www.w3.org/2000/svg"
className="size-5"
>
<path d="M10.4883 14.651L15.25 21H22.25L14.3917 10.5223L20.9308 3H18.2808L13.1643 8.88578L8.75 3H1.75L9.26086 13.0145L2.31915 21H4.96917L10.4883 14.651ZM16.25 19L5.75 5H7.75L18.25 19H16.25Z" />
</svg>
</Link>
</Button>
<Button variant="ghost" size="icon">
<Link href="https://discord.com/invite/2tBnJ3jDJc">
<svg
xmlns="http://www.w3.org/2000/svg"
viewBox="0 0 48 48"
width="48px"
height="48px"
className={cn("size-6")}
>
<path
fill="currentColor"
d="M39.248,10.177c-2.804-1.287-5.812-2.235-8.956-2.778c-0.057-0.01-0.114,0.016-0.144,0.068 c-0.387,0.688-0.815,1.585-1.115,2.291c-3.382-0.506-6.747-0.506-10.059,0c-0.3-0.721-0.744-1.603-1.133-2.291 c-0.03-0.051-0.087-0.077-0.144-0.068c-3.143,0.541-6.15,1.489-8.956,2.778c-0.024,0.01-0.045,0.028-0.059,0.051 c-5.704,8.522-7.267,16.835-6.5,25.044c0.003,0.04,0.026,0.079,0.057,0.103c3.763,2.764,7.409,4.442,10.987,5.554 c0.057,0.017,0.118-0.003,0.154-0.051c0.846-1.156,1.601-2.374,2.248-3.656c0.038-0.075,0.002-0.164-0.076-0.194 c-1.197-0.454-2.336-1.007-3.432-1.636c-0.087-0.051-0.094-0.175-0.014-0.234c0.231-0.173,0.461-0.353,0.682-0.534 c0.04-0.033,0.095-0.04,0.142-0.019c7.201,3.288,14.997,3.288,22.113,0c0.047-0.023,0.102-0.016,0.144,0.017 c0.22,0.182,0.451,0.363,0.683,0.536c0.08,0.059,0.075,0.183-0.012,0.234c-1.096,0.641-2.236,1.182-3.434,1.634 c-0.078,0.03-0.113,0.12-0.075,0.196c0.661,1.28,1.415,2.498,2.246,3.654c0.035,0.049,0.097,0.07,0.154,0.052 c3.595-1.112,7.241-2.79,11.004-5.554c0.033-0.024,0.054-0.061,0.057-0.101c0.917-9.491-1.537-17.735-6.505-25.044 C39.293,10.205,39.272,10.187,39.248,10.177z M16.703,30.273c-2.168,0-3.954-1.99-3.954-4.435s1.752-4.435,3.954-4.435 c2.22,0,3.989,2.008,3.954,4.435C20.658,28.282,18.906,30.273,16.703,30.273z M31.324,30.273c-2.168,0-3.954-1.99-3.954-4.435 s1.752-4.435,3.954-4.435c2.22,0,3.989,2.008,3.954,4.435C35.278,28.282,33.544,30.273,31.324,30.273z"
/>
</svg>
</Link>
</Button>
</div>
)}
</div>
</div>
);
Expand Down
Loading