Compare commits

...

46 Commits

Author SHA1 Message Date
Mauricio Siu
973b54408e Merge pull request #1027 from Dokploy/canary
v0.16.1
2024-12-29 18:39:17 -06:00
Mauricio Siu
638fbe17a6 refactor: update paths 2024-12-29 18:23:07 -06:00
Mauricio Siu
75e0d0ba78 refactor: add is cloud validation 2024-12-29 18:14:32 -06:00
Mauricio Siu
0f1b911236 chore: bump version 2024-12-29 18:08:20 -06:00
Mauricio Siu
da148a6c50 Merge pull request #959 from szwabodev/feat/localServerTerminal
feat: local server terminal access
2024-12-29 18:06:32 -06:00
Mauricio Siu
c168648cce Merge pull request #1026 from 190km/fix/missing-norwegian-select
fix: missing norwegian lang in select
2024-12-29 17:40:16 -06:00
190km
efd3ad4102 fix: missing norwegian lang in select 2024-12-30 00:30:57 +01:00
Mauricio Siu
a9577395eb Merge pull request #1025 from Dokploy/998-add-unifi-applicaton
feat: add unifi template
2024-12-29 17:19:33 -06:00
Mauricio Siu
1d02d4308f feat: add unifi template 2024-12-29 17:19:17 -06:00
Mauricio Siu
e93e15a9c8 Merge pull request #995 from 190km/refactor-i18n
feat: i18n displays real lang name
2024-12-29 16:14:03 -06:00
Mauricio Siu
511a9beaa5 Merge pull request #1024 from Dokploy/fix/add-fallback-getIp
refactor: add fallback ipv4
2024-12-29 16:13:48 -06:00
Mauricio Siu
ac8c180ba6 refactor: add fallback ipv4 2024-12-29 16:13:06 -06:00
Mauricio Siu
9a2898ba4f Merge pull request #1023 from Dokploy/1008-s3-provider-dropdown-default-value-reset
fix: add provider value in edit destination
2024-12-29 15:56:50 -06:00
Mauricio Siu
2c258c84eb fix: add provider value in edit destination 2024-12-29 15:56:30 -06:00
Mauricio Siu
36511f34f8 Merge branch 'canary' into refactor-i18n 2024-12-29 15:51:17 -06:00
Mauricio Siu
fee5bbc535 Merge pull request #1022 from Dokploy/fix/cron-jobs
fix: add try catch inside of cron jobs
2024-12-29 15:49:28 -06:00
Mauricio Siu
84ad9a5bb3 refactor: revert notifications 2024-12-29 15:45:54 -06:00
Mauricio Siu
69576988eb Merge pull request #1021 from Dokploy/fix/memory-reservation
Fix/memory reservation
2024-12-29 15:36:14 -06:00
Mauricio Siu
d65d050494 fix: add try catch inside of cron jobs 2024-12-29 15:35:15 -06:00
Mauricio Siu
46a5adf793 refactor: remove muted text 2024-12-29 14:17:15 -06:00
Mauricio Siu
5558ee3248 fix: add tooltip and placeholder values 2024-12-29 14:10:41 -06:00
Mauricio Siu
5d8ebd027e fix: parse correctly numbers 2024-12-29 13:53:38 -06:00
Mauricio Siu
9aa49ce9be Merge pull request #1019 from jocubeit/canary
Spelling and grammar corrections
2024-12-29 13:52:31 -06:00
Mauricio Siu
7bcfc17fe9 Merge pull request #1020 from champ3oy/patch-1
convert email to lower case when loging in
2024-12-29 13:34:27 -06:00
cirlorm
5d2d4104f0 convert email to lower case when loging in
I had an issue signing in to my dashboard only to find out it was because the first letter of my email was in caps.
2024-12-29 17:46:44 +00:00
Dom
2af8d6f565 Spelling and grammar corrections 2024-12-29 22:34:57 +10:00
Mauricio Siu
ba45b27608 Merge pull request #1010 from joaotonaco/canary
feat: prevent layout shifting from scrollbar
2024-12-28 19:31:36 -06:00
Mauricio Siu
5aa1c6efb7 Merge pull request #1011 from joaotonaco/fix/inconsistent-service-card-height
fix: inconsistent service card height
2024-12-28 19:30:42 -06:00
Mauricio Siu
e9dad8f9f8 Merge pull request #1016 from 190km/style/swarm
feat: swarm overview style
2024-12-28 19:30:13 -06:00
Mauricio Siu
0c2a382541 Update apps/dokploy/components/dashboard/settings/servers/show-swarm-overview-modal.tsx 2024-12-28 19:29:51 -06:00
190km
81408985d4 feat: swarm overview style 2024-12-29 01:07:47 +01:00
João Gabriel
d45b558251 fix: inconsistent service card height 2024-12-27 11:08:55 -03:00
João Gabriel
a30b1a0cb8 refactor: prevent layout shifting from scrollbar 2024-12-27 10:51:31 -03:00
João Gabriel
c946e3e01b refactor: prevent layout shifting from scrollbar 2024-12-27 10:50:36 -03:00
190km
f242f5c65e chore: lint 2024-12-26 01:29:18 +01:00
190km
46348f43f6 chore: lint 2024-12-26 01:26:53 +01:00
190km
c3476a1fdf refactor: refactored i18n to display real lang name 2024-12-26 00:04:50 +01:00
UndefinedPony
228d12a61c refactor: code cleanup 2024-12-22 19:01:02 +01:00
UndefinedPony
fd0a9b8b58 feat: add local server config, add local server support in terminal modal, add fixed terminal container height 2024-12-22 18:46:02 +01:00
UndefinedPony
1ea7d2e1bf feat: enable server translations for servers page 2024-12-22 18:44:38 +01:00
UndefinedPony
7e08c8881e refactor: adapt terminal component to pass local server data and add initialized check 2024-12-22 16:37:26 +01:00
UndefinedPony
e68d867d31 refactor: adapt terminal wss to allow local server connection, add status logs 2024-12-22 16:35:28 +01:00
UndefinedPony
a53929a787 feat: add enter terminal option to server dropdown 2024-12-22 16:32:20 +01:00
UndefinedPony
ec8eaf6249 feat: add util to configure and get private ssh key for local ssh connection 2024-12-22 16:31:52 +01:00
UndefinedPony
0d58935ad1 refactor: translations for common terminal stuff 2024-12-22 16:30:53 +01:00
UndefinedPony
e2b155280a feat: add enter terminal translation 2024-12-21 20:08:08 +01:00
234 changed files with 1656 additions and 973 deletions

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -124,7 +124,7 @@ export const AddRedirect = ({
onDialogToggle(false); onDialogToggle(false);
}) })
.catch(() => { .catch(() => {
toast.error("Error to create the redirect"); toast.error("Error creating 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 succesfully"); toast.success("Redirect delete successfully");
}) })
.catch(() => { .catch(() => {
toast.error("Error to delete the redirect"); toast.error("Error deleting the redirect");
}); });
}} }}
> >

