diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml index 85c703e88..0119a8be9 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.yml +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -31,6 +31,7 @@ body: label: Version description: What version of Homarr are you running? options: + - 1.4.0 - 1.3.1 - 1.3.0 - 1.2.0 diff --git a/Dockerfile b/Dockerfile index 0ed176321..d971c346d 100644 --- a/Dockerfile +++ b/Dockerfile @@ -10,6 +10,8 @@ RUN apk add --no-cache libc6-compat curl bash RUN apk update COPY . . +# Install working version of corepack (See https://github.com/nodejs/corepack/issues/612) +RUN npm install -g corepack@0.31.0 && corepack --version RUN corepack enable pnpm && pnpm install --recursive --frozen-lockfile # Copy static data as it is not part of the build @@ -17,6 +19,8 @@ COPY static-data ./static-data ARG SKIP_ENV_VALIDATION='true' ARG CI='true' ARG DISABLE_REDIS_LOGS='true' +# Install working version of corepack (See https://github.com/nodejs/corepack/issues/612) +RUN npm install -g corepack@0.31.0 && corepack --version RUN corepack enable pnpm && pnpm build FROM base AS runner @@ -66,4 +70,4 @@ ENV AUTH_PROVIDERS='credentials' ENV NODE_ENV='production' ENTRYPOINT [ "/app/entrypoint.sh" ] -CMD ["sh", "run.sh"] \ No newline at end of file +CMD ["sh", "run.sh"] diff --git a/apps/nextjs/package.json b/apps/nextjs/package.json index 39c1e3f6b..35aabdebe 100644 --- a/apps/nextjs/package.json +++ b/apps/nextjs/package.json @@ -50,7 +50,7 @@ "@mantine/tiptap": "^7.16.2", "@million/lint": "1.0.14", "@t3-oss/env-nextjs": "^0.12.0", - "@tabler/icons-react": "^3.29.0", + "@tabler/icons-react": "^3.30.0", "@tanstack/react-query": "^5.66.0", "@tanstack/react-query-devtools": "^5.66.0", "@tanstack/react-query-next-experimental": "^5.66.0", @@ -67,7 +67,7 @@ "dotenv": "^16.4.7", "flag-icons": "^7.3.2", "glob": "^11.0.1", - "jotai": "^2.11.2", + "jotai": "^2.11.3", "mantine-react-table": "2.0.0-beta.8", "next": "15.1.6", "postcss-preset-mantine": "^1.17.0", @@ -76,7 +76,7 @@ "react-dom": "19.0.0", "react-error-boundary": "^5.0.0", "react-simple-code-editor": "^0.14.1", - "sass": "^1.83.4", + "sass": "^1.84.0", "superjson": "2.2.2", "swagger-ui-react": "^5.18.3", "use-deep-compare-effect": "^1.8.1", @@ -87,7 +87,7 @@ "@homarr/prettier-config": "workspace:^0.1.0", "@homarr/tsconfig": "workspace:^0.1.0", "@types/chroma-js": "3.1.1", - "@types/node": "^22.12.0", + "@types/node": "^22.13.1", "@types/prismjs": "^1.26.5", "@types/react": "19.0.8", "@types/react-dom": "19.0.3", diff --git a/apps/nextjs/src/app/[locale]/manage/_components/hero-banner.module.css b/apps/nextjs/src/app/[locale]/manage/_components/hero-banner.module.css index f3b4141aa..2b949c990 100644 --- a/apps/nextjs/src/app/[locale]/manage/_components/hero-banner.module.css +++ b/apps/nextjs/src/app/[locale]/manage/_components/hero-banner.module.css @@ -1,5 +1,5 @@ .bannerContainer { - border-radius: 8px; + border-radius: 16px; overflow: hidden; @mixin dark { background: linear-gradient( diff --git a/apps/nextjs/src/app/[locale]/manage/apps/_form.tsx b/apps/nextjs/src/app/[locale]/manage/apps/_form.tsx index 75d75e472..ab1121f02 100644 --- a/apps/nextjs/src/app/[locale]/manage/apps/_form.tsx +++ b/apps/nextjs/src/app/[locale]/manage/apps/_form.tsx @@ -1,11 +1,11 @@ "use client"; +import { useRef } from "react"; import Link from "next/link"; import { Button, Group, Stack, Textarea, TextInput } from "@mantine/core"; import type { z } from "zod"; import { useZodForm } from "@homarr/form"; -import type { TranslationFunction } from "@homarr/translation"; import { useI18n } from "@homarr/translation/client"; import { validation } from "@homarr/validation"; @@ -14,14 +14,21 @@ import { IconPicker } from "~/components/icons/picker/icon-picker"; type FormType = z.infer; interface AppFormProps { - submitButtonTranslation: (t: TranslationFunction) => string; + buttonLabels: { + submit: string; + submitAndCreateAnother?: string; + }; initialValues?: FormType; - handleSubmit: (values: FormType) => void; + handleSubmit: (values: FormType, redirect: boolean, afterSuccess?: () => void) => void; isPending: boolean; } -export const AppForm = (props: AppFormProps) => { - const { submitButtonTranslation, handleSubmit, initialValues, isPending } = props; +export const AppForm = ({ + buttonLabels, + handleSubmit: originalHandleSubmit, + initialValues, + isPending, +}: AppFormProps) => { const t = useI18n(); const form = useZodForm(validation.app.manage, { @@ -33,11 +40,23 @@ export const AppForm = (props: AppFormProps) => { }, }); + const shouldCreateAnother = useRef(false); + const handleSubmit = (values: FormType) => { + const redirect = !shouldCreateAnother.current; + const afterSuccess = shouldCreateAnother.current + ? () => { + form.reset(); + shouldCreateAnother.current = false; + } + : undefined; + originalHandleSubmit(values, redirect, afterSuccess); + }; + return (
- +