Compare commits

..

3 Commits

Author SHA1 Message Date
Mauricio Siu
159584c5df refactor: update 2024-12-25 01:44:16 -06:00
Mauricio Siu
bffd8c3e9c refactor: test 2024-12-25 01:32:33 -06:00
Mauricio Siu
5e7486859f refactor: update 2024-12-25 01:32:07 -06:00
258 changed files with 1331 additions and 6972 deletions

View File

@@ -99,14 +99,14 @@ workflows:
only: only:
- main - main
- canary - canary
- fix/nixpacks-version - 804-services-deployed-via-dokploy-inaccessible-after-customizing-traefik-ports-via-environment-variables
- build-arm64: - build-arm64:
filters: filters:
branches: branches:
only: only:
- main - main
- canary - canary
- fix/nixpacks-version - 804-services-deployed-via-dokploy-inaccessible-after-customizing-traefik-ports-via-environment-variables
- combine-manifests: - combine-manifests:
requires: requires:
- build-amd64 - build-amd64
@@ -116,4 +116,4 @@ workflows:
only: only:
- main - main
- canary - canary
- fix/nixpacks-version - 804-services-deployed-via-dokploy-inaccessible-after-customizing-traefik-ports-via-environment-variables

View File

@@ -259,7 +259,7 @@ export const AddSwarmSettings = ({ applicationId }: Props) => {
refetch(); refetch();
}) })
.catch(() => { .catch(() => {
toast.error("Error updating the swarm settings"); toast.error("Error to update the swarm settings");
}); });
}; };
return ( return (

View File

@@ -94,7 +94,7 @@ export const ShowClusterSettings = ({ applicationId }: Props) => {
}); });
}) })
.catch(() => { .catch(() => {
toast.error("Error updating the command"); toast.error("Error to update the command");
}); });
}; };

View File

@@ -71,7 +71,7 @@ export const AddCommand = ({ applicationId }: Props) => {
}); });
}) })
.catch(() => { .catch(() => {
toast.error("Error updating the command"); toast.error("Error to update the command");
}); });
}; };

View File

@@ -86,7 +86,7 @@ export const AddPort = ({
setIsOpen(false); setIsOpen(false);
}) })
.catch(() => { .catch(() => {
toast.error("Error creating the port"); toast.error("Error to create the port");
}); });
}; };

View File

@@ -47,10 +47,10 @@ export const DeletePort = ({ portId }: Props) => {
applicationId: data?.applicationId, applicationId: data?.applicationId,
}); });
toast.success("Port delete successfully"); toast.success("Port delete succesfully");
}) })
.catch(() => { .catch(() => {
toast.error("Error deleting the port"); toast.error("Error to delete the port");
}); });
}} }}
> >

View File

@@ -93,7 +93,7 @@ export const UpdatePort = ({ portId }: Props) => {
setIsOpen(false); setIsOpen(false);
}) })
.catch(() => { .catch(() => {
toast.error("Error updating the port"); toast.error("Error to update the port");
}); });
}; };

View File

@@ -124,7 +124,7 @@ export const AddRedirect = ({
onDialogToggle(false); onDialogToggle(false);
}) })
.catch(() => { .catch(() => {
toast.error("Error creating the redirect"); toast.error("Error to create the redirect");
}); });
}; };

View File

@@ -50,10 +50,10 @@ export const DeleteRedirect = ({ redirectId }: Props) => {
utils.application.readTraefikConfig.invalidate({ utils.application.readTraefikConfig.invalidate({
applicationId: data?.applicationId, applicationId: data?.applicationId,
}); });
toast.success("Redirect delete successfully"); toast.success("Redirect delete succesfully");
}) })
.catch(() => { .catch(() => {
toast.error("Error deleting the redirect"); toast.error("Error to delete the redirect");
}); });
}} }}
> >

View File

@@ -88,7 +88,7 @@ export const UpdateRedirect = ({ redirectId }: Props) => {
setIsOpen(false); setIsOpen(false);
}) })
.catch(() => { .catch(() => {
toast.error("Error updating the redirect"); toast.error("Error to update the redirect");
}); });
}; };

View File

@@ -75,7 +75,7 @@ export const AddSecurity = ({
setIsOpen(false); setIsOpen(false);
}) })
.catch(() => { .catch(() => {
toast.error("Error creating security"); toast.error("Error to create the security");
}); });
}; };

View File

@@ -50,10 +50,10 @@ export const DeleteSecurity = ({ securityId }: Props) => {
utils.application.readTraefikConfig.invalidate({ utils.application.readTraefikConfig.invalidate({
applicationId: data?.applicationId, applicationId: data?.applicationId,
}); });
toast.success("Security delete successfully"); toast.success("Security delete succesfully");
}) })
.catch(() => { .catch(() => {
toast.error("Error deleting the security"); toast.error("Error to delete the security");
}); });
}} }}
> >

View File

@@ -83,7 +83,7 @@ export const UpdateSecurity = ({ securityId }: Props) => {
setIsOpen(false); setIsOpen(false);
}) })
.catch(() => { .catch(() => {
toast.error("Error updating the security"); toast.error("Error to update the security");
}); });
}; };

View File