View File

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

View File

@@ -75,7 +75,7 @@ export const AddSecurity = ({
setIsOpen(false); setIsOpen(false);
}) })
.catch(() => { .catch(() => {
toast.error("Error to create the security"); toast.error("Error creating 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 succesfully"); toast.success("Security delete successfully");
}) })
.catch(() => { .catch(() => {
toast.error("Error to delete the security"); toast.error("Error deleting the security");
}); });
}} }}
> >

View File

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

View File

@@ -22,6 +22,13 @@ 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(),
@@ -72,7 +79,7 @@ export const ShowApplicationResources = ({ applicationId }: Props) => {
await refetch(); await refetch();
}) })
.catch(() => { .catch(() => {
toast.error("Error to Update the resources"); toast.error("Error updating the resources");
}); });
}; };
return ( return (
@@ -101,10 +108,25 @@ export const ShowApplicationResources = ({ applicationId }: Props) => {
name="memoryReservation" name="memoryReservation"
render={({ field }) => ( render={({ field }) => (
<FormItem> <FormItem>
<FormLabel>Memory Reservation</FormLabel> <div className="flex items-center gap-2">
<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="256 MB" placeholder="268435456 (256MB in bytes)"
{...field} {...field}
value={field.value?.toString() || ""} value={field.value?.toString() || ""}
onChange={(e) => { onChange={(e) => {
@@ -120,7 +142,6 @@ export const ShowApplicationResources = ({ applicationId }: Props) => {
}} }}
/> />
</FormControl> </FormControl>
<FormMessage /> <FormMessage />
</FormItem> </FormItem>
)} )}
@@ -132,10 +153,25 @@ export const ShowApplicationResources = ({ applicationId }: Props) => {
render={({ field }) => { render={({ field }) => {
return ( return (
<FormItem> <FormItem>
<FormLabel>Memory Limit</FormLabel> <div className="flex items-center gap-2">
<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={"1024 MB"} placeholder="1073741824 (1GB in bytes)"
{...field} {...field}
value={field.value?.toString() || ""} value={field.value?.toString() || ""}
onChange={(e) => { onChange={(e) => {
@@ -163,21 +199,36 @@ export const ShowApplicationResources = ({ applicationId }: Props) => {
render={({ field }) => { render={({ field }) => {
return ( return (
<FormItem> <FormItem>
<FormLabel>Cpu Limit</FormLabel> <div className="flex items-center gap-2">
<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={"2"} placeholder="2000000000 (2 CPUs)"
{...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 ( if (value === "") {
value === "" || field.onChange(null);
/^[0-9]*\.?[0-9]*$/.test(value) } else {
) { const number = Number.parseInt(value, 10);
const float = Number.parseFloat(value); if (!Number.isNaN(number)) {
field.onChange(float); field.onChange(number);
}
} }
}} }}
/> />
@@ -193,21 +244,36 @@ export const ShowApplicationResources = ({ applicationId }: Props) => {
render={({ field }) => { render={({ field }) => {
return ( return (
<FormItem> <FormItem>
<FormLabel>Cpu Reservation</FormLabel> <div className="flex items-center gap-2">
<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={"1"} placeholder="1000000000 (1 CPU)"
{...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 ( if (value === "") {
value === "" || field.onChange(null);
/^[0-9]*\.?[0-9]*$/.test(value) } else {
) { const number = Number.parseInt(value, 10);
const float = Number.parseFloat(value); if (!Number.isNaN(number)) {
field.onChange(float); field.onChange(number);
}
} }
}} }}
/> />

View File

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

View File

@@ -107,7 +107,7 @@ export const AddVolumes = ({
setIsOpen(false); setIsOpen(false);
}) })
.catch(() => { .catch(() => {
toast.error("Error to create the Bind mount"); toast.error("Error creating 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 to create the Volume mount"); toast.error("Error creating 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 to create the File mount"); toast.error("Error creating the File mount");
}); });
} }

View File

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

View File

@@ -139,7 +139,7 @@ export const UpdateVolume = ({
setIsOpen(false); setIsOpen(false);
}) })
.catch(() => { .catch(() => {
toast.error("Error to update the Bind mount"); toast.error("Error updating 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 to update the Volume mount"); toast.error("Error updating 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 to update the File mount"); toast.error("Error updating 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 to save the build type"); toast.error("Error saving 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 to update the refresh token"); toast.error("Error updating 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 to update the domain" ? "Error updating the domain"
: "Error to create the domain", : "Error creating 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 succesfully"); toast.success("Domain delete successfully");
}) })
.catch(() => { .catch(() => {
toast.error("Error to delete Domain"); toast.error("Error deleting the Domain");
}); });
}} }}
> >

View File

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

View File

@@ -51,7 +51,7 @@ export const DeployApplication = ({ applicationId }: Props) => {
applicationId, applicationId,
}) })
.then(async () => { .then(async () => {
toast.success("Application deployed succesfully"); toast.success("Application deployed successfully");
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 to deploy Application"); toast.error("Error deploying the 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 to save the Bitbucket provider"); toast.error("Error saving the Bitbucket provider");
}); });
}; };

View File

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

View File

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

View File

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

View File

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

View File

@@ -144,7 +144,7 @@ export const SaveGitlabProvider = ({ applicationId }: Props) => {
await refetch(); await refetch();
}) })
.catch(() => { .catch(() => {
toast.error("Error to save the gitlab provider"); toast.error("Error saving 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 to reload the service"); toast.error("Error reloading 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 to update Auto Deploy"); toast.error("Error updating Auto Deploy");
}); });
}} }}
className="flex flex-row gap-2 items-center" className="flex flex-row gap-2 items-center"

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 to update the domain" ? "Error updating the domain"
: "Error to create the domain", : "Error creating 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 to rebuild the application"); toast.error("Error rebuilding 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 succesfully"); toast.success("Application started successfully");
}) })
.catch(() => { .catch(() => {
toast.error("Error to start the Application"); toast.error("Error starting 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 succesfully"); toast.success("Application stopped successfully");
}) })
.catch(() => { .catch(() => {
toast.error("Error to stop the Application"); toast.error("Error stopping 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 succesfully"); toast.success("Application updated successfully");
utils.application.one.invalidate({ utils.application.one.invalidate({
applicationId: applicationId, applicationId: applicationId,
}); });
setIsOpen(false); setIsOpen(false);
}) })
.catch(() => { .catch(() => {
toast.error("Error to update the application"); toast.error("Error updating the Application");
}) })
.finally(() => {}); .finally(() => {});
}; };

