Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

chore(release): automatic release v0.1.0 #1235

Merged
merged 38 commits into from
Oct 4, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
38 commits
Select commit Hold shift + click to select a range
1994a59
fix(deps): update dependency @auth/core to ^0.35.3 (#1193)
homarr-renovate[bot] Sep 27, 2024
adb59b2
fix(deps): update dependency @auth/drizzle-adapter to ^1.5.3 (#1194)
homarr-renovate[bot] Sep 27, 2024
9af01bb
fix(deps): update dependency sass to ^1.79.4 (#1198)
homarr-renovate[bot] Sep 28, 2024
c3e1ce3
fix(deps): update dependency next-auth to v5.0.0-beta.22 (#1195)
homarr-renovate[bot] Sep 28, 2024
8aaa4f5
fix(deps): update dependency @tabler/icons-react to ^3.19.0 (#1197)
homarr-renovate[bot] Sep 28, 2024
08c6303
feat: add healthchecks (#1187)
manuel-rw Sep 28, 2024
42a49e6
fix(spotlight): x button not clickable, help links open in current ta…
Meierschlumpf Sep 28, 2024
6ce466d
fix(deps): update mantine monorepo to ^7.13.1 (#1205)
homarr-renovate[bot] Sep 30, 2024
0f56dc1
feat: OMV integration & health monitoring widget (#1142)
hillaliy Sep 30, 2024
0c24cc1
chore(deps): update dependency @vitejs/plugin-react to ^4.3.2 (#1204)
homarr-renovate[bot] Sep 30, 2024
7dd4d4e
fix(deps): update tiptap monorepo to v2.8.0 (#1206)
homarr-renovate[bot] Sep 30, 2024
233033f
fix(deps): update dependency typescript-eslint to ^8.8.0 (#1207)
homarr-renovate[bot] Sep 30, 2024
f24c068
fix: sensitive data can be leaked through query parameters (#1208)
Meierschlumpf Sep 30, 2024
1b0d927
fix(deps): update dependency ldapts to v7.2.1 (#1211)
homarr-renovate[bot] Sep 30, 2024
b3f6645
fix(deps): update dependency @million/lint to v1.0.0 (#1212)
homarr-renovate[bot] Oct 1, 2024
f73dff5
chore(deps): update turbo monorepo to ^2.1.3 (#1209)
homarr-renovate[bot] Oct 1, 2024
4a8ed13
fix(deps): update dependency eslint-plugin-react to ^7.37.1 (#1213)
homarr-renovate[bot] Oct 1, 2024
6133309
feat: add member sync between groups of ldap and homarr (#1149)
Meierschlumpf Oct 1, 2024
c3d54b4
fix(deps): update tanstack-query monorepo to ^5.59.0 (#1214)
homarr-renovate[bot] Oct 1, 2024
6f5c993
fix(deps): update nextjs monorepo to ^14.2.14 (#1215)
homarr-renovate[bot] Oct 1, 2024
2f3619b
fix(deps): update dependency tldts to ^6.1.49 (#1216)
homarr-renovate[bot] Oct 2, 2024
d63f6d2
fix: it was possible to go to the create user page when credentials l…
Meierschlumpf Oct 2, 2024
8b5ea3c
fix: email verified check is in a newline in users table (#1218)
Meierschlumpf Oct 2, 2024
bc46446
chore(deps): update pnpm to v9.12.0 (#1220)
homarr-renovate[bot] Oct 2, 2024
3277754
chore(deps): update dependency @types/react to ^18.3.11 (#1221)
homarr-renovate[bot] Oct 2, 2024
59ab63c
chore(deps): update vitest monorepo to ^2.1.2 (#1222)
homarr-renovate[bot] Oct 2, 2024
9d20362
fix(deps): update dependency eslint-plugin-import to ^2.31.0 (#1226)
homarr-renovate[bot] Oct 3, 2024
d383664
fix(deps): update mantine monorepo to ^7.13.2 (#1227)
homarr-renovate[bot] Oct 3, 2024
17572bc
fix(deps): update dependency tldts to ^6.1.50 (#1228)
homarr-renovate[bot] Oct 3, 2024
770a0d6
fix(deps): update dependency @million/lint to v1.0.7 (#1225)
homarr-renovate[bot] Oct 3, 2024
52b45d8
feat(docker): add encryption key generation for integration secrets (…
Meierschlumpf Oct 3, 2024
8dde6bb
chore(deps): update dependency node to v20.18.0 (#1229)
homarr-renovate[bot] Oct 3, 2024
665df53
fix: new sections without add and change listeners (#1230)
Meierschlumpf Oct 3, 2024
547287d
fix(deps): update dependency @million/lint to v1.0.8 (#1231)
homarr-renovate[bot] Oct 3, 2024
ac07504
fix: confirm not selected by default in confirm modal (#1232)
Meierschlumpf Oct 3, 2024
8ea8b2d
fix(deps): update testcontainers-node monorepo to ^10.13.2 (#1233)
homarr-renovate[bot] Oct 4, 2024
4c9471e
feat(spotlight): add support for custom search-engines (#1200)
Meierschlumpf Oct 4, 2024
87b46de
chore(deps): update node.js to v20.18.0 (#1234)
homarr-renovate[bot] Oct 4, 2024
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,7 @@ yarn-error.log*
apps/tasks/tasks.cjs
apps/websocket/wssServer.cjs
apps/nextjs/.million/
packages/cli/cli.cjs


#personal backgrounds
Expand Down
2 changes: 1 addition & 1 deletion .nvmrc
Original file line number Diff line number Diff line change
@@ -1 +1 @@
20.17.0
20.18.0
7 changes: 6 additions & 1 deletion Dockerfile
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
FROM node:20.17.0-alpine AS base
FROM node:20.18.0-alpine AS base

FROM base AS builder
RUN apk add --no-cache libc6-compat
Expand Down Expand Up @@ -46,6 +46,7 @@ COPY --from=builder /app/cli-out/full/ .
# Copy static data as it is not part of the build
COPY static-data ./static-data
ARG SKIP_ENV_VALIDATION='true'
ARG CI='true'
ARG DISABLE_REDIS_LOGS='true'
RUN corepack enable pnpm && pnpm build

Expand All @@ -58,6 +59,8 @@ RUN mkdir /appdata
RUN mkdir /appdata/db
RUN mkdir /appdata/redis
VOLUME /appdata
RUN mkdir /secrets
VOLUME /secrets



Expand All @@ -71,6 +74,7 @@ RUN chmod +x /usr/bin/homarr

# Don't run production as root
RUN chown -R nextjs:nodejs /appdata
RUN chown -R nextjs:nodejs /secrets
RUN mkdir -p /var/cache/nginx && chown -R nextjs:nodejs /var/cache/nginx && \
mkdir -p /var/log/nginx && chown -R nextjs:nodejs /var/log/nginx && \
mkdir -p /var/lib/nginx && chown -R nextjs:nodejs /var/lib/nginx && \
Expand All @@ -93,6 +97,7 @@ COPY --from=installer --chown=nextjs:nodejs /app/apps/nextjs/.next/standalone ./
COPY --from=installer --chown=nextjs:nodejs /app/apps/nextjs/.next/static ./apps/nextjs/.next/static
COPY --from=installer --chown=nextjs:nodejs /app/apps/nextjs/public ./apps/nextjs/public
COPY --chown=nextjs:nodejs scripts/run.sh ./run.sh
COPY --chown=nextjs:nodejs scripts/generateEncryptionKey.js ./generateEncryptionKey.js
COPY --chown=nextjs:nodejs packages/redis/redis.conf /app/redis.conf
COPY --chown=nextjs:nodejs nginx.conf /etc/nginx/templates/nginx.conf

Expand Down
27 changes: 14 additions & 13 deletions apps/nextjs/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -30,23 +30,24 @@
"@homarr/modals-collection": "workspace:^0.1.0",
"@homarr/notifications": "workspace:^0.1.0",
"@homarr/old-schema": "workspace:^0.1.0",
"@homarr/redis": "workspace:^0.1.0",
"@homarr/server-settings": "workspace:^0.1.0",
"@homarr/spotlight": "workspace:^0.1.0",
"@homarr/translation": "workspace:^0.1.0",
"@homarr/ui": "workspace:^0.1.0",
"@homarr/validation": "workspace:^0.1.0",
"@homarr/widgets": "workspace:^0.1.0",
"@mantine/colors-generator": "^7.13.0",
"@mantine/core": "^7.13.0",
"@mantine/hooks": "^7.13.0",
"@mantine/modals": "^7.13.0",
"@mantine/tiptap": "^7.13.0",
"@million/lint": "1.0.0-rc.84",
"@mantine/colors-generator": "^7.13.2",
"@mantine/core": "^7.13.2",
"@mantine/hooks": "^7.13.2",
"@mantine/modals": "^7.13.2",
"@mantine/tiptap": "^7.13.2",
"@million/lint": "1.0.8",
"@t3-oss/env-nextjs": "^0.11.1",
"@tabler/icons-react": "^3.18.0",
"@tanstack/react-query": "^5.56.2",
"@tanstack/react-query-devtools": "^5.58.0",
"@tanstack/react-query-next-experimental": "5.56.2",
"@tabler/icons-react": "^3.19.0",
"@tanstack/react-query": "^5.59.0",
"@tanstack/react-query-devtools": "^5.59.0",
"@tanstack/react-query-next-experimental": "5.59.0",
"@trpc/client": "next",
"@trpc/next": "next",
"@trpc/react-query": "next",
Expand All @@ -62,14 +63,14 @@
"glob": "^11.0.0",
"jotai": "^2.10.0",
"mantine-react-table": "2.0.0-beta.6",
"next": "^14.2.13",
"next": "^14.2.14",
"postcss-preset-mantine": "^1.17.0",
"prismjs": "^1.29.0",
"react": "^18.3.1",
"react-dom": "^18.3.1",
"react-error-boundary": "^4.0.13",
"react-simple-code-editor": "^0.14.1",
"sass": "^1.79.3",
"sass": "^1.79.4",
"superjson": "2.2.1",
"swagger-ui-react": "^5.17.14",
"use-deep-compare-effect": "^1.8.1"
Expand All @@ -81,7 +82,7 @@
"@types/chroma-js": "2.4.4",
"@types/node": "^20.16.10",
"@types/prismjs": "^1.26.4",
"@types/react": "^18.3.10",
"@types/react": "^18.3.11",
"@types/react-dom": "^18.3.0",
"@types/swagger-ui-react": "^4.18.3",
"concurrently": "^9.0.1",
Expand Down
2 changes: 1 addition & 1 deletion apps/nextjs/src/app/[locale]/manage/apps/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -105,7 +105,7 @@ const AppNoResults = async () => {
<Text fw={500} size="lg">
{t("app.page.list.noResults.title")}
</Text>
<Anchor href="/manage/apps/new">{t("app.page.list.noResults.description")}</Anchor>
<Anchor href="/manage/apps/new">{t("app.page.list.noResults.action")}</Anchor>
</Stack>
</Card>
);
Expand Down
6 changes: 6 additions & 0 deletions apps/nextjs/src/app/[locale]/manage/layout.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ import {
IconPlug,
IconQuestionMark,
IconReport,
IconSearch,
IconSettings,
IconTool,
IconUser,
Expand Down Expand Up @@ -53,6 +54,11 @@ export default async function ManageLayout({ children }: PropsWithChildren) {
href: "/manage/integrations",
label: t("items.integrations"),
},
{
icon: IconSearch,
href: "/manage/search-engines",
label: t("items.searchEngies"),
},
{
icon: IconUser,
label: t("items.users.label"),
Expand Down
73 changes: 73 additions & 0 deletions apps/nextjs/src/app/[locale]/manage/search-engines/_form.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
"use client";

import Link from "next/link";
import { Button, Grid, Group, Stack, Textarea, TextInput } from "@mantine/core";

import { useZodForm } from "@homarr/form";
import type { TranslationFunction } from "@homarr/translation";
import { useI18n } from "@homarr/translation/client";
import type { z } from "@homarr/validation";
import { validation } from "@homarr/validation";

import { IconPicker } from "~/components/icons/picker/icon-picker";

type FormType = z.infer<typeof validation.searchEngine.manage>;

interface SearchEngineFormProps {
submitButtonTranslation: (t: TranslationFunction) => string;
initialValues?: FormType;
handleSubmit: (values: FormType) => void;
isPending: boolean;
disableShort?: boolean;
}

export const SearchEngineForm = (props: SearchEngineFormProps) => {
const { submitButtonTranslation, handleSubmit, initialValues, isPending, disableShort } = props;
const t = useI18n();

const form = useZodForm(validation.searchEngine.manage, {
initialValues: initialValues ?? {
name: "",
short: "",
iconUrl: "",
urlTemplate: "",
description: "",
},
});

return (
<form onSubmit={form.onSubmit(handleSubmit)}>
<Stack>
<Grid>
<Grid.Col span={{ base: 12, md: 8, lg: 9, xl: 10 }}>
<TextInput {...form.getInputProps("name")} withAsterisk label={t("search.engine.field.name.label")} />
</Grid.Col>
<Grid.Col span={{ base: 12, md: 4, lg: 3, xl: 2 }}>
<TextInput
{...form.getInputProps("short")}
disabled={disableShort}
withAsterisk
label={t("search.engine.field.short.label")}
/>
</Grid.Col>
</Grid>
<IconPicker initialValue={initialValues?.iconUrl} {...form.getInputProps("iconUrl")} />
<TextInput
{...form.getInputProps("urlTemplate")}
withAsterisk
label={t("search.engine.field.urlTemplate.label")}
/>
<Textarea {...form.getInputProps("description")} label={t("search.engine.field.description.label")} />

<Group justify="end">
<Button variant="default" component={Link} href="/manage/search-engines">
{t("common.action.backToOverview")}
</Button>
<Button type="submit" loading={isPending}>
{submitButtonTranslation(t)}
</Button>
</Group>
</Stack>
</form>
);
};
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
"use client";

import { useCallback } from "react";
import { ActionIcon } from "@mantine/core";
import { IconTrash } from "@tabler/icons-react";

import type { RouterOutputs } from "@homarr/api";
import { clientApi } from "@homarr/api/client";
import { revalidatePathActionAsync } from "@homarr/common/client";
import { useConfirmModal } from "@homarr/modals";
import { showErrorNotification, showSuccessNotification } from "@homarr/notifications";
import { useScopedI18n } from "@homarr/translation/client";

interface SearchEngineDeleteButtonProps {
searchEngine: RouterOutputs["searchEngine"]["getPaginated"]["items"][number];
}

export const SearchEngineDeleteButton = ({ searchEngine }: SearchEngineDeleteButtonProps) => {
const t = useScopedI18n("search.engine.page.delete");
const { openConfirmModal } = useConfirmModal();
const { mutate, isPending } = clientApi.searchEngine.delete.useMutation();

const onClick = useCallback(() => {
openConfirmModal({
title: t("title"),
children: t("message", searchEngine),
onConfirm: () => {
mutate(
{ id: searchEngine.id },
{
onSuccess: () => {
showSuccessNotification({
title: t("notification.success.title"),
message: t("notification.success.message"),
});
void revalidatePathActionAsync("/manage/search-engines");
},
onError: () => {
showErrorNotification({
title: t("notification.error.title"),
message: t("notification.error.message"),
});
},
},
);
},
});
}, [searchEngine, mutate, t, openConfirmModal]);

return (
<ActionIcon loading={isPending} variant="subtle" color="red" onClick={onClick} aria-label={t("title")}>
<IconTrash color="red" size={16} stroke={1.5} />
</ActionIcon>
);
};
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
"use client";

import { useCallback } from "react";
import { useRouter } from "next/navigation";

import type { RouterOutputs } from "@homarr/api";
import { clientApi } from "@homarr/api/client";
import { revalidatePathActionAsync } from "@homarr/common/client";
import { showErrorNotification, showSuccessNotification } from "@homarr/notifications";
import type { TranslationFunction } from "@homarr/translation";
import { useScopedI18n } from "@homarr/translation/client";
import type { validation, z } from "@homarr/validation";

import { SearchEngineForm } from "../../_form";

interface SearchEngineEditFormProps {
searchEngine: RouterOutputs["searchEngine"]["byId"];
}

export const SearchEngineEditForm = ({ searchEngine }: SearchEngineEditFormProps) => {
const t = useScopedI18n("search.engine.page.edit.notification");
const router = useRouter();

const { mutate, isPending } = clientApi.searchEngine.update.useMutation({
onSuccess: () => {
showSuccessNotification({
title: t("success.title"),
message: t("success.message"),
});
void revalidatePathActionAsync("/manage/search-engines").then(() => {
router.push("/manage/search-engines");
});
},
onError: () => {
showErrorNotification({
title: t("error.title"),
message: t("error.message"),
});
},
});

const handleSubmit = useCallback(
(values: z.infer<typeof validation.searchEngine.manage>) => {
mutate({
id: searchEngine.id,
...values,
});
},
[mutate, searchEngine.id],
);

const submitButtonTranslation = useCallback((t: TranslationFunction) => t("common.action.save"), []);

return (
<SearchEngineForm
submitButtonTranslation={submitButtonTranslation}
initialValues={searchEngine}
handleSubmit={handleSubmit}
isPending={isPending}
disableShort
/>
);
};
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
import { Stack, Title } from "@mantine/core";

import { api } from "@homarr/api/server";
import { getI18n } from "@homarr/translation/server";

import { ManageContainer } from "~/components/manage/manage-container";
import { DynamicBreadcrumb } from "~/components/navigation/dynamic-breadcrumb";
import { SearchEngineEditForm } from "./_search-engine-edit-form";

interface SearchEngineEditPageProps {
params: { id: string };
}

export default async function SearchEngineEditPage({ params }: SearchEngineEditPageProps) {
const searchEngine = await api.searchEngine.byId({ id: params.id });
const t = await getI18n();

return (
<ManageContainer>
<DynamicBreadcrumb dynamicMappings={new Map([[params.id, searchEngine.name]])} nonInteractable={["edit"]} />
<Stack>
<Title>{t("search.engine.page.edit.title")}</Title>
<SearchEngineEditForm searchEngine={searchEngine} />
</Stack>
</ManageContainer>
);
}
Loading