@@ -22,13 +22,6 @@ import React, { useEffect } from "react";
import { useForm } from "react-hook-form"; import { useForm } from "react-hook-form";
import { toast } from "sonner"; import { toast } from "sonner";
import { z } from "zod"; import { z } from "zod";
import {
Tooltip,
TooltipContent,
TooltipProvider,
TooltipTrigger,
} from "@/components/ui/tooltip";
import { InfoIcon } from "lucide-react";
const addResourcesApplication = z.object({ const addResourcesApplication = z.object({
memoryReservation: z.number().nullable().optional(), memoryReservation: z.number().nullable().optional(),
@@ -79,7 +72,7 @@ export const ShowApplicationResources = ({ applicationId }: Props) => {
await refetch(); await refetch();
}) })
.catch(() => { .catch(() => {
toast.error("Error updating the resources"); toast.error("Error to Update the resources");
}); });
}; };
return ( return (
@@ -108,25 +101,10 @@ export const ShowApplicationResources = ({ applicationId }: Props) => {
name="memoryReservation" name="memoryReservation"
render={({ field }) => ( render={({ field }) => (
<FormItem> <FormItem>
<div className="flex items-center gap-2">
<FormLabel>Memory Reservation</FormLabel> <FormLabel>Memory Reservation</FormLabel>
<TooltipProvider>
<Tooltip delayDuration={0}>
<TooltipTrigger>
<InfoIcon className="h-4 w-4 text-muted-foreground" />
</TooltipTrigger>
<TooltipContent>
<p>
Memory soft limit in bytes. Example: 256MB =
268435456 bytes
</p>
</TooltipContent>
</Tooltip>
</TooltipProvider>
</div>
<FormControl> <FormControl>
<Input <Input
placeholder="268435456 (256MB in bytes)" placeholder="256 MB"
{...field} {...field}
value={field.value?.toString() || ""} value={field.value?.toString() || ""}
onChange={(e) => { onChange={(e) => {
@@ -142,6 +120,7 @@ export const ShowApplicationResources = ({ applicationId }: Props) => {
}} }}
/> />
</FormControl> </FormControl>
<FormMessage /> <FormMessage />
</FormItem> </FormItem>
)} )}
@@ -153,25 +132,10 @@ export const ShowApplicationResources = ({ applicationId }: Props) => {
render={({ field }) => { render={({ field }) => {
return ( return (
<FormItem> <FormItem>
<div className="flex items-center gap-2">
<FormLabel>Memory Limit</FormLabel> <FormLabel>Memory Limit</FormLabel>
<TooltipProvider>
<Tooltip delayDuration={0}>
<TooltipTrigger>
<InfoIcon className="h-4 w-4 text-muted-foreground" />
</TooltipTrigger>
<TooltipContent>
<p>
Memory hard limit in bytes. Example: 1GB =
1073741824 bytes
</p>
</TooltipContent>
</Tooltip>
</TooltipProvider>
</div>
<FormControl> <FormControl>
<Input <Input
placeholder="1073741824 (1GB in bytes)" placeholder={"1024 MB"}
{...field} {...field}
value={field.value?.toString() || ""} value={field.value?.toString() || ""}
onChange={(e) => { onChange={(e) => {
@@ -199,36 +163,21 @@ export const ShowApplicationResources = ({ applicationId }: Props) => {
render={({ field }) => { render={({ field }) => {
return ( return (
<FormItem> <FormItem>
<div className="flex items-center gap-2"> <FormLabel>Cpu Limit</FormLabel>
<FormLabel>CPU Limit</FormLabel>
<TooltipProvider>
<Tooltip delayDuration={0}>
<TooltipTrigger>
<InfoIcon className="h-4 w-4 text-muted-foreground" />
</TooltipTrigger>
<TooltipContent>
<p>
CPU quota in units of 10^-9 CPUs. Example: 2
CPUs = 2000000000
</p>
</TooltipContent>
</Tooltip>
</TooltipProvider>
</div>
<FormControl> <FormControl>
<Input <Input
placeholder="2000000000 (2 CPUs)" placeholder={"2"}
{...field} {...field}
type="number"
value={field.value?.toString() || ""} value={field.value?.toString() || ""}
onChange={(e) => { onChange={(e) => {
const value = e.target.value; const value = e.target.value;
if (value === "") { if (
field.onChange(null); value === "" ||
} else { /^[0-9]*\.?[0-9]*$/.test(value)
const number = Number.parseInt(value, 10); ) {
if (!Number.isNaN(number)) { const float = Number.parseFloat(value);
field.onChange(number); field.onChange(float);
}
} }
}} }}
/> />
@@ -244,36 +193,21 @@ export const ShowApplicationResources = ({ applicationId }: Props) => {
render={({ field }) => { render={({ field }) => {
return ( return (
<FormItem> <FormItem>
<div className="flex items-center gap-2"> <FormLabel>Cpu Reservation</FormLabel>
<FormLabel>CPU Reservation</FormLabel>
<TooltipProvider>
<Tooltip delayDuration={0}>
<TooltipTrigger>
<InfoIcon className="h-4 w-4 text-muted-foreground" />
</TooltipTrigger>
<TooltipContent>
<p>
CPU shares (relative weight). Example: 1 CPU =
1000000000
</p>
</TooltipContent>
</Tooltip>
</TooltipProvider>
</div>
<FormControl> <FormControl>
<Input <Input
placeholder="1000000000 (1 CPU)" placeholder={"1"}
{...field} {...field}
type="number"
value={field.value?.toString() || ""} value={field.value?.toString() || ""}
onChange={(e) => { onChange={(e) => {
const value = e.target.value; const value = e.target.value;
if (value === "") { if (
field.onChange(null); value === "" ||
} else { /^[0-9]*\.?[0-9]*$/.test(value)
const number = Number.parseInt(value, 10); ) {
if (!Number.isNaN(number)) { const float = Number.parseFloat(value);
field.onChange(number); field.onChange(float);
}
} }
}} }}
/> />

View File

@@ -105,7 +105,7 @@ export const UpdateTraefikConfig = ({ applicationId }: Props) => {
form.reset(); form.reset();
}) })
.catch(() => { .catch(() => {
toast.error("Error updating the Traefik config"); toast.error("Error to update the traefik config");
}); });
}; };

View File

@@ -107,7 +107,7 @@ export const AddVolumes = ({
setIsOpen(false); setIsOpen(false);
}) })
.catch(() => { .catch(() => {
toast.error("Error creating the Bind mount"); toast.error("Error to create the Bind mount");
}); });
} else if (data.type === "volume") { } else if (data.type === "volume") {
await mutateAsync({ await mutateAsync({
@@ -122,7 +122,7 @@ export const AddVolumes = ({
setIsOpen(false); setIsOpen(false);
}) })
.catch(() => { .catch(() => {
toast.error("Error creating the Volume mount"); toast.error("Error to create the Volume mount");
}); });
} else if (data.type === "file") { } else if (data.type === "file") {
await mutateAsync({ await mutateAsync({
@@ -138,7 +138,7 @@ export const AddVolumes = ({
setIsOpen(false); setIsOpen(false);
}) })
.catch(() => { .catch(() => {
toast.error("Error creating the File mount"); toast.error("Error to create the File mount");
}); });
} }

View File

@@ -45,10 +45,10 @@ export const DeleteVolume = ({ mountId, refetch }: Props) => {
}) })
.then(() => { .then(() => {
refetch(); refetch();
toast.success("Mount deleted successfully"); toast.success("Mount deleted succesfully");
}) })
.catch(() => { .catch(() => {
toast.error("Error deleting the mount"); toast.error("Error to delete the mount");
}); });
}} }}
> >

View File

@@ -139,7 +139,7 @@ export const UpdateVolume = ({
setIsOpen(false); setIsOpen(false);
}) })
.catch(() => { .catch(() => {
toast.error("Error updating the Bind mount"); toast.error("Error to update the Bind mount");
}); });
} else if (data.type === "volume") { } else if (data.type === "volume") {
await mutateAsync({ await mutateAsync({
@@ -153,7 +153,7 @@ export const UpdateVolume = ({
setIsOpen(false); setIsOpen(false);
}) })
.catch(() => { .catch(() => {
toast.error("Error updating the Volume mount"); toast.error("Error to update the Volume mount");
}); });
} else if (data.type === "file") { } else if (data.type === "file") {
await mutateAsync({ await mutateAsync({
@@ -168,7 +168,7 @@ export const UpdateVolume = ({
setIsOpen(false); setIsOpen(false);
}) })
.catch(() => { .catch(() => {
toast.error("Error updating the File mount"); toast.error("Error to update the File mount");
}); });
} }
refetch(); refetch();

View File

@@ -126,7 +126,7 @@ export const ShowBuildChooseForm = ({ applicationId }: Props) => {
await refetch(); await refetch();
}) })
.catch(() => { .catch(() => {
toast.error("Error saving the build type"); toast.error("Error to save the build type");
}); });
}; };

View File

@@ -47,7 +47,7 @@ export const RefreshToken = ({ applicationId }: Props) => {
toast.success("Refresh updated"); toast.success("Refresh updated");
}) })
.catch(() => { .catch(() => {
toast.error("Error updating the refresh token"); toast.error("Error to update the refresh token");
}); });
}} }}
> >

View File

@@ -105,8 +105,8 @@ export const AddDomain = ({
const dictionary = { const dictionary = {
success: domainId ? "Domain Updated" : "Domain Created", success: domainId ? "Domain Updated" : "Domain Created",
error: domainId error: domainId
? "Error updating the domain" ? "Error to update the domain"
: "Error creating the domain", : "Error to create the domain",
submit: domainId ? "Update" : "Create", submit: domainId ? "Update" : "Create",
dialogDescription: domainId dialogDescription: domainId
? "In this section you can edit a domain" ? "In this section you can edit a domain"

View File

@@ -57,10 +57,10 @@ export const DeleteDomain = ({ domainId }: Props) => {
}); });
} }
toast.success("Domain delete successfully"); toast.success("Domain delete succesfully");
}) })
.catch(() => { .catch(() => {
toast.error("Error deleting the Domain"); toast.error("Error to delete Domain");
}); });
}} }}
> >

View File

@@ -51,7 +51,7 @@ export const ShowEnvironment = ({ applicationId }: Props) => {
await refetch(); await refetch();
}) })
.catch(() => { .catch(() => {
toast.error("Error adding environment"); toast.error("Error to add environment");
}); });
}; };

View File

@@ -51,7 +51,7 @@ export const DeployApplication = ({ applicationId }: Props) => {
applicationId, applicationId,
}) })
.then(async () => { .then(async () => {
toast.success("Application deployed successfully"); toast.success("Application deployed succesfully");
await refetch(); await refetch();
router.push( router.push(
`/dashboard/project/${data?.projectId}/services/application/${applicationId}?tab=deployments`, `/dashboard/project/${data?.projectId}/services/application/${applicationId}?tab=deployments`,
@@ -59,7 +59,7 @@ export const DeployApplication = ({ applicationId }: Props) => {
}) })
.catch(() => { .catch(() => {
toast.error("Error deploying the Application"); toast.error("Error to deploy Application");
}); });
await refetch(); await refetch();

View File

@@ -137,7 +137,7 @@ export const SaveBitbucketProvider = ({ applicationId }: Props) => {
await refetch(); await refetch();
}) })
.catch(() => { .catch(() => {
toast.error("Error saving the Bitbucket provider"); toast.error("Error to save the Bitbucket provider");
}); });
}; };

View File

@@ -68,7 +68,7 @@ export const SaveDockerProvider = ({ applicationId }: Props) => {
await refetch(); await refetch();
}) })
.catch(() => { .catch(() => {
toast.error("Error saving the Docker provider"); toast.error("Error to save the Docker provider");
}); });
}; };

View File

@@ -56,7 +56,7 @@ export const SaveDragNDrop = ({ applicationId }: Props) => {
await refetch(); await refetch();
}) })
.catch(() => { .catch(() => {
toast.error("Error saving the deployment"); toast.error("Error to save the deployment");
}); });
}; };

View File

@@ -84,7 +84,7 @@ export const SaveGitProvider = ({ applicationId }: Props) => {
await refetch(); await refetch();
}) })
.catch(() => { .catch(() => {
toast.error("Error saving the Git provider"); toast.error("Error to save the Git provider");
}); });
}; };

View File

@@ -131,7 +131,7 @@ export const SaveGithubProvider = ({ applicationId }: Props) => {
await refetch(); await refetch();
}) })
.catch(() => { .catch(() => {
toast.error("Error saving the github provider"); toast.error("Error to save the github provider");
}); });
}; };

View File

@@ -144,7 +144,7 @@ export const SaveGitlabProvider = ({ applicationId }: Props) => {
await refetch(); await refetch();
}) })
.catch(() => { .catch(() => {
toast.error("Error saving the gitlab provider"); toast.error("Error to save the gitlab provider");
}); });
}; };

View File

@@ -56,7 +56,7 @@ export const ResetApplication = ({ applicationId, appName }: Props) => {
toast.success("Service Reloaded"); toast.success("Service Reloaded");
}) })
.catch(() => { .catch(() => {
toast.error("Error reloading the service"); toast.error("Error to reload the service");
}); });
await refetch(); await refetch();
}} }}

View File

@@ -69,7 +69,7 @@ export const ShowGeneralApplication = ({ applicationId }: Props) => {
await refetch(); await refetch();
}) })
.catch(() => { .catch(() => {
toast.error("Error updating Auto Deploy"); toast.error("Error to update Auto Deploy");
}); });
}} }}
className="flex flex-row gap-2 items-center" className="flex flex-row gap-2 items-center"

View File