View File

@@ -82,7 +82,7 @@ export const AddCommandCompose = ({ composeId }: Props) => {
}); });
}) })
.catch(() => { .catch(() => {
toast.error("Error to update the command"); toast.error("Error updating 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 to update the refresh token"); toast.error("Error updating 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 to update the domain" ? "Error updating the domain"
: "Error to create the domain", : "Error creating 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 to add environment"); toast.error("Error adding environment");
}); });
}; };

View File

@@ -83,7 +83,7 @@ export const ComposeActions = ({ composeId }: Props) => {
await refetch(); await refetch();
}) })
.catch(() => { .catch(() => {
toast.error("Error to update Auto Deploy"); toast.error("Error updating 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 to update the compose config"); toast.error("Error updating the Compose config");
}); });
}; };
return ( return (

View File

@@ -57,7 +57,7 @@ export const DeployCompose = ({ composeId }: Props) => {
); );
}) })
.catch(() => { .catch(() => {
toast.error("Error to deploy Compose"); toast.error("Error deploying 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 to save the Bitbucket provider"); toast.error("Error saving the Bitbucket provider");
}); });
}; };

View File

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

View File

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

View File

@@ -146,7 +146,7 @@ export const SaveGitlabProviderCompose = ({ composeId }: Props) => {
await refetch(); await refetch();
}) })
.catch(() => { .catch(() => {
toast.error("Error to save the gitlab provider"); toast.error("Error saving 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 to randomize the compose"); toast.error("Error randomizing the compose");
}); });
}; };
@@ -105,7 +105,7 @@ export const RandomizeCompose = ({ composeId }: Props) => {
toast.success("Compose randomized"); toast.success("Compose randomized");
}) })
.catch(() => { .catch(() => {
toast.error("Error to randomize the compose"); toast.error("Error randomizing the compose");
}); });
}; };

