{log.RequestMethod}{" "}
+
+ {log.RequestAddr}
+
{log.RequestPath.length > 100
? `${log.RequestPath.slice(0, 82)}...`
: log.RequestPath}
diff --git a/apps/dokploy/components/dashboard/settings/appearance-form.tsx b/apps/dokploy/components/dashboard/settings/appearance-form.tsx
index f4311923..d5b90182 100644
--- a/apps/dokploy/components/dashboard/settings/appearance-form.tsx
+++ b/apps/dokploy/components/dashboard/settings/appearance-form.tsx
@@ -27,6 +27,7 @@ import {
SelectTrigger,
SelectValue,
} from "@/components/ui/select";
+import { Languages } from "@/lib/languages";
import useLocale from "@/utils/hooks/use-locale";
import { useTranslation } from "next-i18next";
import { useTheme } from "next-themes";
@@ -37,12 +38,9 @@ const appearanceFormSchema = z.object({
theme: z.enum(["light", "dark", "system"], {
required_error: "Please select a theme.",
}),
- language: z.enum(
- ["en", "pl", "ru", "fr", "de", "tr", "zh-Hant", "zh-Hans", "fa"],
- {
- required_error: "Please select a language.",
- },
- ),
+ language: z.nativeEnum(Languages, {
+ required_error: "Please select a language.",
+ }),
});
type AppearanceFormValues = z.infer
;
@@ -50,7 +48,7 @@ type AppearanceFormValues = z.infer;
// This can come from your database or API.
const defaultValues: Partial = {
theme: "system",
- language: "en",
+ language: Languages.English,
};
export function AppearanceForm() {
@@ -175,24 +173,15 @@ export function AppearanceForm() {
- {[
- { label: "English", value: "en" },
- { label: "Polski", value: "pl" },
- { label: "Русский", value: "ru" },
- { label: "Français", value: "fr" },
- { label: "Deutsch", value: "de" },
- { label: "繁體中文", value: "zh-Hant" },
- { label: "简体中文", value: "zh-Hans" },
- { label: "Türkçe", value: "tr" },
- {
- label: "Persian",
- value: "fa",
- },
- ].map((preset) => (
-
- {preset.label}
-
- ))}
+ {Object.keys(Languages).map((preset) => {
+ const value =
+ Languages[preset as keyof typeof Languages];
+ return (
+
+ {preset}
+
+ );
+ })}
diff --git a/apps/dokploy/components/dashboard/settings/notifications/add-notification.tsx b/apps/dokploy/components/dashboard/settings/notifications/add-notification.tsx
index 77621bec..74a933a6 100644
--- a/apps/dokploy/components/dashboard/settings/notifications/add-notification.tsx
+++ b/apps/dokploy/components/dashboard/settings/notifications/add-notification.tsx
@@ -667,7 +667,7 @@ export const AddNotification = () => {
Dokploy Restart
- Trigger the action when a dokploy is restarted.
+ Trigger the action when dokploy is restarted.
diff --git a/apps/dokploy/components/dashboard/settings/web-server/docker-terminal-modal.tsx b/apps/dokploy/components/dashboard/settings/web-server/docker-terminal-modal.tsx
index f38ecf12..f81be0ad 100644
--- a/apps/dokploy/components/dashboard/settings/web-server/docker-terminal-modal.tsx
+++ b/apps/dokploy/components/dashboard/settings/web-server/docker-terminal-modal.tsx
@@ -1,7 +1,9 @@
+import { Button } from "@/components/ui/button";
import {
Dialog,
DialogContent,
DialogDescription,
+ DialogFooter,
DialogHeader,
DialogTitle,
DialogTrigger,
@@ -49,14 +51,34 @@ export const DockerTerminalModal = ({ children, appName, serverId }: Props) => {
},
);
const [containerId, setContainerId] = useState();
+ const [mainDialogOpen, setMainDialogOpen] = useState(false);
+ const [confirmDialogOpen, setConfirmDialogOpen] = useState(false);
+
+ const handleMainDialogOpenChange = (open: boolean) => {
+ if (!open) {
+ setConfirmDialogOpen(true);
+ } else {
+ setMainDialogOpen(true);
+ }
+ };
+
+ const handleConfirm = () => {
+ setConfirmDialogOpen(false);
+ setMainDialogOpen(false);
+ };
+
+ const handleCancel = () => {
+ setConfirmDialogOpen(false);
+ };
useEffect(() => {
if (data && data?.length > 0) {
setContainerId(data[0]?.containerId);
}
}, [data]);
+
return (
-