@@ -1,4 +1,3 @@
import { Badge } from "@/components/ui/badge";
import { import {
Card, Card,
CardContent, CardContent,
@@ -16,7 +15,6 @@ import {
SelectTrigger, SelectTrigger,
SelectValue, SelectValue,
} from "@/components/ui/select"; } from "@/components/ui/select";
import { Switch } from "@/components/ui/switch";
import { api } from "@/utils/api"; import { api } from "@/utils/api";
import { Loader2 } from "lucide-react"; import { Loader2 } from "lucide-react";
import dynamic from "next/dynamic"; import dynamic from "next/dynamic";
@@ -31,67 +29,28 @@ export const DockerLogs = dynamic(
}, },
); );
export const badgeStateColor = (state: string) => {
switch (state) {
case "running":
return "green";
case "exited":
case "shutdown":
return "red";
case "accepted":
case "created":
return "blue";
default:
return "default";
}
};
interface Props { interface Props {
appName: string; appName: string;
serverId?: string; serverId?: string;
} }
export const ShowDockerLogs = ({ appName, serverId }: Props) => { export const ShowDockerLogs = ({ appName, serverId }: Props) => {
const { data, isLoading } = api.docker.getContainersByAppNameMatch.useQuery(
{
appName,
serverId,
},
{
enabled: !!appName,
},
);
const [containerId, setContainerId] = useState<string | undefined>(); const [containerId, setContainerId] = useState<string | undefined>();
const [option, setOption] = useState<"swarm" | "native">("native");
const { data: services, isLoading: servicesLoading } =
api.docker.getServiceContainersByAppName.useQuery(
{
appName,
serverId,
},
{
enabled: !!appName && option === "swarm",
},
);
const { data: containers, isLoading: containersLoading } =
api.docker.getContainersByAppNameMatch.useQuery(
{
appName,
serverId,
},
{
enabled: !!appName && option === "native",
},
);
useEffect(() => { useEffect(() => {
if (option === "native") { if (data && data?.length > 0) {
if (containers && containers?.length > 0) { setContainerId(data[0]?.containerId);
setContainerId(containers[0]?.containerId);
} }
} else { }, [data]);
if (services && services?.length > 0) {
setContainerId(services[0]?.containerId);
}
}
}, [option, services, containers]);
const isLoading = option === "native" ? containersLoading : servicesLoading;
const containersLenght =
option === "native" ? containers?.length : services?.length;
return ( return (
<Card className="bg-background"> <Card className="bg-background">
@@ -103,21 +62,7 @@ export const ShowDockerLogs = ({ appName, serverId }: Props) => {
</CardHeader> </CardHeader>
<CardContent className="flex flex-col gap-4"> <CardContent className="flex flex-col gap-4">
<div className="flex flex-row justify-between items-center gap-2">
<Label>Select a container to view logs</Label> <Label>Select a container to view logs</Label>
<div className="flex flex-row gap-2 items-center">
<span className="text-sm text-muted-foreground">
{option === "native" ? "Native" : "Swarm"}
</span>
<Switch
checked={option === "native"}
onCheckedChange={(checked) => {
setOption(checked ? "native" : "swarm");
}}
/>
</div>
</div>
<Select onValueChange={setContainerId} value={containerId}> <Select onValueChange={setContainerId} value={containerId}>
<SelectTrigger> <SelectTrigger>
{isLoading ? ( {isLoading ? (
@@ -131,45 +76,21 @@ export const ShowDockerLogs = ({ appName, serverId }: Props) => {
</SelectTrigger> </SelectTrigger>
<SelectContent> <SelectContent>
<SelectGroup> <SelectGroup>
{option === "native" ? ( {data?.map((container) => (
<div>
{containers?.map((container) => (
<SelectItem <SelectItem
key={container.containerId} key={container.containerId}
value={container.containerId} value={container.containerId}
> >
{container.name} ({container.containerId}){" "} {container.name} ({container.containerId}) {container.state}
<Badge variant={badgeStateColor(container.state)}>
{container.state}
</Badge>
</SelectItem> </SelectItem>
))} ))}
</div> <SelectLabel>Containers ({data?.length})</SelectLabel>
) : (
<>
{services?.map((container) => (
<SelectItem
key={container.containerId}
value={container.containerId}
>
{container.name} ({container.containerId}@{container.node}
)
<Badge variant={badgeStateColor(container.state)}>
{container.state}
</Badge>
</SelectItem>
))}
</>
)}
<SelectLabel>Containers ({containersLenght})</SelectLabel>
</SelectGroup> </SelectGroup>
</SelectContent> </SelectContent>
</Select> </Select>
<DockerLogs <DockerLogs
serverId={serverId || ""} serverId={serverId || ""}
containerId={containerId || "select-a-container"} containerId={containerId || "select-a-container"}
runType={option}
/> />
</CardContent> </CardContent>
</Card> </Card>

View File

@@ -105,8 +105,8 @@ export const AddPreviewDomain = ({
const dictionary = { const dictionary = {
success: domainId ? "Domain Updated" : "Domain Created", success: domainId ? "Domain Updated" : "Domain Created",
error: domainId error: domainId
? "Error updating the domain" ? "Error to update the domain"
: "Error creating the domain", : "Error to create the domain",
submit: domainId ? "Update" : "Create", submit: domainId ? "Update" : "Create",
dialogDescription: domainId dialogDescription: domainId
? "In this section you can edit a domain" ? "In this section you can edit a domain"

View File

@@ -63,7 +63,7 @@ export const RedbuildApplication = ({ applicationId }: Props) => {
}); });
}) })
.catch(() => { .catch(() => {
toast.error("Error rebuilding the application"); toast.error("Error to rebuild the application");
}); });
}} }}
> >

View File

@@ -49,10 +49,10 @@ export const StartApplication = ({ applicationId }: Props) => {
await utils.application.one.invalidate({ await utils.application.one.invalidate({
applicationId, applicationId,
}); });
toast.success("Application started successfully"); toast.success("Application started succesfully");
}) })
.catch(() => { .catch(() => {
toast.error("Error starting the Application"); toast.error("Error to start the Application");
}); });
}} }}
> >

View File

@@ -49,10 +49,10 @@ export const StopApplication = ({ applicationId }: Props) => {
await utils.application.one.invalidate({ await utils.application.one.invalidate({
applicationId, applicationId,
}); });
toast.success("Application stopped successfully"); toast.success("Application stopped succesfully");
}) })
.catch(() => { .catch(() => {
toast.error("Error stopping the Application"); toast.error("Error to stop the Application");
}); });
}} }}
> >

View File

@@ -76,14 +76,14 @@ export const UpdateApplication = ({ applicationId }: Props) => {
description: formData.description || "", description: formData.description || "",
}) })
.then(() => { .then(() => {
toast.success("Application updated successfully"); toast.success("Application updated succesfully");
utils.application.one.invalidate({ utils.application.one.invalidate({
applicationId: applicationId, applicationId: applicationId,
}); });
setIsOpen(false); setIsOpen(false);
}) })
.catch(() => { .catch(() => {
toast.error("Error updating the Application"); toast.error("Error to update the application");
}) })
.finally(() => {}); .finally(() => {});
}; };

View File

@@ -82,7 +82,7 @@ export const AddCommandCompose = ({ composeId }: Props) => {
}); });
}) })
.catch(() => { .catch(() => {
toast.error("Error updating the command"); toast.error("Error to update the command");
}); });
}; };

View File

@@ -47,7 +47,7 @@ export const RefreshTokenCompose = ({ composeId }: Props) => {
toast.success("Refresh Token updated"); toast.success("Refresh Token updated");
}) })
.catch(() => { .catch(() => {
toast.error("Error updating the refresh token"); toast.error("Error to update the refresh token");
}); });
}} }}
> >

View File

@@ -127,8 +127,8 @@ export const AddDomainCompose = ({
const dictionary = { const dictionary = {
success: domainId ? "Domain Updated" : "Domain Created", success: domainId ? "Domain Updated" : "Domain Created",
error: domainId error: domainId
? "Error updating the domain" ? "Error to update the domain"
: "Error creating the domain", : "Error to create the domain",
submit: domainId ? "Update" : "Create", submit: domainId ? "Update" : "Create",
dialogDescription: domainId dialogDescription: domainId
? "In this section you can edit a domain" ? "In this section you can edit a domain"

View File

@@ -70,7 +70,7 @@ export const ShowEnvironmentCompose = ({ composeId }: Props) => {
await refetch(); await refetch();
}) })
.catch(() => { .catch(() => {
toast.error("Error adding environment"); toast.error("Error to add environment");
}); });
}; };

View File

@@ -83,7 +83,7 @@ export const ComposeActions = ({ composeId }: Props) => {
await refetch(); await refetch();
}) })
.catch(() => { .catch(() => {
toast.error("Error updating Auto Deploy"); toast.error("Error to update Auto Deploy");
}); });
}} }}
className="flex flex-row gap-2 items-center" className="flex flex-row gap-2 items-center"

View File

@@ -77,7 +77,7 @@ export const ComposeFileEditor = ({ composeId }: Props) => {
}); });
}) })
.catch((e) => { .catch((e) => {
toast.error("Error updating the Compose config"); toast.error("Error to update the compose config");
}); });
}; };
return ( return (

View File

@@ -57,7 +57,7 @@ export const DeployCompose = ({ composeId }: Props) => {
); );
}) })
.catch(() => { .catch(() => {
toast.error("Error deploying Compose"); toast.error("Error to deploy Compose");
}); });
await refetch(); await refetch();

View File

@@ -139,7 +139,7 @@ export const SaveBitbucketProviderCompose = ({ composeId }: Props) => {
await refetch(); await refetch();
}) })
.catch(() => { .catch(() => {
toast.error("Error saving the Bitbucket provider"); toast.error("Error to save the Bitbucket provider");
}); });
}; };

View File

@@ -83,7 +83,7 @@ export const SaveGitProviderCompose = ({ composeId }: Props) => {
await refetch(); await refetch();
}) })
.catch(() => { .catch(() => {
toast.error("Error saving the Git provider"); toast.error("Error to save the Git provider");
}); });
}; };

View File

@@ -133,7 +133,7 @@ export const SaveGithubProviderCompose = ({ composeId }: Props) => {
await refetch(); await refetch();
}) })
.catch(() => { .catch(() => {
toast.error("Error saving the Github provider"); toast.error("Error to save the github provider");
}); });
}; };

View File

@@ -146,7 +146,7 @@ export const SaveGitlabProviderCompose = ({ composeId }: Props) => {
await refetch(); await refetch();
}) })
.catch(() => { .catch(() => {
toast.error("Error saving the Gitlab provider"); toast.error("Error to save the gitlab provider");
}); });
}; };

View File

@@ -90,7 +90,7 @@ export const RandomizeCompose = ({ composeId }: Props) => {
toast.success("Compose updated"); toast.success("Compose updated");
}) })
.catch(() => { .catch(() => {
toast.error("Error randomizing the compose"); toast.error("Error to randomize the compose");
}); });
}; };
@@ -105,7 +105,7 @@ export const RandomizeCompose = ({ composeId }: Props) => {
toast.success("Compose randomized"); toast.success("Compose randomized");
}) })
.catch(() => { .catch(() => {
toast.error("Error randomizing the compose"); toast.error("Error to randomize the compose");
}); });
}; };

View File

