From e9ff1146343dd47f44abdcd446fe9c6f3348f8f7 Mon Sep 17 00:00:00 2001 From: mhbdev Date: Sat, 24 Jan 2026 21:31:39 +0330 Subject: [PATCH 1/6] Made the password visibility and generator controls keyboard-accessible and added proper focus-visible rings/labels in input.tsx --- apps/dokploy/components/ui/input.tsx | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/apps/dokploy/components/ui/input.tsx b/apps/dokploy/components/ui/input.tsx index ddeb368944..53ca9190b6 100644 --- a/apps/dokploy/components/ui/input.tsx +++ b/apps/dokploy/components/ui/input.tsx @@ -89,20 +89,20 @@ const Input = React.forwardRef( {shouldShowGenerator && ( )} - - + + ) : ( <> {data?.length === 0 ? ( -
- - - Start adding servers to deploy your applications - remotely. - - -
+ + + + + + No servers yet + + Start adding servers to deploy your applications + remotely. + + + + + + ) : (
diff --git a/apps/dokploy/components/dashboard/swarm/monitoring-card.tsx b/apps/dokploy/components/dashboard/swarm/monitoring-card.tsx index ef6791ffe9..d43679e697 100644 --- a/apps/dokploy/components/dashboard/swarm/monitoring-card.tsx +++ b/apps/dokploy/components/dashboard/swarm/monitoring-card.tsx @@ -1,14 +1,23 @@ import { Activity, - Loader2, Monitor, Server, + ServerOff, Settings, WorkflowIcon, } from "lucide-react"; import { Badge } from "@/components/ui/badge"; import { Button } from "@/components/ui/button"; import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"; +import { + Empty, + EmptyContent, + EmptyDescription, + EmptyHeader, + EmptyMedia, + EmptyTitle, +} from "@/components/ui/empty"; +import { Skeleton } from "@/components/ui/skeleton"; import { Tooltip, TooltipContent, @@ -29,29 +38,90 @@ export default function SwarmMonitorCard({ serverId }: Props) { if (isLoading) { return ( -
-
- {/*
*/} - -
- Loading... - + +
+
+
+ + +
+ {!serverId && } +
+
+ {Array.from({ length: 3 }).map((_, index) => ( + + + + + + + ))} +
+
+ {Array.from({ length: 6 }).map((_, index) => ( + + ))}
- {/*
*/}
-
+ ); } if (!nodes) { return ( -
-
-
- Failed to load data -
+ +
+ + + + + + Unable to load swarm data + + We couldn't reach the swarm API. Check your server connection + and try again. + + + + + +
-
+ + ); + } + + if (nodes.length === 0) { + return ( + +
+ + + + + + No swarm nodes yet + + Add nodes to start monitoring your cluster health and activity. + + + {!serverId && ( + + + + )} + +
+
); } diff --git a/apps/dokploy/components/ui/empty.tsx b/apps/dokploy/components/ui/empty.tsx new file mode 100644 index 0000000000..71667632e7 --- /dev/null +++ b/apps/dokploy/components/ui/empty.tsx @@ -0,0 +1,104 @@ +import { cva, type VariantProps } from "class-variance-authority" + +import { cn } from "@/lib/utils" + +function Empty({ className, ...props }: React.ComponentProps<"div">) { + return ( +
+ ) +} + +function EmptyHeader({ className, ...props }: React.ComponentProps<"div">) { + return ( +
+ ) +} + +const emptyMediaVariants = cva( + "mb-2 flex shrink-0 items-center justify-center [&_svg]:pointer-events-none [&_svg]:shrink-0", + { + variants: { + variant: { + default: "bg-transparent", + icon: "bg-muted text-foreground flex size-10 shrink-0 items-center justify-center rounded-lg [&_svg:not([class*='size-'])]:size-6", + }, + }, + defaultVariants: { + variant: "default", + }, + } +) + +function EmptyMedia({ + className, + variant = "default", + ...props +}: React.ComponentProps<"div"> & VariantProps) { + return ( +
+ ) +} + +function EmptyTitle({ className, ...props }: React.ComponentProps<"div">) { + return ( +
+ ) +} + +function EmptyDescription({ className, ...props }: React.ComponentProps<"p">) { + return ( +
a:hover]:text-primary text-sm/relaxed [&>a]:underline [&>a]:underline-offset-4", + className + )} + {...props} + /> + ) +} + +function EmptyContent({ className, ...props }: React.ComponentProps<"div">) { + return ( +
+ ) +} + +export { + Empty, + EmptyHeader, + EmptyTitle, + EmptyDescription, + EmptyContent, + EmptyMedia, +} From 5f644da0bb5b8fbd3b2f6d9fe21833421f16adfd Mon Sep 17 00:00:00 2001 From: mhbdev Date: Sat, 24 Jan 2026 22:47:23 +0330 Subject: [PATCH 4/6] =?UTF-8?q?Standardized=20the=20remaining=20loading/em?= =?UTF-8?q?pty=20states=20by=20introducing=20a=20shared=20ListSkeleton=20h?= =?UTF-8?q?elper=20and=20swapping=20all=20remaining=20=E2=80=9CLoading?= =?UTF-8?q?=E2=80=A6=E2=80=9D/empty=20placeholders=20to=20Empty/Skeleton?= =?UTF-8?q?=20across=20list=20views=20and=20selection=20popovers,=20so=20l?= =?UTF-8?q?ayouts=20stay=20stable=20and=20guidance=20is=20consistent.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../advanced/traefik/show-traefik-config.tsx | 35 ++++++---- .../deployments/show-deployments.tsx | 37 +++++++---- .../application/domains/show-domains.tsx | 43 +++++++----- .../generic/save-bitbucket-provider.tsx | 54 +++++++++------ .../general/generic/save-gitea-provider.tsx | 57 +++++++++------- .../general/generic/save-github-provider.tsx | 54 +++++++++------ .../general/generic/save-gitlab-provider.tsx | 54 +++++++++------ .../application/general/generic/show.tsx | 14 ++-- .../dashboard/application/logs/show.tsx | 7 +- .../show-preview-deployments.tsx | 60 +++++++++++------ .../application/schedules/show-schedules.tsx | 45 ++++++++----- .../volume-backups/restore-volume-backups.tsx | 37 ++++++++--- .../volume-backups/show-volume-backups.tsx | 50 ++++++++------ .../save-bitbucket-provider-compose.tsx | 54 +++++++++------ .../generic/save-gitea-provider-compose.tsx | 44 ++++++++----- .../generic/save-github-provider-compose.tsx | 54 +++++++++------ .../generic/save-gitlab-provider-compose.tsx | 54 +++++++++------ .../compose/general/generic/show.tsx | 14 ++-- .../dashboard/compose/logs/show-stack.tsx | 7 +- .../dashboard/compose/logs/show.tsx | 7 +- .../database/backups/handle-backup.tsx | 30 +++++---- .../database/backups/restore-backup.tsx | 37 ++++++++--- .../dashboard/docker/show/show-containers.tsx | 48 +++++++++----- .../file-system/show-traefik-file.tsx | 11 ++-- .../file-system/show-traefik-system.tsx | 61 +++++++++++------ .../impersonation/impersonation-bar.tsx | 9 ++- .../show-free-compose-monitoring.tsx | 7 +- .../show-paid-compose-monitoring.tsx | 7 +- .../dashboard/project/add-template.tsx | 65 ++++++++++++------ .../dashboard/requests/show-requests.tsx | 27 +++++--- .../components/dashboard/settings/ai-form.tsx | 40 +++++++---- .../dashboard/settings/api/show-api-keys.tsx | 24 +++++-- .../settings/billing/show-billing.tsx | 11 ++-- .../settings/billing/show-invoices.tsx | 40 ++++++----- .../certificates/show-certificates.tsx | 40 +++++++---- .../cluster/registry/show-registry.tsx | 40 +++++++---- .../destination/show-destinations.tsx | 41 ++++++++---- .../settings/git/show-git-providers.tsx | 39 +++++++---- .../dashboard/settings/handle-ai.tsx | 24 +++++-- .../notifications/show-notifications.tsx | 41 ++++++++---- .../settings/profile/profile-form.tsx | 13 ++-- .../settings/ssh-keys/show-ssh-keys.tsx | 40 +++++++---- .../settings/users/add-permissions.tsx | 39 ++++++++--- .../settings/users/show-invitations.tsx | 40 +++++++---- .../dashboard/settings/users/show-users.tsx | 35 ++++++---- .../web-server/docker-terminal-modal.tsx | 7 +- .../settings/web-server/show-modal-logs.tsx | 7 +- .../swarm/applications/data-table.tsx | 9 --- .../swarm/applications/show-applications.tsx | 24 +++++-- .../components/shared/list-skeleton.tsx | 54 +++++++++++++++ apps/dokploy/pages/dashboard/monitoring.tsx | 11 ++-- .../environment/[environmentId].tsx | 66 ++++++++++++------- 52 files changed, 1170 insertions(+), 598 deletions(-) create mode 100644 apps/dokploy/components/shared/list-skeleton.tsx diff --git a/apps/dokploy/components/dashboard/application/advanced/traefik/show-traefik-config.tsx b/apps/dokploy/components/dashboard/application/advanced/traefik/show-traefik-config.tsx index ae23f18668..3349cf418c 100644 --- a/apps/dokploy/components/dashboard/application/advanced/traefik/show-traefik-config.tsx +++ b/apps/dokploy/components/dashboard/application/advanced/traefik/show-traefik-config.tsx @@ -1,4 +1,4 @@ -import { File, Loader2 } from "lucide-react"; +import { File } from "lucide-react"; import { CodeEditor } from "@/components/shared/code-editor"; import { Card, @@ -7,6 +7,14 @@ import { CardHeader, CardTitle, } from "@/components/ui/card"; +import { + Empty, + EmptyDescription, + EmptyHeader, + EmptyMedia, + EmptyTitle, +} from "@/components/ui/empty"; +import { Skeleton } from "@/components/ui/skeleton"; import { api } from "@/utils/api"; import { UpdateTraefikConfig } from "./update-traefik-config"; @@ -36,17 +44,22 @@ export const ShowTraefikConfig = ({ applicationId }: Props) => { {isLoading ? ( - - Loading... - - - ) : !data ? ( -
- - - No traefik config detected - +
+ +
+ ) : !data ? ( + + + + + + No Traefik config detected + + Add a configuration file to manage custom rules. + + + ) : (
diff --git a/apps/dokploy/components/dashboard/application/deployments/show-deployments.tsx b/apps/dokploy/components/dashboard/application/deployments/show-deployments.tsx index cfe747d27e..4c12de0544 100644 --- a/apps/dokploy/components/dashboard/application/deployments/show-deployments.tsx +++ b/apps/dokploy/components/dashboard/application/deployments/show-deployments.tsx @@ -2,7 +2,6 @@ import { ChevronDown, ChevronUp, Clock, - Loader2, RefreshCcw, RocketIcon, Settings, @@ -22,6 +21,14 @@ import { CardHeader, CardTitle, } from "@/components/ui/card"; +import { + Empty, + EmptyDescription, + EmptyHeader, + EmptyMedia, + EmptyTitle, +} from "@/components/ui/empty"; +import { ListSkeleton } from "@/components/shared/list-skeleton"; import { api, type RouterOutputs } from "@/utils/api"; import { ShowRollbackSettings } from "../rollbacks/show-rollback-settings"; import { CancelQueues } from "./cancel-queues"; @@ -231,19 +238,23 @@ export const ShowDeployments = ({ )} {isLoadingDeployments ? ( -
- - - Loading deployments... - -
+ ) : deployments?.length === 0 ? ( -
- - - No deployments found - -
+ + + + + + No deployments yet + + Your deployment history will show up here once you deploy. + + + ) : (
{deployments?.map((deployment, index) => { diff --git a/apps/dokploy/components/dashboard/application/domains/show-domains.tsx b/apps/dokploy/components/dashboard/application/domains/show-domains.tsx index 1fd3d82e90..f4ae61739b 100644 --- a/apps/dokploy/components/dashboard/application/domains/show-domains.tsx +++ b/apps/dokploy/components/dashboard/application/domains/show-domains.tsx @@ -3,7 +3,6 @@ import { ExternalLink, GlobeIcon, InfoIcon, - Loader2, PenBoxIcon, RefreshCw, Server, @@ -14,6 +13,7 @@ import Link from "next/link"; import { useState } from "react"; import { toast } from "sonner"; import { DialogAction } from "@/components/shared/dialog-action"; +import { ListSkeleton } from "@/components/shared/list-skeleton"; import { Badge } from "@/components/ui/badge"; import { Button } from "@/components/ui/button"; import { @@ -23,6 +23,14 @@ import { CardHeader, CardTitle, } from "@/components/ui/card"; +import { + Empty, + EmptyContent, + EmptyDescription, + EmptyHeader, + EmptyMedia, + EmptyTitle, +} from "@/components/ui/empty"; import { Tooltip, TooltipContent, @@ -160,27 +168,30 @@ export const ShowDomains = ({ id, type }: Props) => { {isLoadingDomains ? ( -
- - - Loading domains... - -
+ ) : data?.length === 0 ? ( -
- - - To access the application it is required to set at least 1 - domain - -
+ + + + + + No domains yet + + Add at least one domain to access your application. + + + -
-
+ + ) : (
{data?.map((item) => { diff --git a/apps/dokploy/components/dashboard/application/general/generic/save-bitbucket-provider.tsx b/apps/dokploy/components/dashboard/application/general/generic/save-bitbucket-provider.tsx index 1f54ddd582..65928a48c2 100644 --- a/apps/dokploy/components/dashboard/application/general/generic/save-bitbucket-provider.tsx +++ b/apps/dokploy/components/dashboard/application/general/generic/save-bitbucket-provider.tsx @@ -7,8 +7,10 @@ import { toast } from "sonner"; import { z } from "zod"; import { BitbucketIcon } from "@/components/icons/data-tools-icons"; import { AlertBlock } from "@/components/shared/alert-block"; +import { ListSkeleton } from "@/components/shared/list-skeleton"; import { Badge } from "@/components/ui/badge"; import { Button } from "@/components/ui/button"; +import { Skeleton } from "@/components/ui/skeleton"; import { Command, CommandEmpty, @@ -237,13 +239,15 @@ export const SaveBitbucketProvider = ({ applicationId }: Props) => { !field.value && "text-muted-foreground", )} > - {isLoadingRepositories - ? "Loading...." - : field.value.owner - ? repositories?.find( - (repo) => repo.name === field.value.repo, - )?.name - : "Select repository"} + {isLoadingRepositories ? ( + + ) : field.value.owner ? ( + repositories?.find( + (repo) => repo.name === field.value.repo, + )?.name + ) : ( + "Select repository" + )} @@ -256,9 +260,13 @@ export const SaveBitbucketProvider = ({ applicationId }: Props) => { className="h-9" /> {isLoadingRepositories && ( - - Loading Repositories.... - +
+ +
)} No repositories found. @@ -320,13 +328,15 @@ export const SaveBitbucketProvider = ({ applicationId }: Props) => { !field.value && "text-muted-foreground", )} > - {status === "loading" && fetchStatus === "fetching" - ? "Loading...." - : field.value - ? branches?.find( - (branch) => branch.name === field.value, - )?.name - : "Select branch"} + {status === "loading" && fetchStatus === "fetching" ? ( + + ) : field.value ? ( + branches?.find( + (branch) => branch.name === field.value, + )?.name + ) : ( + "Select branch" + )} @@ -338,9 +348,13 @@ export const SaveBitbucketProvider = ({ applicationId }: Props) => { className="h-9" /> {status === "loading" && fetchStatus === "fetching" && ( - - Loading Branches.... - +
+ +
)} {!repository?.owner && ( diff --git a/apps/dokploy/components/dashboard/application/general/generic/save-gitea-provider.tsx b/apps/dokploy/components/dashboard/application/general/generic/save-gitea-provider.tsx index 2198f4a975..93197dde4a 100644 --- a/apps/dokploy/components/dashboard/application/general/generic/save-gitea-provider.tsx +++ b/apps/dokploy/components/dashboard/application/general/generic/save-gitea-provider.tsx @@ -7,8 +7,10 @@ import { toast } from "sonner"; import { z } from "zod"; import { GiteaIcon } from "@/components/icons/data-tools-icons"; import { AlertBlock } from "@/components/shared/alert-block"; +import { ListSkeleton } from "@/components/shared/list-skeleton"; import { Badge } from "@/components/ui/badge"; import { Button } from "@/components/ui/button"; +import { Skeleton } from "@/components/ui/skeleton"; import { Command, CommandEmpty, @@ -258,14 +260,16 @@ export const SaveGiteaProvider = ({ applicationId }: Props) => { !field.value && "text-muted-foreground", )} > - {isLoadingRepositories - ? "Loading...." - : field.value.owner - ? repositories?.find( - (repo: GiteaRepository) => - repo.name === field.value.repo, - )?.name - : "Select repository"} + {isLoadingRepositories ? ( + + ) : field.value.owner ? ( + repositories?.find( + (repo: GiteaRepository) => + repo.name === field.value.repo, + )?.name + ) : ( + "Select repository" + )} @@ -278,9 +282,13 @@ export const SaveGiteaProvider = ({ applicationId }: Props) => { className="h-9" /> {isLoadingRepositories && ( - - Loading Repositories.... - +
+ +
)} No repositories found. @@ -349,14 +357,15 @@ export const SaveGiteaProvider = ({ applicationId }: Props) => { !field.value && "text-muted-foreground", )} > - {status === "loading" && fetchStatus === "fetching" - ? "Loading...." - : field.value - ? branches?.find( - (branch: GiteaBranch) => - branch.name === field.value, - )?.name - : "Select branch"} + {status === "loading" && fetchStatus === "fetching" ? ( + + ) : field.value ? ( + branches?.find( + (branch: GiteaBranch) => branch.name === field.value, + )?.name + ) : ( + "Select branch" + )} @@ -368,9 +377,13 @@ export const SaveGiteaProvider = ({ applicationId }: Props) => { className="h-9" /> {status === "loading" && fetchStatus === "fetching" && ( - - Loading Branches.... - +
+ +
)} {!repository?.owner && ( diff --git a/apps/dokploy/components/dashboard/application/general/generic/save-github-provider.tsx b/apps/dokploy/components/dashboard/application/general/generic/save-github-provider.tsx index 80d6850ca9..1698639921 100644 --- a/apps/dokploy/components/dashboard/application/general/generic/save-github-provider.tsx +++ b/apps/dokploy/components/dashboard/application/general/generic/save-github-provider.tsx @@ -6,8 +6,10 @@ import { useForm } from "react-hook-form"; import { toast } from "sonner"; import { z } from "zod"; import { GithubIcon } from "@/components/icons/data-tools-icons"; +import { ListSkeleton } from "@/components/shared/list-skeleton"; import { Badge } from "@/components/ui/badge"; import { Button } from "@/components/ui/button"; +import { Skeleton } from "@/components/ui/skeleton"; import { Command, CommandEmpty, @@ -233,13 +235,15 @@ export const SaveGithubProvider = ({ applicationId }: Props) => { !field.value && "text-muted-foreground", )} > - {isLoadingRepositories - ? "Loading...." - : field.value.owner - ? repositories?.find( - (repo) => repo.name === field.value.repo, - )?.name - : "Select repository"} + {isLoadingRepositories ? ( + + ) : field.value.owner ? ( + repositories?.find( + (repo) => repo.name === field.value.repo, + )?.name + ) : ( + "Select repository" + )} @@ -252,9 +256,13 @@ export const SaveGithubProvider = ({ applicationId }: Props) => { className="h-9" /> {isLoadingRepositories && ( - - Loading Repositories.... - +
+ +
)} No repositories found. @@ -316,13 +324,15 @@ export const SaveGithubProvider = ({ applicationId }: Props) => { !field.value && "text-muted-foreground", )} > - {status === "loading" && fetchStatus === "fetching" - ? "Loading...." - : field.value - ? branches?.find( - (branch) => branch.name === field.value, - )?.name - : "Select branch"} + {status === "loading" && fetchStatus === "fetching" ? ( + + ) : field.value ? ( + branches?.find( + (branch) => branch.name === field.value, + )?.name + ) : ( + "Select branch" + )} @@ -334,9 +344,13 @@ export const SaveGithubProvider = ({ applicationId }: Props) => { className="h-9" /> {status === "loading" && fetchStatus === "fetching" && ( - - Loading Branches.... - +
+ +
)} {!repository?.owner && ( diff --git a/apps/dokploy/components/dashboard/application/general/generic/save-gitlab-provider.tsx b/apps/dokploy/components/dashboard/application/general/generic/save-gitlab-provider.tsx index 6197fc49ff..80193a7aab 100644 --- a/apps/dokploy/components/dashboard/application/general/generic/save-gitlab-provider.tsx +++ b/apps/dokploy/components/dashboard/application/general/generic/save-gitlab-provider.tsx @@ -7,8 +7,10 @@ import { toast } from "sonner"; import { z } from "zod"; import { GitlabIcon } from "@/components/icons/data-tools-icons"; import { AlertBlock } from "@/components/shared/alert-block"; +import { ListSkeleton } from "@/components/shared/list-skeleton"; import { Badge } from "@/components/ui/badge"; import { Button } from "@/components/ui/button"; +import { Skeleton } from "@/components/ui/skeleton"; import { Command, CommandEmpty, @@ -254,13 +256,15 @@ export const SaveGitlabProvider = ({ applicationId }: Props) => { !field.value && "text-muted-foreground", )} > - {isLoadingRepositories - ? "Loading...." - : field.value.owner - ? repositories?.find( - (repo) => repo.name === field.value.repo, - )?.name - : "Select repository"} + {isLoadingRepositories ? ( + + ) : field.value.owner ? ( + repositories?.find( + (repo) => repo.name === field.value.repo, + )?.name + ) : ( + "Select repository" + )} @@ -273,9 +277,13 @@ export const SaveGitlabProvider = ({ applicationId }: Props) => { className="h-9" /> {isLoadingRepositories && ( - - Loading Repositories.... - +
+ +
)} No repositories found. @@ -347,13 +355,15 @@ export const SaveGitlabProvider = ({ applicationId }: Props) => { !field.value && "text-muted-foreground", )} > - {status === "loading" && fetchStatus === "fetching" - ? "Loading...." - : field.value - ? branches?.find( - (branch) => branch.name === field.value, - )?.name - : "Select branch"} + {status === "loading" && fetchStatus === "fetching" ? ( + + ) : field.value ? ( + branches?.find( + (branch) => branch.name === field.value, + )?.name + ) : ( + "Select branch" + )} @@ -365,9 +375,13 @@ export const SaveGitlabProvider = ({ applicationId }: Props) => { className="h-9" /> {status === "loading" && fetchStatus === "fetching" && ( - - Loading Branches.... - +
+ +
)} {!repository?.owner && ( diff --git a/apps/dokploy/components/dashboard/application/general/generic/show.tsx b/apps/dokploy/components/dashboard/application/general/generic/show.tsx index a60db800c9..1398936711 100644 --- a/apps/dokploy/components/dashboard/application/general/generic/show.tsx +++ b/apps/dokploy/components/dashboard/application/general/generic/show.tsx @@ -1,4 +1,4 @@ -import { GitBranch, Loader2, UploadCloud } from "lucide-react"; +import { GitBranch, UploadCloud } from "lucide-react"; import Link from "next/link"; import { useState } from "react"; import { toast } from "sonner"; @@ -14,6 +14,7 @@ import { GitIcon, GitlabIcon, } from "@/components/icons/data-tools-icons"; +import { ListSkeleton } from "@/components/shared/list-skeleton"; import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"; import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs"; import { api } from "@/utils/api"; @@ -87,12 +88,11 @@ export const ShowProviderForm = ({ applicationId }: Props) => { -
-
- - Loading providers... -
-
+
); diff --git a/apps/dokploy/components/dashboard/application/logs/show.tsx b/apps/dokploy/components/dashboard/application/logs/show.tsx index e5dff075ee..9ac30fb24b 100644 --- a/apps/dokploy/components/dashboard/application/logs/show.tsx +++ b/apps/dokploy/components/dashboard/application/logs/show.tsx @@ -1,4 +1,4 @@ -import { Loader2 } from "lucide-react"; +import { Skeleton } from "@/components/ui/skeleton"; import dynamic from "next/dynamic"; import { useEffect, useState } from "react"; import { Badge } from "@/components/ui/badge"; @@ -121,9 +121,8 @@ export const ShowDockerLogs = ({ appName, serverId }: Props) => { {isLoading ? ( -
- Loading... - +
+
) : ( diff --git a/apps/dokploy/components/dashboard/compose/logs/show.tsx b/apps/dokploy/components/dashboard/compose/logs/show.tsx index a4551f4156..765c2ebd7a 100644 --- a/apps/dokploy/components/dashboard/compose/logs/show.tsx +++ b/apps/dokploy/components/dashboard/compose/logs/show.tsx @@ -1,4 +1,3 @@ -import { Loader2 } from "lucide-react"; import dynamic from "next/dynamic"; import { useEffect, useState } from "react"; import { badgeStateColor } from "@/components/dashboard/application/logs/show"; @@ -20,6 +19,7 @@ import { SelectTrigger, SelectValue, } from "@/components/ui/select"; +import { Skeleton } from "@/components/ui/skeleton"; import { api } from "@/utils/api"; export const DockerLogs = dynamic( () => @@ -74,9 +74,8 @@ export const ShowDockerLogsCompose = ({ {isLoading ? ( -
- Loading... - +
+
) : ( diff --git a/apps/dokploy/components/dashboard/settings/web-server/show-modal-logs.tsx b/apps/dokploy/components/dashboard/settings/web-server/show-modal-logs.tsx index 9aac258200..ca2763f968 100644 --- a/apps/dokploy/components/dashboard/settings/web-server/show-modal-logs.tsx +++ b/apps/dokploy/components/dashboard/settings/web-server/show-modal-logs.tsx @@ -1,4 +1,4 @@ -import { Loader2 } from "lucide-react"; +import { Skeleton } from "@/components/ui/skeleton"; import dynamic from "next/dynamic"; import type React from "react"; import { useEffect, useState } from "react"; @@ -77,9 +77,8 @@ export const ShowModalLogs = ({