From aa503992af37bc683f934b36faebd31fba9d8720 Mon Sep 17 00:00:00 2001 From: Manuel <30572287+manuel-rw@users.noreply.github.com> Date: Fri, 8 Nov 2024 09:43:25 +0100 Subject: [PATCH] feat: #1047 add overseerr search (#1411) Co-authored-by: Meier Lukas --- .../[locale]/manage/search-engines/_form.tsx | 48 +- .../[locale]/manage/search-engines/page.tsx | 13 +- .../router/integration/integration-router.ts | 85 +- .../search-engine/search-engine-router.ts | 22 +- .../mysql/0015_unknown_firedrake.sql | 4 + .../migrations/mysql/meta/0015_snapshot.json | 1627 +++++++++++++++++ .../db/migrations/mysql/meta/_journal.json | 7 + .../sqlite/0015_superb_psylocke.sql | 17 + .../migrations/sqlite/meta/0015_snapshot.json | 1556 ++++++++++++++++ .../db/migrations/sqlite/meta/_journal.json | 7 + packages/db/schema/mysql.ts | 12 +- packages/db/schema/sqlite.ts | 12 +- packages/definitions/src/index.ts | 1 + packages/definitions/src/integration.ts | 35 + packages/definitions/src/search-engine.ts | 2 + packages/form/src/index.ts | 7 +- .../src/base/searchable-integration.ts | 3 + .../src/overseerr/overseerr-integration.ts | 80 +- packages/integrations/src/types.ts | 1 + packages/spotlight/package.json | 1 + .../external/search-engines-search-group.tsx | 90 +- packages/translation/src/lang/en.json | 11 +- packages/validation/src/search-engine.ts | 35 +- .../widgets/src/widget-integration-select.tsx | 30 +- pnpm-lock.yaml | 7 +- 25 files changed, 3661 insertions(+), 52 deletions(-) create mode 100644 packages/db/migrations/mysql/0015_unknown_firedrake.sql create mode 100644 packages/db/migrations/mysql/meta/0015_snapshot.json create mode 100644 packages/db/migrations/sqlite/0015_superb_psylocke.sql create mode 100644 packages/db/migrations/sqlite/meta/0015_snapshot.json create mode 100644 packages/definitions/src/search-engine.ts create mode 100644 packages/integrations/src/base/searchable-integration.ts diff --git a/apps/nextjs/src/app/[locale]/manage/search-engines/_form.tsx b/apps/nextjs/src/app/[locale]/manage/search-engines/_form.tsx index e937cf503..4db3ba01a 100644 --- a/apps/nextjs/src/app/[locale]/manage/search-engines/_form.tsx +++ b/apps/nextjs/src/app/[locale]/manage/search-engines/_form.tsx @@ -1,8 +1,12 @@ "use client"; import Link from "next/link"; -import { Button, Grid, Group, Stack, Textarea, TextInput } from "@mantine/core"; +import type { SegmentedControlItem } from "@mantine/core"; +import { Button, Fieldset, Grid, Group, SegmentedControl, Stack, Textarea, TextInput } from "@mantine/core"; +import { WidgetIntegrationSelect } from "node_modules/@homarr/widgets/src/widget-integration-select"; +import { clientApi } from "@homarr/api/client"; +import { searchEngineTypes } from "@homarr/definitions"; import { useZodForm } from "@homarr/form"; import type { TranslationFunction } from "@homarr/translation"; import { useI18n } from "@homarr/translation/client"; @@ -25,6 +29,8 @@ export const SearchEngineForm = (props: SearchEngineFormProps) => { const { submitButtonTranslation, handleSubmit, initialValues, isPending, disableShort } = props; const t = useI18n(); + const [integrationData] = clientApi.integration.allThatSupportSearch.useSuspenseQuery(); + const form = useZodForm(validation.searchEngine.manage, { initialValues: initialValues ?? { name: "", @@ -32,6 +38,7 @@ export const SearchEngineForm = (props: SearchEngineFormProps) => { iconUrl: "", urlTemplate: "", description: "", + type: "generic", }, }); @@ -52,11 +59,40 @@ export const SearchEngineForm = (props: SearchEngineFormProps) => { - + +
+ + ({ + label: t(`search.engine.page.edit.searchEngineType.${type}`), + value: type, + }) satisfies SegmentedControlItem, + )} + {...form.getInputProps("type")} + fullWidth + /> + + {form.values.type === "generic" && ( + + )} + + {form.values.type === "fromIntegration" && ( + form.setFieldValue("integrationId", value[0])} + value={form.values.integrationId !== undefined ? [form.values.integrationId] : []} + withAsterisk + /> + )} +
+