@@ -62,7 +62,7 @@ export const RedbuildCompose = ({ composeId }: Props) => {
}); });
}) })
.catch(() => { .catch(() => {
toast.error("Error rebuilding the compose"); toast.error("Error to rebuild the compose");
}); });
}} }}
> >

View File

@@ -73,7 +73,7 @@ export const ShowConvertedCompose = ({ composeId }: Props) => {
toast.success("Fetched source type"); toast.success("Fetched source type");
}) })
.catch((err) => { .catch((err) => {
toast.error("Error fetching source type", { toast.error("Error to fetch source type", {
description: err.message, description: err.message,
}); });
}); });

View File

@@ -53,10 +53,10 @@ export const StopCompose = ({ composeId }: Props) => {
await utils.compose.one.invalidate({ await utils.compose.one.invalidate({
composeId, composeId,
}); });
toast.success("Compose stopped successfully"); toast.success("Compose stopped succesfully");
}) })
.catch(() => { .catch(() => {
toast.error("Error stopping the compose"); toast.error("Error to stop the compose");
}); });
}} }}
> >

View File

@@ -1,165 +0,0 @@
import { badgeStateColor } from "@/components/dashboard/application/logs/show";
import { Badge } from "@/components/ui/badge";
import {
Card,
CardContent,
CardDescription,
CardHeader,
CardTitle,
} from "@/components/ui/card";
import { Label } from "@/components/ui/label";
import {
Select,
SelectContent,
SelectGroup,
SelectItem,
SelectLabel,
SelectTrigger,
SelectValue,
} from "@/components/ui/select";
import { Switch } from "@/components/ui/switch";
import { api } from "@/utils/api";
import { Loader2 } from "lucide-react";
import dynamic from "next/dynamic";
import { useEffect, useState } from "react";
export const DockerLogs = dynamic(
() =>
import("@/components/dashboard/docker/logs/docker-logs-id").then(
(e) => e.DockerLogsId,
),
{
ssr: false,
},
);
interface Props {
appName: string;
serverId?: string;
}
badgeStateColor;
export const ShowDockerLogsStack = ({ appName, serverId }: Props) => {
const [option, setOption] = useState<"swarm" | "native">("native");
const [containerId, setContainerId] = useState<string | undefined>();
const { data: services, isLoading: servicesLoading } =
api.docker.getStackContainersByAppName.useQuery(
{
appName,
serverId,
},
{
enabled: !!appName && option === "swarm",
},
);
const { data: containers, isLoading: containersLoading } =
api.docker.getContainersByAppNameMatch.useQuery(
{
appName,
appType: "stack",
serverId,
},
{
enabled: !!appName && option === "native",
},
);
useEffect(() => {
if (option === "native") {
if (containers && containers?.length > 0) {
setContainerId(containers[0]?.containerId);
}
} else {
if (services && services?.length > 0) {
setContainerId(services[0]?.containerId);
}
}
}, [option, services, containers]);
const isLoading = option === "native" ? containersLoading : servicesLoading;
const containersLenght =
option === "native" ? containers?.length : services?.length;
return (
<Card className="bg-background">
<CardHeader>
<CardTitle className="text-xl">Logs</CardTitle>
<CardDescription>
Watch the logs of the application in real time
</CardDescription>
</CardHeader>
<CardContent className="flex flex-col gap-4">
<div className="flex flex-row justify-between items-center gap-2">
<Label>Select a container to view logs</Label>
<div className="flex flex-row gap-2 items-center">
<span className="text-sm text-muted-foreground">
{option === "native" ? "Native" : "Swarm"}
</span>
<Switch
checked={option === "native"}
onCheckedChange={(checked) => {
setOption(checked ? "native" : "swarm");
}}
/>
</div>
</div>
<Select onValueChange={setContainerId} value={containerId}>
<SelectTrigger>
{isLoading ? (
<div className="flex flex-row gap-2 items-center justify-center text-sm text-muted-foreground">
<span>Loading...</span>
<Loader2 className="animate-spin size-4" />
</div>
) : (
<SelectValue placeholder="Select a container" />
)}
</SelectTrigger>
<SelectContent>
<SelectGroup>
{option === "native" ? (
<div>
{containers?.map((container) => (
<SelectItem
key={container.containerId}
value={container.containerId}
>
{container.name} ({container.containerId}){" "}
<Badge variant={badgeStateColor(container.state)}>
{container.state}
</Badge>
</SelectItem>
))}
</div>
) : (
<>
{services?.map((container) => (
<SelectItem
key={container.containerId}
value={container.containerId}
>
{container.name} ({container.containerId}@{container.node}
)
<Badge variant={badgeStateColor(container.state)}>
{container.state}
</Badge>
</SelectItem>
))}
</>
)}
<SelectLabel>Containers ({containersLenght})</SelectLabel>
</SelectGroup>
</SelectContent>
</Select>
<DockerLogs
serverId={serverId || ""}
containerId={containerId || "select-a-container"}
runType={option}
/>
</CardContent>
</Card>
);
};

View File

@@ -1,5 +1,3 @@
import { badgeStateColor } from "@/components/dashboard/application/logs/show";
import { Badge } from "@/components/ui/badge";
import { import {
Card, Card,
CardContent, CardContent,
@@ -89,10 +87,7 @@ export const ShowDockerLogsCompose = ({
key={container.containerId} key={container.containerId}
value={container.containerId} value={container.containerId}
> >
{container.name} ({container.containerId}){" "} {container.name} ({container.containerId}) {container.state}
<Badge variant={badgeStateColor(container.state)}>
{container.state}
</Badge>
</SelectItem> </SelectItem>
))} ))}
<SelectLabel>Containers ({data?.length})</SelectLabel> <SelectLabel>Containers ({data?.length})</SelectLabel>
@@ -102,7 +97,6 @@ export const ShowDockerLogsCompose = ({
<DockerLogs <DockerLogs
serverId={serverId || ""} serverId={serverId || ""}
containerId={containerId || "select-a-container"} containerId={containerId || "select-a-container"}
runType="native"
/> />
</CardContent> </CardContent>
</Card> </Card>

View File

@@ -49,10 +49,10 @@ export const StartCompose = ({ composeId }: Props) => {
await utils.compose.one.invalidate({ await utils.compose.one.invalidate({
composeId, composeId,
}); });
toast.success("Compose started successfully"); toast.success("Compose started succesfully");
}) })
.catch(() => { .catch(() => {
toast.error("Error starting the Compose"); toast.error("Error to start the Compose");
}); });
}} }}
> >

View File

@@ -49,10 +49,10 @@ export const StopCompose = ({ composeId }: Props) => {
await utils.compose.one.invalidate({ await utils.compose.one.invalidate({
composeId, composeId,
}); });
toast.success("Compose stopped successfully"); toast.success("Compose stopped succesfully");
}) })
.catch(() => { .catch(() => {
toast.error("Error stopping the Compose"); toast.error("Error to stop the Compose");
}); });
}} }}
> >

View File

@@ -76,14 +76,14 @@ export const UpdateCompose = ({ composeId }: Props) => {
description: formData.description || "", description: formData.description || "",
}) })
.then(() => { .then(() => {
toast.success("Compose updated successfully"); toast.success("Compose updated succesfully");
utils.compose.one.invalidate({ utils.compose.one.invalidate({
composeId: composeId, composeId: composeId,
}); });
setIsOpen(false); setIsOpen(false);
}) })
.catch(() => { .catch(() => {
toast.error("Error updating the Compose"); toast.error("Error to update the Compose");
}) })
.finally(() => {}); .finally(() => {});
}; };

View File

@@ -125,7 +125,7 @@ export const AddBackup = ({ databaseId, databaseType, refetch }: Props) => {
refetch(); refetch();
}) })
.catch(() => { .catch(() => {
toast.error("Error creating a backup"); toast.error("Error to create a backup");
}); });
}; };
return ( return (

View File

@@ -46,10 +46,10 @@ export const DeleteBackup = ({ backupId, refetch }: Props) => {
.then(() => { .then(() => {
refetch(); refetch();
toast.success("Backup deleted successfully"); toast.success("Backup delete succesfully");
}) })
.catch(() => { .catch(() => {
toast.error("Error deleting the backup"); toast.error("Error to delete the backup");
}); });
}} }}
> >

View File

@@ -109,7 +109,7 @@ export const UpdateBackup = ({ backupId, refetch }: Props) => {
setIsOpen(false); setIsOpen(false);
}) })
.catch(() => { .catch(() => {
toast.error("Error updating the Backup"); toast.error("Error to update the backup");
}); });
}; };

View File