View File

@@ -62,7 +62,7 @@ export const RedbuildCompose = ({ composeId }: Props) => {
}); });
}) })
.catch(() => { .catch(() => {
toast.error("Error to rebuild the compose"); toast.error("Error rebuilding 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 to fetch source type", { toast.error("Error fetching 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 succesfully"); toast.success("Compose stopped successfully");
}) })
.catch(() => { .catch(() => {
toast.error("Error to stop the compose"); toast.error("Error stopping the compose");
}); });
}} }}
> >

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 succesfully"); toast.success("Compose started successfully");
}) })
.catch(() => { .catch(() => {
toast.error("Error to start the Compose"); toast.error("Error starting 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 succesfully"); toast.success("Compose stopped successfully");
}) })
.catch(() => { .catch(() => {
toast.error("Error to stop the Compose"); toast.error("Error stopping 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 succesfully"); toast.success("Compose updated successfully");
utils.compose.one.invalidate({ utils.compose.one.invalidate({
composeId: composeId, composeId: composeId,
}); });
setIsOpen(false); setIsOpen(false);
}) })
.catch(() => { .catch(() => {
toast.error("Error to update the Compose"); toast.error("Error updating the Compose");
}) })
.finally(() => {}); .finally(() => {});
}; };

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -18,6 +18,13 @@ 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";
@@ -71,7 +78,7 @@ export const ShowMariadbResources = ({ mariadbId }: Props) => {
await refetch(); await refetch();
}) })
.catch(() => { .catch(() => {
toast.error("Error to Update the resources"); toast.error("Error updating the resources");
}); });
}; };
return ( return (
@@ -100,28 +107,40 @@ export const ShowMariadbResources = ({ mariadbId }: Props) => {
name="memoryReservation" name="memoryReservation"
render={({ field }) => ( render={({ field }) => (
<FormItem> <FormItem>
<FormLabel>Memory Reservation</FormLabel> <div className="flex items-center gap-2">
<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="256 MB" placeholder="268435456 (256MB in bytes)"
{...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>
)} )}
@@ -133,21 +152,34 @@ export const ShowMariadbResources = ({ mariadbId }: Props) => {
render={({ field }) => { render={({ field }) => {
return ( return (
<FormItem> <FormItem>
<FormLabel>Memory Limit</FormLabel> <div className="flex items-center gap-2">
<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={"1024 MB"} placeholder="1073741824 (1GB in bytes)"
{...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);
} }
} }
@@ -166,21 +198,34 @@ export const ShowMariadbResources = ({ mariadbId }: Props) => {
render={({ field }) => { render={({ field }) => {
return ( return (
<FormItem> <FormItem>
<FormLabel>Cpu Limit</FormLabel> <div className="flex items-center gap-2">
<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={"2"} placeholder="2000000000 (2 CPUs)"
{...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,21 +243,34 @@ export const ShowMariadbResources = ({ mariadbId }: Props) => {
render={({ field }) => { render={({ field }) => {
return ( return (
<FormItem> <FormItem>
<FormLabel>Cpu Reservation</FormLabel> <div className="flex items-center gap-2">
<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={"1"} placeholder="1000000000 (1 CPU)"
{...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 to Create the manual backup", "Error creating the manual backup",
); );
}); });
}} }}

View File

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

View File

@@ -55,12 +55,12 @@ export const DeployMariadb = ({ mariadbId }: Props) => {
await deploy({ await deploy({
mariadbId, mariadbId,
}).catch(() => { }).catch(() => {
toast.error("Error to deploy Database"); toast.error("Error deploying Database");
}); });
await refetch(); await refetch();
}) })
.catch((e) => { .catch((e) => {
toast.error(e.message || "Error to deploy Database"); toast.error(e.message || "Error deploying 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 to reload the service"); toast.error("Error reloading 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 to save the external port"); toast.error("Error saving 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 succesfully"); toast.success("Application stopped successfully");
}) })
.catch(() => { .catch(() => {
toast.error("Error to stop the Application"); toast.error("Error stopping 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 succesfully"); toast.success("Database started successfully");
}) })
.catch(() => { .catch(() => {
toast.error("Error to start the Database"); toast.error("Error starting 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 succesfully"); toast.success("MariaDB updated successfully");
utils.mariadb.one.invalidate({ utils.mariadb.one.invalidate({
mariadbId: mariadbId, mariadbId: mariadbId,
}); });
}) })
.catch(() => { .catch(() => {
toast.error("Error to update the Mariadb"); toast.error("Error updating the Mariadb");
}) })
.finally(() => {}); .finally(() => {});
}; };

View File

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

View File

@@ -19,6 +19,13 @@ 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";
@@ -71,7 +78,7 @@ export const ShowMongoResources = ({ mongoId }: Props) => {
await refetch(); await refetch();
}) })
.catch(() => { .catch(() => {
toast.error("Error to Update the resources"); toast.error("Error updating the resources");
}); });
}; };
return ( return (
@@ -89,10 +96,6 @@ 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)}
@@ -104,28 +107,40 @@ export const ShowMongoResources = ({ mongoId }: Props) => {
name="memoryReservation" name="memoryReservation"
render={({ field }) => ( render={({ field }) => (
<FormItem> <FormItem>
<FormLabel>Memory Reservation</FormLabel> <div className="flex items-center gap-2">
<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="256 MB" placeholder="268435456 (256MB in bytes)"
{...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>
)} )}
@@ -137,21 +152,34 @@ export const ShowMongoResources = ({ mongoId }: Props) => {
render={({ field }) => { render={({ field }) => {
return ( return (
<FormItem> <FormItem>
<FormLabel>Memory Limit</FormLabel> <div className="flex items-center gap-2">
<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={"1024 MB"} placeholder="1073741824 (1GB in bytes)"
{...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);
} }
} }
@@ -170,21 +198,34 @@ export const ShowMongoResources = ({ mongoId }: Props) => {
render={({ field }) => { render={({ field }) => {
return ( return (
<FormItem> <FormItem>
<FormLabel>Cpu Limit</FormLabel> <div className="flex items-center gap-2">
<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={"2"} placeholder="2000000000 (2 CPUs)"
{...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);
} }
} }
@@ -202,21 +243,34 @@ export const ShowMongoResources = ({ mongoId }: Props) => {
render={({ field }) => { render={({ field }) => {
return ( return (
<FormItem> <FormItem>
<FormLabel>Cpu Reservation</FormLabel> <div className="flex items-center gap-2">
<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={"1"} placeholder="1000000000 (1 CPU)"
{...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 to Create the manual backup", "Error creating the manual backup",
); );
}); });
}} }}

View File

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

View File

@@ -55,12 +55,12 @@ export const DeployMongo = ({ mongoId }: Props) => {
await deploy({ await deploy({
mongoId, mongoId,
}).catch(() => { }).catch(() => {
toast.error("Error to deploy Database"); toast.error("Error deploying Database");
}); });
await refetch(); await refetch();
}) })
.catch((e) => { .catch((e) => {
toast.error(e.message || "Error to deploy Database"); toast.error(e.message || "Error deploying 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 to reload the service"); toast.error("Error reloading 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 to save the external port"); toast.error("Error saving 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 succesfully"); toast.success("Application stopped successfully");
}) })
.catch(() => { .catch(() => {
toast.error("Error to stop the Application"); toast.error("Error stopping 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 succesfully"); toast.success("Database started successfully");
}) })
.catch(() => { .catch(() => {
toast.error("Error to start the Database"); toast.error("Error starting 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 succesfully"); toast.success("Mongo updated successfully");
utils.mongo.one.invalidate({ utils.mongo.one.invalidate({
mongoId: mongoId, mongoId: mongoId,
}); });
setIsOpen(false); setIsOpen(false);
}) })
.catch(() => { .catch(() => {
toast.error("Error to update mongo database"); toast.error("Error updating mongo database");
}) })
.finally(() => {}); .finally(() => {});
}; };

View File

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

View File

@@ -20,6 +20,13 @@ 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";
@@ -71,7 +78,7 @@ export const ShowMysqlResources = ({ mysqlId }: Props) => {
await refetch(); await refetch();
}) })
.catch(() => { .catch(() => {
toast.error("Error to Update the resources"); toast.error("Error updating the resources");
}); });
}; };
return ( return (
@@ -100,28 +107,40 @@ export const ShowMysqlResources = ({ mysqlId }: Props) => {
name="memoryReservation" name="memoryReservation"
render={({ field }) => ( render={({ field }) => (
<FormItem> <FormItem>
<FormLabel>Memory Reservation</FormLabel> <div className="flex items-center gap-2">
<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="256 MB" placeholder="268435456 (256MB in bytes)"
{...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>
)} )}
@@ -133,21 +152,34 @@ export const ShowMysqlResources = ({ mysqlId }: Props) => {
render={({ field }) => { render={({ field }) => {
return ( return (
<FormItem> <FormItem>
<FormLabel>Memory Limit</FormLabel> <div className="flex items-center gap-2">
<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={"1024 MB"} placeholder="1073741824 (1GB in bytes)"
{...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);
} }
} }
@@ -166,21 +198,34 @@ export const ShowMysqlResources = ({ mysqlId }: Props) => {
render={({ field }) => { render={({ field }) => {
return ( return (
<FormItem> <FormItem>
<FormLabel>Cpu Limit</FormLabel> <div className="flex items-center gap-2">
<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={"2"} placeholder="2000000000 (2 CPUs)"
{...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,21 +243,34 @@ export const ShowMysqlResources = ({ mysqlId }: Props) => {
render={({ field }) => { render={({ field }) => {
return ( return (
<FormItem> <FormItem>
<FormLabel>Cpu Reservation</FormLabel> <div className="flex items-center gap-2">
<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={"1"} placeholder="1000000000 (1 CPU)"
{...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 to Create the manual backup", "Error creating the manual backup",
); );
}); });
}} }}

View File

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

View File

@@ -55,12 +55,12 @@ export const DeployMysql = ({ mysqlId }: Props) => {
await deploy({ await deploy({
mysqlId, mysqlId,
}).catch(() => { }).catch(() => {
toast.error("Error to deploy Database"); toast.error("Error deploying Database");
}); });
await refetch(); await refetch();
}) })
.catch((e) => { .catch((e) => {
toast.error(e.message || "Error to deploy Database"); toast.error(e.message || "Error deploying 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 to reload the service"); toast.error("Error reloading 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 to save the external port"); toast.error("Error saving 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("Application stopped succesfully"); toast.success("MySQL stopped successfully");
}) })
.catch(() => { .catch(() => {
toast.error("Error to stop the Application"); toast.error("Error stopping MySQL");
}); });
}} }}
> >

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 succesfully"); toast.success("Database started successfully");
}) })
.catch(() => { .catch(() => {
toast.error("Error to start the Database"); toast.error("Error starting 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 succesfully"); toast.success("MySQL updated successfully");
utils.mysql.one.invalidate({ utils.mysql.one.invalidate({
mysqlId: mysqlId, mysqlId: mysqlId,
}); });
}) })
.catch(() => { .catch(() => {
toast.error("Error to update the MySQL"); toast.error("Error updating MySQL");
}) })
.finally(() => {}); .finally(() => {});
}; };

View File

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

View File

@@ -21,6 +21,13 @@ 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({
@@ -71,7 +78,7 @@ export const ShowPostgresResources = ({ postgresId }: Props) => {
await refetch(); await refetch();
}) })
.catch(() => { .catch(() => {
toast.error("Error to Update the resources"); toast.error("Error updating the resources");
}); });
}; };
return ( return (
@@ -100,10 +107,25 @@ export const ShowPostgresResources = ({ postgresId }: Props) => {
name="memoryReservation" name="memoryReservation"
render={({ field }) => ( render={({ field }) => (
<FormItem> <FormItem>
<FormLabel>Memory Reservation</FormLabel> <div className="flex items-center gap-2">
<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="256 MB" placeholder="268435456 (256MB in bytes)"
{...field} {...field}
value={field.value?.toString() || ""} value={field.value?.toString() || ""}
onChange={(e) => { onChange={(e) => {
@@ -119,7 +141,6 @@ export const ShowPostgresResources = ({ postgresId }: Props) => {
}} }}
/> />
</FormControl> </FormControl>
<FormMessage /> <FormMessage />
</FormItem> </FormItem>
)} )}
@@ -131,10 +152,25 @@ export const ShowPostgresResources = ({ postgresId }: Props) => {
render={({ field }) => { render={({ field }) => {
return ( return (
<FormItem> <FormItem>
<FormLabel>Memory Limit</FormLabel> <div className="flex items-center gap-2">
<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={"1024 MB"} placeholder="1073741824 (1GB in bytes)"
{...field} {...field}
value={field.value?.toString() || ""} value={field.value?.toString() || ""}
onChange={(e) => { onChange={(e) => {
@@ -162,10 +198,25 @@ export const ShowPostgresResources = ({ postgresId }: Props) => {
render={({ field }) => { render={({ field }) => {
return ( return (
<FormItem> <FormItem>
<FormLabel>Cpu Limit</FormLabel> <div className="flex items-center gap-2">
<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={"2"} placeholder="2000000000 (2 CPUs)"
{...field} {...field}
value={field.value?.toString() || ""} value={field.value?.toString() || ""}
onChange={(e) => { onChange={(e) => {
@@ -192,10 +243,25 @@ export const ShowPostgresResources = ({ postgresId }: Props) => {
render={({ field }) => { render={({ field }) => {
return ( return (
<FormItem> <FormItem>
<FormLabel>Cpu Reservation</FormLabel> <div className="flex items-center gap-2">
<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={"1"} placeholder="1000000000 (1 CPU)"
{...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 to Create the manual backup", "Error creating the manual backup",
); );
}); });
}} }}

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -104,7 +104,7 @@ export const AddApplication = ({ projectId, projectName }: Props) => {
}); });
}) })
.catch((e) => { .catch((e) => {
toast.error("Error to create the service"); toast.error("Error creating the service");
}); });
}; };
@@ -176,7 +176,7 @@ export const AddApplication = ({ projectId, projectName }: Props) => {
side="top" side="top"
> >
<span> <span>
If not server is selected, the application will be If no server is selected, the application will be
deployed on the server where the user is logged in. deployed on the server where the user is logged in.
</span> </span>
</TooltipContent> </TooltipContent>
@@ -229,7 +229,7 @@ export const AddApplication = ({ projectId, projectName }: Props) => {
<FormLabel>Description</FormLabel> <FormLabel>Description</FormLabel>
<FormControl> <FormControl>
<Textarea <Textarea
placeholder="Description about your service..." placeholder="Description of your service..."
className="resize-none" className="resize-none"
{...field} {...field}
/> />

View File

@@ -108,7 +108,7 @@ export const AddCompose = ({ projectId, projectName }: Props) => {
}); });
}) })
.catch(() => { .catch(() => {
toast.error("Error to create the compose"); toast.error("Error creating the compose");
}); });
}; };
@@ -183,7 +183,7 @@ export const AddCompose = ({ projectId, projectName }: Props) => {
side="top" side="top"
> >
<span> <span>
If not server is selected, the application will be If no server is selected, the application will be
deployed on the server where the user is logged in. deployed on the server where the user is logged in.
</span> </span>
</TooltipContent> </TooltipContent>
@@ -262,7 +262,7 @@ export const AddCompose = ({ projectId, projectName }: Props) => {
<FormLabel>Description</FormLabel> <FormLabel>Description</FormLabel>
<FormControl> <FormControl>
<Textarea <Textarea
placeholder="Description about your service..." placeholder="Description of your service..."
className="resize-none" className="resize-none"
{...field} {...field}
/> />

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