@@ -12,7 +12,6 @@ import { type LogLine, getLogType, parseLogs } from "./utils";
interface Props { interface Props {
containerId: string; containerId: string;
serverId?: string | null; serverId?: string | null;
runType: "swarm" | "native";
} }
export const priorities = [ export const priorities = [
@@ -38,11 +37,7 @@ export const priorities = [
}, },
]; ];
export const DockerLogsId: React.FC<Props> = ({ export const DockerLogsId: React.FC<Props> = ({ containerId, serverId }) => {
containerId,
serverId,
runType,
}) => {
const { data } = api.docker.getConfig.useQuery( const { data } = api.docker.getConfig.useQuery(
{ {
containerId, containerId,
@@ -109,7 +104,6 @@ export const DockerLogsId: React.FC<Props> = ({
tail: lines.toString(), tail: lines.toString(),
since, since,
search, search,
runType,
}); });
if (serverId) { if (serverId) {

View File

@@ -46,11 +46,7 @@ export const ShowDockerModalLogs = ({
<DialogDescription>View the logs for {containerId}</DialogDescription> <DialogDescription>View the logs for {containerId}</DialogDescription>
</DialogHeader> </DialogHeader>
<div className="flex flex-col gap-4 pt-2.5"> <div className="flex flex-col gap-4 pt-2.5">
<DockerLogsId <DockerLogsId containerId={containerId || ""} serverId={serverId} />
containerId={containerId || ""}
serverId={serverId}
runType="native"
/>
</div> </div>
</DialogContent> </DialogContent>
</Dialog> </Dialog>

View File

@@ -1,58 +0,0 @@
import {
Dialog,
DialogContent,
DialogDescription,
DialogHeader,
DialogTitle,
DialogTrigger,
} from "@/components/ui/dialog";
import { DropdownMenuItem } from "@/components/ui/dropdown-menu";
import dynamic from "next/dynamic";
import type React from "react";
export const DockerLogsId = dynamic(
() =>
import("@/components/dashboard/docker/logs/docker-logs-id").then(
(e) => e.DockerLogsId,
),
{
ssr: false,
},
);
interface Props {
containerId: string;
children?: React.ReactNode;
serverId?: string | null;
}
export const ShowDockerModalStackLogs = ({
containerId,
children,
serverId,
}: Props) => {
return (
<Dialog>
<DialogTrigger asChild>
<DropdownMenuItem
className="w-full cursor-pointer space-x-3"
onSelect={(e) => e.preventDefault()}
>
{children}
</DropdownMenuItem>
</DialogTrigger>
<DialogContent className="max-h-screen overflow-y-auto sm:max-w-7xl">
<DialogHeader>
<DialogTitle>View Logs</DialogTitle>
<DialogDescription>View the logs for {containerId}</DialogDescription>
</DialogHeader>
<div className="flex flex-col gap-4 pt-2.5">
<DockerLogsId
containerId={containerId || ""}
serverId={serverId}
runType="swarm"
/>
</div>
</DialogContent>
</Dialog>
);
};

View File

@@ -86,7 +86,7 @@ export const ShowTraefikFile = ({ path, serverId }: Props) => {
refetch(); refetch();
}) })
.catch(() => { .catch(() => {
toast.error("Error updating the Traefik config"); toast.error("Error to update the traefik config");
}); });
}; };

View File

@@ -65,7 +65,7 @@ export const ShowAdvancedMariadb = ({ mariadbId }: Props) => {
await refetch(); await refetch();
}) })
.catch(() => { .catch(() => {
toast.error("Error updating the resources"); toast.error("Error to Update the resources");
}); });
}; };
return ( return (

View File

@@ -18,13 +18,6 @@ import {
import { Input } from "@/components/ui/input"; import { Input } from "@/components/ui/input";
import { api } from "@/utils/api"; import { api } from "@/utils/api";
import { zodResolver } from "@hookform/resolvers/zod"; import { zodResolver } from "@hookform/resolvers/zod";
import {
TooltipProvider,
TooltipTrigger,
TooltipContent,
Tooltip,
} from "@/components/ui/tooltip";
import { InfoIcon } from "lucide-react";
import React, { useEffect } from "react"; import React, { useEffect } from "react";
import { useForm } from "react-hook-form"; import { useForm } from "react-hook-form";
import { toast } from "sonner"; import { toast } from "sonner";
@@ -78,7 +71,7 @@ export const ShowMariadbResources = ({ mariadbId }: Props) => {
await refetch(); await refetch();
}) })
.catch(() => { .catch(() => {
toast.error("Error updating the resources"); toast.error("Error to Update the resources");
}); });
}; };
return ( return (
@@ -107,40 +100,28 @@ export const ShowMariadbResources = ({ mariadbId }: Props) => {
name="memoryReservation" name="memoryReservation"
render={({ field }) => ( render={({ field }) => (
<FormItem> <FormItem>
<div className="flex items-center gap-2">
<FormLabel>Memory Reservation</FormLabel> <FormLabel>Memory Reservation</FormLabel>
<TooltipProvider>
<Tooltip delayDuration={0}>
<TooltipTrigger>
<InfoIcon className="h-4 w-4 text-muted-foreground" />
</TooltipTrigger>
<TooltipContent>
<p>
Memory soft limit in bytes. Example: 256MB =
268435456 bytes
</p>
</TooltipContent>
</Tooltip>
</TooltipProvider>
</div>
<FormControl> <FormControl>
<Input <Input
placeholder="268435456 (256MB in bytes)" placeholder="256 MB"
{...field} {...field}
value={field.value?.toString() || ""} value={field.value?.toString() || ""}
onChange={(e) => { onChange={(e) => {
const value = e.target.value; const value = e.target.value;
if (value === "") { if (value === "") {
// Si el campo está vacío, establece el valor como null.
field.onChange(null); field.onChange(null);
} else { } else {
const number = Number.parseInt(value, 10); const number = Number.parseInt(value, 10);
if (!Number.isNaN(number)) { if (!Number.isNaN(number)) {
// Solo actualiza el valor si se convierte a un número válido.
field.onChange(number); field.onChange(number);
} }
} }
}} }}
/> />
</FormControl> </FormControl>
<FormMessage /> <FormMessage />
</FormItem> </FormItem>
)} )}
@@ -152,34 +133,21 @@ export const ShowMariadbResources = ({ mariadbId }: Props) => {
render={({ field }) => { render={({ field }) => {
return ( return (
<FormItem> <FormItem>
<div className="flex items-center gap-2">
<FormLabel>Memory Limit</FormLabel> <FormLabel>Memory Limit</FormLabel>
<TooltipProvider>
<Tooltip delayDuration={0}>
<TooltipTrigger>
<InfoIcon className="h-4 w-4 text-muted-foreground" />
</TooltipTrigger>
<TooltipContent>
<p>
Memory hard limit in bytes. Example: 1GB =
1073741824 bytes
</p>
</TooltipContent>
</Tooltip>
</TooltipProvider>
</div>
<FormControl> <FormControl>
<Input <Input
placeholder="1073741824 (1GB in bytes)" placeholder={"1024 MB"}
{...field} {...field}
value={field.value?.toString() || ""} value={field.value?.toString() || ""}
onChange={(e) => { onChange={(e) => {
const value = e.target.value; const value = e.target.value;
if (value === "") { if (value === "") {
// Si el campo está vacío, establece el valor como null.
field.onChange(null); field.onChange(null);
} else { } else {
const number = Number.parseInt(value, 10); const number = Number.parseInt(value, 10);
if (!Number.isNaN(number)) { if (!Number.isNaN(number)) {
// Solo actualiza el valor si se convierte a un número válido.
field.onChange(number); field.onChange(number);
} }
} }
@@ -198,34 +166,21 @@ export const ShowMariadbResources = ({ mariadbId }: Props) => {
render={({ field }) => { render={({ field }) => {
return ( return (
<FormItem> <FormItem>
<div className="flex items-center gap-2"> <FormLabel>Cpu Limit</FormLabel>
<FormLabel>CPU Limit</FormLabel>
<TooltipProvider>
<Tooltip delayDuration={0}>
<TooltipTrigger>
<InfoIcon className="h-4 w-4 text-muted-foreground" />
</TooltipTrigger>
<TooltipContent>
<p>
CPU quota in units of 10^-9 CPUs. Example: 2
CPUs = 2000000000
</p>
</TooltipContent>
</Tooltip>
</TooltipProvider>
</div>
<FormControl> <FormControl>
<Input <Input
placeholder="2000000000 (2 CPUs)" placeholder={"2"}
{...field} {...field}
value={field.value?.toString() || ""} value={field.value?.toString() || ""}
onChange={(e) => { onChange={(e) => {
const value = e.target.value; const value = e.target.value;
if (value === "") { if (value === "") {
// Si el campo está vacío, establece el valor como null.
field.onChange(null); field.onChange(null);
} else { } else {
const number = Number.parseInt(value, 10); const number = Number.parseInt(value, 10);
if (!Number.isNaN(number)) { if (!Number.isNaN(number)) {
// Solo actualiza el valor si se convierte a un número válido.
field.onChange(number); field.onChange(number);
} }
} }
@@ -243,34 +198,21 @@ export const ShowMariadbResources = ({ mariadbId }: Props) => {
render={({ field }) => { render={({ field }) => {
return ( return (
<FormItem> <FormItem>
<div className="flex items-center gap-2"> <FormLabel>Cpu Reservation</FormLabel>
<FormLabel>CPU Reservation</FormLabel>
<TooltipProvider>
<Tooltip delayDuration={0}>
<TooltipTrigger>
<InfoIcon className="h-4 w-4 text-muted-foreground" />
</TooltipTrigger>
<TooltipContent>
<p>
CPU shares (relative weight). Example: 1 CPU =
1000000000
</p>
</TooltipContent>
</Tooltip>
</TooltipProvider>
</div>
<FormControl> <FormControl>
<Input <Input
placeholder="1000000000 (1 CPU)" placeholder={"1"}
{...field} {...field}
value={field.value?.toString() || ""} value={field.value?.toString() || ""}
onChange={(e) => { onChange={(e) => {
const value = e.target.value; const value = e.target.value;
if (value === "") { if (value === "") {
// Si el campo está vacío, establece el valor como null.
field.onChange(null); field.onChange(null);
} else { } else {
const number = Number.parseInt(value, 10); const number = Number.parseInt(value, 10);
if (!Number.isNaN(number)) { if (!Number.isNaN(number)) {
// Solo actualiza el valor si se convierte a un número válido.
field.onChange(number); field.onChange(number);
} }
} }

View File

@@ -144,7 +144,7 @@ export const ShowBackupMariadb = ({ mariadbId }: Props) => {
}) })
.catch(() => { .catch(() => {
toast.error( toast.error(
"Error creating the manual backup", "Error to Create the manual backup",
); );
}); });
}} }}

View File

@@ -70,7 +70,7 @@ export const ShowMariadbEnvironment = ({ mariadbId }: Props) => {
await refetch(); await refetch();
}) })
.catch(() => { .catch(() => {
toast.error("Error adding environment"); toast.error("Error to add environment");
}); });
}; };

View File

@@ -55,12 +55,12 @@ export const DeployMariadb = ({ mariadbId }: Props) => {
await deploy({ await deploy({
mariadbId, mariadbId,
}).catch(() => { }).catch(() => {
toast.error("Error deploying Database"); toast.error("Error to deploy Database");
}); });
await refetch(); await refetch();
}) })
.catch((e) => { .catch((e) => {
toast.error(e.message || "Error deploying Database"); toast.error(e.message || "Error to deploy Database");
}); });
}} }}
> >

View File

@@ -55,7 +55,7 @@ export const ResetMariadb = ({ mariadbId, appName }: Props) => {
toast.success("Service Reloaded"); toast.success("Service Reloaded");
}) })
.catch(() => { .catch(() => {
toast.error("Error reloading the service"); toast.error("Error to reload the service");
}); });
await refetch(); await refetch();
}} }}

View File

@@ -72,7 +72,7 @@ export const ShowExternalMariadbCredentials = ({ mariadbId }: Props) => {
await refetch(); await refetch();
}) })
.catch(() => { .catch(() => {
toast.error("Error saving the external port"); toast.error("Error to save the external port");
}); });
}; };

View File

@@ -49,10 +49,10 @@ export const StopMariadb = ({ mariadbId }: Props) => {
await utils.mariadb.one.invalidate({ await utils.mariadb.one.invalidate({
mariadbId, mariadbId,
}); });
toast.success("Application stopped successfully"); toast.success("Application stopped succesfully");
}) })
.catch(() => { .catch(() => {
toast.error("Error stopping the Application"); toast.error("Error to stop the Application");
}); });
}} }}
> >

View File

@@ -49,10 +49,10 @@ export const StartMariadb = ({ mariadbId }: Props) => {
await utils.mariadb.one.invalidate({ await utils.mariadb.one.invalidate({
mariadbId, mariadbId,
}); });
toast.success("Database started successfully"); toast.success("Database started succesfully");
}) })
.catch(() => { .catch(() => {
toast.error("Error starting the Database"); toast.error("Error to start the Database");
}); });
}} }}
> >

View File

@@ -75,13 +75,13 @@ export const UpdateMariadb = ({ mariadbId }: Props) => {
description: formData.description || "", description: formData.description || "",
}) })
.then(() => { .then(() => {
toast.success("MariaDB updated successfully"); toast.success("MariaDB updated succesfully");
utils.mariadb.one.invalidate({ utils.mariadb.one.invalidate({
mariadbId: mariadbId, mariadbId: mariadbId,
}); });
}) })
.catch(() => { .catch(() => {
toast.error("Error updating the Mariadb"); toast.error("Error to update the Mariadb");
}) })
.finally(() => {}); .finally(() => {});
}; };

View File

@@ -65,7 +65,7 @@ export const ShowAdvancedMongo = ({ mongoId }: Props) => {
await refetch(); await refetch();
}) })
.catch(() => { .catch(() => {
toast.error("Error updating the resources"); toast.error("Error to Update the resources");
}); });
}; };
return ( return (

View File

@@ -19,13 +19,6 @@ import { Input } from "@/components/ui/input";
import { api } from "@/utils/api"; import { api } from "@/utils/api";
import { zodResolver } from "@hookform/resolvers/zod"; import { zodResolver } from "@hookform/resolvers/zod";
import React, { useEffect } from "react"; import React, { useEffect } from "react";
import {
TooltipProvider,
TooltipTrigger,
TooltipContent,
Tooltip,
} from "@/components/ui/tooltip";
import { InfoIcon } from "lucide-react";
import { useForm } from "react-hook-form"; import { useForm } from "react-hook-form";
import { toast } from "sonner"; import { toast } from "sonner";
import { z } from "zod"; import { z } from "zod";
@@ -78,7 +71,7 @@ export const ShowMongoResources = ({ mongoId }: Props) => {
await refetch(); await refetch();
}) })
.catch(() => { .catch(() => {
toast.error("Error updating the resources"); toast.error("Error to Update the resources");
}); });
}; };
return ( return (
@@ -96,6 +89,10 @@ export const ShowMongoResources = ({ mongoId }: Props) => {
the changes. the changes.
</AlertBlock> </AlertBlock>
<Form {...form}> <Form {...form}>
<AlertBlock type="info">
Please remember to click Redeploy after modify the resources to
apply the changes.
</AlertBlock>
<form <form
id="hook-form" id="hook-form"
onSubmit={form.handleSubmit(onSubmit)} onSubmit={form.handleSubmit(onSubmit)}
@@ -107,40 +104,28 @@ export const ShowMongoResources = ({ mongoId }: Props) => {
name="memoryReservation" name="memoryReservation"
render={({ field }) => ( render={({ field }) => (
<FormItem> <FormItem>
<div className="flex items-center gap-2">
<FormLabel>Memory Reservation</FormLabel> <FormLabel>Memory Reservation</FormLabel>
<TooltipProvider>
<Tooltip delayDuration={0}>
<TooltipTrigger>
<InfoIcon className="h-4 w-4 text-muted-foreground" />
</TooltipTrigger>
<TooltipContent>
<p>
Memory soft limit in bytes. Example: 256MB =
268435456 bytes
</p>
</TooltipContent>
</Tooltip>
</TooltipProvider>
</div>
<FormControl> <FormControl>
<Input <Input
placeholder="268435456 (256MB in bytes)" placeholder="256 MB"
{...field} {...field}
value={field.value?.toString() || ""} value={field.value?.toString() || ""}
onChange={(e) => { onChange={(e) => {
const value = e.target.value; const value = e.target.value;
if (value === "") { if (value === "") {
// Si el campo está vacío, establece el valor como null.
field.onChange(null); field.onChange(null);
} else { } else {
const number = Number.parseInt(value, 10); const number = Number.parseInt(value, 10);
if (!Number.isNaN(number)) { if (!Number.isNaN(number)) {
// Solo actualiza el valor si se convierte a un número válido.
field.onChange(number); field.onChange(number);
} }
} }
}} }}
/> />
</FormControl> </FormControl>
<FormMessage /> <FormMessage />
</FormItem> </FormItem>
)} )}
@@ -152,34 +137,21 @@ export const ShowMongoResources = ({ mongoId }: Props) => {
render={({ field }) => { render={({ field }) => {
return ( return (
<FormItem> <FormItem>
<div className="flex items-center gap-2">
<FormLabel>Memory Limit</FormLabel> <FormLabel>Memory Limit</FormLabel>
<TooltipProvider>
<Tooltip delayDuration={0}>
<TooltipTrigger>
<InfoIcon className="h-4 w-4 text-muted-foreground" />
</TooltipTrigger>
<TooltipContent>
<p>
Memory hard limit in bytes. Example: 1GB =
1073741824 bytes
</p>
</TooltipContent>
</Tooltip>
</TooltipProvider>
</div>
<FormControl> <FormControl>
<Input <Input
placeholder="1073741824 (1GB in bytes)" placeholder={"1024 MB"}
{...field} {...field}
value={field.value?.toString() || ""} value={field.value?.toString() || ""}
onChange={(e) => { onChange={(e) => {
const value = e.target.value; const value = e.target.value;
if (value === "") { if (value === "") {
// Si el campo está vacío, establece el valor como null.
field.onChange(null); field.onChange(null);
} else { } else {
const number = Number.parseInt(value, 10); const number = Number.parseInt(value, 10);
if (!Number.isNaN(number)) { if (!Number.isNaN(number)) {
// Solo actualiza el valor si se convierte a un número válido.
field.onChange(number); field.onChange(number);
} }
} }
@@ -198,34 +170,21 @@ export const ShowMongoResources = ({ mongoId }: Props) => {
render={({ field }) => { render={({ field }) => {
return ( return (
<FormItem> <FormItem>
<div className="flex items-center gap-2"> <FormLabel>Cpu Limit</FormLabel>
<FormLabel>CPU Limit</FormLabel>
<TooltipProvider>
<Tooltip delayDuration={0}>
<TooltipTrigger>
<InfoIcon className="h-4 w-4 text-muted-foreground" />
</TooltipTrigger>
<TooltipContent>
<p>
CPU quota in units of 10^-9 CPUs. Example: 2
CPUs = 2000000000
</p>
</TooltipContent>
</Tooltip>
</TooltipProvider>
</div>
<FormControl> <FormControl>
<Input <Input
placeholder="2000000000 (2 CPUs)" placeholder={"2"}
{...field} {...field}
value={field.value?.toString() || ""} value={field.value?.toString() || ""}
onChange={(e) => { onChange={(e) => {
const value = e.target.value; const value = e.target.value;
if (value === "") { if (value === "") {
// Si el campo está vacío, establece el valor como null.
field.onChange(null); field.onChange(null);
} else { } else {
const number = Number.parseInt(value, 10); const number = Number.parseInt(value, 10);
if (!Number.isNaN(number)) { if (!Number.isNaN(number)) {
// Solo actualiza el valor si se convierte a un número válido.
field.onChange(number); field.onChange(number);
} }
} }
@@ -243,34 +202,21 @@ export const ShowMongoResources = ({ mongoId }: Props) => {
render={({ field }) => { render={({ field }) => {
return ( return (
<FormItem> <FormItem>
<div className="flex items-center gap-2"> <FormLabel>Cpu Reservation</FormLabel>
<FormLabel>CPU Reservation</FormLabel>
<TooltipProvider>
<Tooltip delayDuration={0}>
<TooltipTrigger>
<InfoIcon className="h-4 w-4 text-muted-foreground" />
</TooltipTrigger>
<TooltipContent>
<p>
CPU shares (relative weight). Example: 1 CPU =
1000000000
</p>
</TooltipContent>
</Tooltip>
</TooltipProvider>
</div>
<FormControl> <FormControl>
<Input <Input
placeholder="1000000000 (1 CPU)" placeholder={"1"}
{...field} {...field}
value={field.value?.toString() || ""} value={field.value?.toString() || ""}
onChange={(e) => { onChange={(e) => {
const value = e.target.value; const value = e.target.value;
if (value === "") { if (value === "") {
// Si el campo está vacío, establece el valor como null.
field.onChange(null); field.onChange(null);
} else { } else {
const number = Number.parseInt(value, 10); const number = Number.parseInt(value, 10);
if (!Number.isNaN(number)) { if (!Number.isNaN(number)) {
// Solo actualiza el valor si se convierte a un número válido.
field.onChange(number); field.onChange(number);
} }
} }

View File

@@ -144,7 +144,7 @@ export const ShowBackupMongo = ({ mongoId }: Props) => {
}) })
.catch(() => { .catch(() => {
toast.error( toast.error(
"Error creating the manual backup", "Error to Create the manual backup",
); );
}); });
}} }}

View File

@@ -70,7 +70,7 @@ export const ShowMongoEnvironment = ({ mongoId }: Props) => {
await refetch(); await refetch();
}) })
.catch(() => { .catch(() => {
toast.error("Error adding environment"); toast.error("Error to add environment");
}); });
}; };

View File

@@ -55,12 +55,12 @@ export const DeployMongo = ({ mongoId }: Props) => {
await deploy({ await deploy({
mongoId, mongoId,
}).catch(() => { }).catch(() => {
toast.error("Error deploying Database"); toast.error("Error to deploy Database");
}); });
await refetch(); await refetch();
}) })
.catch((e) => { .catch((e) => {
toast.error(e.message || "Error deploying Database"); toast.error(e.message || "Error to deploy Database");
}); });
}} }}
> >

View File

@@ -55,7 +55,7 @@ export const ResetMongo = ({ mongoId, appName }: Props) => {
toast.success("Service Reloaded"); toast.success("Service Reloaded");
}) })
.catch(() => { .catch(() => {
toast.error("Error reloading the service"); toast.error("Error to reload the service");
}); });
await refetch(); await refetch();
}} }}

View File

@@ -72,7 +72,7 @@ export const ShowExternalMongoCredentials = ({ mongoId }: Props) => {
await refetch(); await refetch();
}) })
.catch(() => { .catch(() => {
toast.error("Error saving the external port"); toast.error("Error to save the external port");
}); });
}; };

View File

@@ -49,10 +49,10 @@ export const StopMongo = ({ mongoId }: Props) => {
await utils.mongo.one.invalidate({ await utils.mongo.one.invalidate({
mongoId, mongoId,
}); });
toast.success("Application stopped successfully"); toast.success("Application stopped succesfully");
}) })
.catch(() => { .catch(() => {
toast.error("Error stopping the Application"); toast.error("Error to stop the Application");
}); });
}} }}
> >

View File

@@ -49,10 +49,10 @@ export const StartMongo = ({ mongoId }: Props) => {
await utils.mongo.one.invalidate({ await utils.mongo.one.invalidate({
mongoId, mongoId,
}); });
toast.success("Database started successfully"); toast.success("Database started succesfully");
}) })
.catch(() => { .catch(() => {
toast.error("Error starting the Database"); toast.error("Error to start the Database");
}); });
}} }}
> >

View File

@@ -76,14 +76,14 @@ export const UpdateMongo = ({ mongoId }: Props) => {
description: formData.description || "", description: formData.description || "",
}) })
.then(() => { .then(() => {
toast.success("Mongo updated successfully"); toast.success("Mongo updated succesfully");
utils.mongo.one.invalidate({ utils.mongo.one.invalidate({
mongoId: mongoId, mongoId: mongoId,
}); });
setIsOpen(false); setIsOpen(false);
}) })
.catch(() => { .catch(() => {
toast.error("Error updating mongo database"); toast.error("Error to update mongo database");
}) })
.finally(() => {}); .finally(() => {});
}; };

View File

@@ -65,7 +65,7 @@ export const ShowAdvancedMysql = ({ mysqlId }: Props) => {
await refetch(); await refetch();
}) })
.catch(() => { .catch(() => {
toast.error("Error updating the resources"); toast.error("Error to Update the resources");
}); });
}; };
return ( return (

View File

@@ -20,13 +20,6 @@ import { api } from "@/utils/api";
import { zodResolver } from "@hookform/resolvers/zod"; import { zodResolver } from "@hookform/resolvers/zod";
import React, { useEffect } from "react"; import React, { useEffect } from "react";
import { useForm } from "react-hook-form"; import { useForm } from "react-hook-form";
import {
TooltipProvider,
TooltipTrigger,
TooltipContent,
Tooltip,
} from "@/components/ui/tooltip";
import { InfoIcon } from "lucide-react";
import { toast } from "sonner"; import { toast } from "sonner";
import { z } from "zod"; import { z } from "zod";
@@ -78,7 +71,7 @@ export const ShowMysqlResources = ({ mysqlId }: Props) => {
await refetch(); await refetch();
}) })
.catch(() => { .catch(() => {
toast.error("Error updating the resources"); toast.error("Error to Update the resources");
}); });
}; };
return ( return (
@@ -107,40 +100,28 @@ export const ShowMysqlResources = ({ mysqlId }: Props) => {
name="memoryReservation" name="memoryReservation"
render={({ field }) => ( render={({ field }) => (
<FormItem> <FormItem>
<div className="flex items-center gap-2">
<FormLabel>Memory Reservation</FormLabel> <FormLabel>Memory Reservation</FormLabel>
<TooltipProvider>
<Tooltip delayDuration={0}>
<TooltipTrigger>
<InfoIcon className="h-4 w-4 text-muted-foreground" />
</TooltipTrigger>
<TooltipContent>
<p>
Memory soft limit in bytes. Example: 256MB =
268435456 bytes
</p>
</TooltipContent>
</Tooltip>
</TooltipProvider>
</div>
<FormControl> <FormControl>
<Input <Input
placeholder="268435456 (256MB in bytes)" placeholder="256 MB"
{...field} {...field}
value={field.value?.toString() || ""} value={field.value?.toString() || ""}
onChange={(e) => { onChange={(e) => {
const value = e.target.value; const value = e.target.value;
if (value === "") { if (value === "") {
// Si el campo está vacío, establece el valor como null.
field.onChange(null); field.onChange(null);
} else { } else {
const number = Number.parseInt(value, 10); const number = Number.parseInt(value, 10);
if (!Number.isNaN(number)) { if (!Number.isNaN(number)) {
// Solo actualiza el valor si se convierte a un número válido.
field.onChange(number); field.onChange(number);
} }
} }
}} }}
/> />
</FormControl> </FormControl>
<FormMessage /> <FormMessage />
</FormItem> </FormItem>
)} )}
@@ -152,34 +133,21 @@ export const ShowMysqlResources = ({ mysqlId }: Props) => {
render={({ field }) => { render={({ field }) => {
return ( return (
<FormItem> <FormItem>
<div className="flex items-center gap-2">
<FormLabel>Memory Limit</FormLabel> <FormLabel>Memory Limit</FormLabel>
<TooltipProvider>
<Tooltip delayDuration={0}>
<TooltipTrigger>
<InfoIcon className="h-4 w-4 text-muted-foreground" />
</TooltipTrigger>
<TooltipContent>
<p>
Memory hard limit in bytes. Example: 1GB =
1073741824 bytes
</p>
</TooltipContent>
</Tooltip>
</TooltipProvider>
</div>
<FormControl> <FormControl>
<Input <Input
placeholder="1073741824 (1GB in bytes)" placeholder={"1024 MB"}
{...field} {...field}
value={field.value?.toString() || ""} value={field.value?.toString() || ""}
onChange={(e) => { onChange={(e) => {
const value = e.target.value; const value = e.target.value;
if (value === "") { if (value === "") {
// Si el campo está vacío, establece el valor como null.
field.onChange(null); field.onChange(null);
} else { } else {
const number = Number.parseInt(value, 10); const number = Number.parseInt(value, 10);
if (!Number.isNaN(number)) { if (!Number.isNaN(number)) {
// Solo actualiza el valor si se convierte a un número válido.
field.onChange(number); field.onChange(number);
} }
} }
@@ -198,34 +166,21 @@ export const ShowMysqlResources = ({ mysqlId }: Props) => {
render={({ field }) => { render={({ field }) => {
return ( return (
<FormItem> <FormItem>
<div className="flex items-center gap-2"> <FormLabel>Cpu Limit</FormLabel>
<FormLabel>CPU Limit</FormLabel>
<TooltipProvider>
<Tooltip delayDuration={0}>
<TooltipTrigger>
<InfoIcon className="h-4 w-4 text-muted-foreground" />
</TooltipTrigger>
<TooltipContent>
<p>
CPU quota in units of 10^-9 CPUs. Example: 2
CPUs = 2000000000
</p>
</TooltipContent>
</Tooltip>
</TooltipProvider>
</div>
<FormControl> <FormControl>
<Input <Input
placeholder="2000000000 (2 CPUs)" placeholder={"2"}
{...field} {...field}
value={field.value?.toString() || ""} value={field.value?.toString() || ""}
onChange={(e) => { onChange={(e) => {
const value = e.target.value; const value = e.target.value;
if (value === "") { if (value === "") {
// Si el campo está vacío, establece el valor como null.
field.onChange(null); field.onChange(null);
} else { } else {
const number = Number.parseInt(value, 10); const number = Number.parseInt(value, 10);
if (!Number.isNaN(number)) { if (!Number.isNaN(number)) {
// Solo actualiza el valor si se convierte a un número válido.
field.onChange(number); field.onChange(number);
} }
} }
@@ -243,34 +198,21 @@ export const ShowMysqlResources = ({ mysqlId }: Props) => {
render={({ field }) => { render={({ field }) => {
return ( return (
<FormItem> <FormItem>
<div className="flex items-center gap-2"> <FormLabel>Cpu Reservation</FormLabel>
<FormLabel>CPU Reservation</FormLabel>
<TooltipProvider>
<Tooltip delayDuration={0}>
<TooltipTrigger>
<InfoIcon className="h-4 w-4 text-muted-foreground" />
</TooltipTrigger>
<TooltipContent>
<p>
CPU shares (relative weight). Example: 1 CPU =
1000000000
</p>
</TooltipContent>
</Tooltip>
</TooltipProvider>
</div>
<FormControl> <FormControl>
<Input <Input
placeholder="1000000000 (1 CPU)" placeholder={"1"}
{...field} {...field}
value={field.value?.toString() || ""} value={field.value?.toString() || ""}
onChange={(e) => { onChange={(e) => {
const value = e.target.value; const value = e.target.value;
if (value === "") { if (value === "") {
// Si el campo está vacío, establece el valor como null.
field.onChange(null); field.onChange(null);
} else { } else {
const number = Number.parseInt(value, 10); const number = Number.parseInt(value, 10);
if (!Number.isNaN(number)) { if (!Number.isNaN(number)) {
// Solo actualiza el valor si se convierte a un número válido.
field.onChange(number); field.onChange(number);
} }
} }

View File

@@ -144,7 +144,7 @@ export const ShowBackupMySql = ({ mysqlId }: Props) => {
}) })
.catch(() => { .catch(() => {
toast.error( toast.error(
"Error creating the manual backup", "Error to Create the manual backup",
); );
}); });
}} }}

View File

@@ -70,7 +70,7 @@ export const ShowMysqlEnvironment = ({ mysqlId }: Props) => {
await refetch(); await refetch();
}) })
.catch(() => { .catch(() => {
toast.error("Error adding environment"); toast.error("Error to add environment");
}); });
}; };

View File

@@ -55,12 +55,12 @@ export const DeployMysql = ({ mysqlId }: Props) => {
await deploy({ await deploy({
mysqlId, mysqlId,
}).catch(() => { }).catch(() => {
toast.error("Error deploying Database"); toast.error("Error to deploy Database");
}); });
await refetch(); await refetch();
}) })
.catch((e) => { .catch((e) => {
toast.error(e.message || "Error deploying Database"); toast.error(e.message || "Error to deploy Database");
}); });
}} }}
> >

View File

@@ -55,7 +55,7 @@ export const ResetMysql = ({ mysqlId, appName }: Props) => {
toast.success("Service Reloaded"); toast.success("Service Reloaded");
}) })
.catch(() => { .catch(() => {
toast.error("Error reloading the service"); toast.error("Error to reload the service");
}); });
await refetch(); await refetch();
}} }}

View File

@@ -72,7 +72,7 @@ export const ShowExternalMysqlCredentials = ({ mysqlId }: Props) => {
await refetch(); await refetch();
}) })
.catch(() => { .catch(() => {
toast.error("Error saving the external port"); toast.error("Error to save the external port");
}); });
}; };

View File

@@ -49,10 +49,10 @@ export const StopMysql = ({ mysqlId }: Props) => {
await utils.mysql.one.invalidate({ await utils.mysql.one.invalidate({
mysqlId, mysqlId,
}); });
toast.success("MySQL stopped successfully"); toast.success("Application stopped succesfully");
}) })
.catch(() => { .catch(() => {
toast.error("Error stopping MySQL"); toast.error("Error to stop the Application");
}); });
}} }}
> >

View File

@@ -49,10 +49,10 @@ export const StartMysql = ({ mysqlId }: Props) => {
await utils.mysql.one.invalidate({ await utils.mysql.one.invalidate({
mysqlId, mysqlId,
}); });
toast.success("Database started successfully"); toast.success("Database started succesfully");
}) })
.catch(() => { .catch(() => {
toast.error("Error starting the Database"); toast.error("Error to start the Database");
}); });
}} }}
> >

View File

@@ -75,13 +75,13 @@ export const UpdateMysql = ({ mysqlId }: Props) => {
description: formData.description || "", description: formData.description || "",
}) })
.then(() => { .then(() => {
toast.success("MySQL updated successfully"); toast.success("MySQL updated succesfully");
utils.mysql.one.invalidate({ utils.mysql.one.invalidate({
mysqlId: mysqlId, mysqlId: mysqlId,
}); });
}) })
.catch(() => { .catch(() => {
toast.error("Error updating MySQL"); toast.error("Error to update the MySQL");
}) })
.finally(() => {}); .finally(() => {});
}; };

View File

@@ -65,7 +65,7 @@ export const ShowAdvancedPostgres = ({ postgresId }: Props) => {
await refetch(); await refetch();
}) })
.catch(() => { .catch(() => {
toast.error("Error updating the resources"); toast.error("Error to Update the resources");
}); });
}; };
return ( return (

View File

@@ -21,13 +21,6 @@ import { zodResolver } from "@hookform/resolvers/zod";
import React, { useEffect } from "react"; import React, { useEffect } from "react";
import { useForm } from "react-hook-form"; import { useForm } from "react-hook-form";
import { toast } from "sonner"; import { toast } from "sonner";
import {
TooltipProvider,
TooltipTrigger,
TooltipContent,
Tooltip,
} from "@/components/ui/tooltip";
import { InfoIcon } from "lucide-react";
import { z } from "zod"; import { z } from "zod";
const addResourcesPostgres = z.object({ const addResourcesPostgres = z.object({
@@ -78,7 +71,7 @@ export const ShowPostgresResources = ({ postgresId }: Props) => {
await refetch(); await refetch();
}) })
.catch(() => { .catch(() => {
toast.error("Error updating the resources"); toast.error("Error to Update the resources");
}); });
}; };
return ( return (
@@ -107,25 +100,10 @@ export const ShowPostgresResources = ({ postgresId }: Props) => {
name="memoryReservation" name="memoryReservation"
render={({ field }) => ( render={({ field }) => (
<FormItem> <FormItem>
<div className="flex items-center gap-2">
<FormLabel>Memory Reservation</FormLabel> <FormLabel>Memory Reservation</FormLabel>
<TooltipProvider>
<Tooltip delayDuration={0}>
<TooltipTrigger>
<InfoIcon className="h-4 w-4 text-muted-foreground" />
</TooltipTrigger>
<TooltipContent>
<p>
Memory soft limit in bytes. Example: 256MB =
268435456 bytes
</p>
</TooltipContent>
</Tooltip>
</TooltipProvider>
</div>
<FormControl> <FormControl>
<Input <Input
placeholder="268435456 (256MB in bytes)" placeholder="256 MB"
{...field} {...field}
value={field.value?.toString() || ""} value={field.value?.toString() || ""}
onChange={(e) => { onChange={(e) => {
@@ -141,6 +119,7 @@ export const ShowPostgresResources = ({ postgresId }: Props) => {
}} }}
/> />
</FormControl> </FormControl>
<FormMessage /> <FormMessage />
</FormItem> </FormItem>
)} )}
@@ -152,25 +131,10 @@ export const ShowPostgresResources = ({ postgresId }: Props) => {
render={({ field }) => { render={({ field }) => {
return ( return (
<FormItem> <FormItem>
<div className="flex items-center gap-2">
<FormLabel>Memory Limit</FormLabel> <FormLabel>Memory Limit</FormLabel>
<TooltipProvider>
<Tooltip delayDuration={0}>
<TooltipTrigger>
<InfoIcon className="h-4 w-4 text-muted-foreground" />
</TooltipTrigger>
<TooltipContent>
<p>
Memory hard limit in bytes. Example: 1GB =
1073741824 bytes
</p>
</TooltipContent>
</Tooltip>
</TooltipProvider>
</div>
<FormControl> <FormControl>
<Input <Input
placeholder="1073741824 (1GB in bytes)" placeholder={"1024 MB"}
{...field} {...field}
value={field.value?.toString() || ""} value={field.value?.toString() || ""}
onChange={(e) => { onChange={(e) => {
@@ -198,25 +162,10 @@ export const ShowPostgresResources = ({ postgresId }: Props) => {
render={({ field }) => { render={({ field }) => {
return ( return (
<FormItem> <FormItem>
<div className="flex items-center gap-2"> <FormLabel>Cpu Limit</FormLabel>
<FormLabel>CPU Limit</FormLabel>
<TooltipProvider>
<Tooltip delayDuration={0}>
<TooltipTrigger>
<InfoIcon className="h-4 w-4 text-muted-foreground" />
</TooltipTrigger>
<TooltipContent>
<p>
CPU quota in units of 10^-9 CPUs. Example: 2
CPUs = 2000000000
</p>
</TooltipContent>
</Tooltip>
</TooltipProvider>
</div>
<FormControl> <FormControl>
<Input <Input
placeholder="2000000000 (2 CPUs)" placeholder={"2"}
{...field} {...field}
value={field.value?.toString() || ""} value={field.value?.toString() || ""}
onChange={(e) => { onChange={(e) => {
@@ -243,25 +192,10 @@ export const ShowPostgresResources = ({ postgresId }: Props) => {
render={({ field }) => { render={({ field }) => {
return ( return (
<FormItem> <FormItem>
<div className="flex items-center gap-2"> <FormLabel>Cpu Reservation</FormLabel>
<FormLabel>CPU Reservation</FormLabel>
<TooltipProvider>
<Tooltip delayDuration={0}>
<TooltipTrigger>
<InfoIcon className="h-4 w-4 text-muted-foreground" />
</TooltipTrigger>
<TooltipContent>
<p>
CPU shares (relative weight). Example: 1 CPU =
1000000000
</p>
</TooltipContent>
</Tooltip>
</TooltipProvider>
</div>
<FormControl> <FormControl>
<Input <Input
placeholder="1000000000 (1 CPU)" placeholder={"1"}
{...field} {...field}
value={field.value?.toString() || ""} value={field.value?.toString() || ""}
onChange={(e) => { onChange={(e) => {

View File

@@ -145,7 +145,7 @@ export const ShowBackupPostgres = ({ postgresId }: Props) => {
}) })
.catch(() => { .catch(() => {
toast.error( toast.error(
"Error creating the manual backup", "Error to Create the manual backup",
); );
}); });
}} }}

View File

@@ -70,7 +70,7 @@ export const ShowPostgresEnvironment = ({ postgresId }: Props) => {
await refetch(); await refetch();
}) })
.catch(() => { .catch(() => {
toast.error("Error adding environment"); toast.error("Error to add environment");
}); });
}; };

View File

@@ -55,12 +55,12 @@ export const DeployPostgres = ({ postgresId }: Props) => {
await deploy({ await deploy({
postgresId, postgresId,
}).catch(() => { }).catch(() => {
toast.error("Error deploying Database"); toast.error("Error to deploy Database");
}); });
await refetch(); await refetch();
}) })
.catch((e) => { .catch((e) => {
toast.error(e.message || "Error deploying Database"); toast.error(e.message || "Error to deploy Database");
}); });
}} }}
> >

Some files were not shown because too many files have changed in this diff Show More