diff --git a/apps/nextjs/src/app/[locale]/manage/custom-widgets/_custom-widget-form.tsx b/apps/nextjs/src/app/[locale]/manage/custom-widgets/_custom-widget-form.tsx index fd0fb62b6..426914ea3 100644 --- a/apps/nextjs/src/app/[locale]/manage/custom-widgets/_custom-widget-form.tsx +++ b/apps/nextjs/src/app/[locale]/manage/custom-widgets/_custom-widget-form.tsx @@ -32,6 +32,176 @@ interface CustomWidgetFormProps { definitionId?: string; } +const displayConfigBuilders: Record) => Record> = { + singleValue: (v) => ({ + type: "singleValue", + jsonPath: v.jsonPath, + label: v.label, + unit: v.unit, + valueSize: v.valueSize, + labelPosition: v.labelPosition, + }), + keyValue: (v) => ({ + type: "keyValue", + mappings: v.mappings, + layout: v.kvLayout, + columns: v.kvColumns, + }), + table: (v) => ({ + type: "table", + tablePath: v.tablePath, + columns: v.columns, + striped: v.striped, + compact: v.compact, + }), + statGrid: (v) => ({ + type: "statGrid", + items: v.statGridItems, + columns: v.statGridColumns, + cardStyle: v.cardStyle, + }), + progressBars: (v) => ({ + type: "progressBars", + bars: v.progressBars.map((b) => ({ + ...b, + maxPath: b.maxPath || undefined, + })), + showPercentage: v.showPercentage, + barSize: v.barSize, + }), + statusIndicator: (v) => ({ + type: "statusIndicator", + items: v.statusItems.map((item) => ({ + ...item, + goodValues: item.goodValues + .split(",") + .map((s) => s.trim()) + .filter(Boolean), + })), + layout: v.statusLayout, + dotSize: v.dotSize, + }), + countGrid: (v) => ({ + type: "countGrid", + items: v.countGridItems, + columns: v.countGridColumns, + valueSize: v.countValueSize, + }), + raw: (v) => ({ + type: "raw", + jsonPath: v.rawJsonPath, + maxHeight: v.rawMaxHeight, + }), + actionButton: (v) => ({ + type: "actionButton", + buttonLabel: v.buttonLabel, + buttonColor: v.buttonColor, + confirmText: v.confirmText || undefined, + successMessage: v.successMessage || undefined, + }), + customJsx: (v) => ({ type: "customJsx", template: v.template }), +}; + +const serverToFormFieldMap: Record> = { + statGrid: { items: "statGridItems" }, + countGrid: { items: "countGridItems" }, + statusIndicator: { items: "statusItems" }, + progressBars: { bars: "progressBars" }, + keyValue: { mappings: "mappings" }, + table: { columns: "columns", tablePath: "tablePath" }, + singleValue: { jsonPath: "jsonPath", label: "label", unit: "unit" }, + raw: { jsonPath: "rawJsonPath" }, + actionButton: { buttonLabel: "buttonLabel" }, + customJsx: { template: "template" }, +}; + +function extractServerErrors(err: unknown, displayType: string): Record { + const errors: Record = {}; + const trpcErr = err as { + data?: { zodError?: { fieldErrors?: Record } }; + message?: string; + }; + + if (trpcErr?.data?.zodError?.fieldErrors) { + for (const [field, messages] of Object.entries(trpcErr.data.zodError.fieldErrors)) { + if (messages?.[0]) { + errors[field] = messages[0]; + } + } + return errors; + } + + try { + const issues = JSON.parse(trpcErr?.message ?? "[]") as Array<{ + path: (string | number)[]; + message: string; + }>; + const fieldMap = serverToFormFieldMap[displayType] ?? {}; + + for (const issue of issues) { + const path = [...issue.path]; + if (path[0] === "displayConfig") { + path.shift(); + const serverField = String(path[0]); + const formField = fieldMap[serverField] ?? serverField; + path[0] = formField; + } + errors[path.join(".")] = issue.message; + } + } catch { + // not parseable, ignore + } + + return errors; +} + +const listItemDefaults = { + mapping: { label: "", jsonPath: "$", unit: "" }, + column: { header: "", jsonPath: "$" }, + statGridItem: { label: "", jsonPath: "$", unit: "", color: "blue" }, + progressBar: { + label: "", + valuePath: "$", + maxPath: "", + unit: "", + color: "blue", + }, + statusItem: { label: "", jsonPath: "$", goodValues: "online,true" }, + countGridItem: { label: "", jsonPath: "$", unit: "" }, +} as const; + +function cloneLast>(arr: T[], fallback: T): T { + const last = arr[arr.length - 1]; + return last ? { ...last } : { ...fallback }; +} + +const ALL_DISPLAY_TYPES = [ + "singleValue", + "keyValue", + "table", + "statGrid", + "progressBars", + "statusIndicator", + "countGrid", + "raw", + "actionButton", + "customJsx", +] as const; +const MANTINE_COLORS = [ + "blue", + "teal", + "green", + "red", + "orange", + "yellow", + "violet", + "pink", + "cyan", + "grape", + "indigo", + "lime", +] as const; + export function CustomWidgetForm({ mode, initialValues, definitionId }: CustomWidgetFormProps) { const router = useRouter(); const globalT = useI18n(); diff --git a/apps/nextjs/src/app/[locale]/manage/custom-widgets/_custom-widget-list.tsx b/apps/nextjs/src/app/[locale]/manage/custom-widgets/_custom-widget-list.tsx index 7adede639..22d548e56 100644 --- a/apps/nextjs/src/app/[locale]/manage/custom-widgets/_custom-widget-list.tsx +++ b/apps/nextjs/src/app/[locale]/manage/custom-widgets/_custom-widget-list.tsx @@ -44,11 +44,12 @@ export const CustomWidgetList = ({ definitions }: CustomWidgetListProps) => { } return ( - + {definitions.map((def) => ( ))} + ); }; diff --git a/package.json b/package.json index 61347b5dc..57ba58929 100644 --- a/package.json +++ b/package.json @@ -6,7 +6,7 @@ "build": "cross-env CI=true turbo build", "clean": "git clean -xdf node_modules", "clean:workspaces": "turbo clean", - "check:custom-widgets": "pnpm --filter @homarr/custom-widgets check:architecture", +"check:custom-widgets": "pnpm --filter @homarr/custom-widgets check:architecture", "check:custom-widget-bundle": "node ./scripts/check-custom-widget-bundle.mjs", "ci:act:all": "bash scripts/ci/act.sh all", "ci:act:cleanup": "bash scripts/ci/act.sh cleanup", diff --git a/packages/translation/src/lang/en.json b/packages/translation/src/lang/en.json index 8da739b9a..d610e8305 100644 --- a/packages/translation/src/lang/en.json +++ b/packages/translation/src/lang/en.json @@ -699,7 +699,7 @@ "title": "Edit Custom Widget" } }, - "betaBanner": { +"betaBanner": { "title": "Custom Widgets are in Beta", "description": "This feature is experimental and will probably change. If you encounter bugs, need more capabilities, or find something confusing, tell us in the", "link": "official discussion thread", @@ -723,7 +723,7 @@ "addBar": "Add Bar", "duplicate": "Duplicate", "copyAiPrompt": "Copy AI prompt", - "readyToSave": "Ready to save", +"readyToSave": "Ready to save", "enable": "Enable", "disable": "Disable", "menu": "Actions" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 02e5b0949..8920f67b5 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -12,24 +12,6 @@ catalogs: '@auth/drizzle-adapter': specifier: ^1.11.2 version: 1.11.2 - '@codemirror/autocomplete': - specifier: ^6.20.3 - version: 6.20.3 - '@codemirror/commands': - specifier: ^6.10.3 - version: 6.10.3 - '@codemirror/lang-javascript': - specifier: ^6.2.5 - version: 6.2.5 - '@codemirror/lang-json': - specifier: ^6.0.2 - version: 6.0.2 - '@codemirror/lint': - specifier: ^6.9.6 - version: 6.9.6 - '@codemirror/view': - specifier: ^6.43.0 - version: 6.43.0 '@ctrl/deluge': specifier: ^8.0.0 version: 8.0.0 @@ -58,8 +40,8 @@ catalogs: specifier: 7.2.1 version: 7.2.1 '@gfazioli/mantine-onboarding-tour': - specifier: ^4.0.6 - version: 4.0.6 + specifier: ^4.0.7 + version: 4.0.8 '@homarr/gridstack': specifier: ^1.12.0 version: 1.12.0 @@ -285,9 +267,6 @@ catalogs: '@types/xml2js': specifier: ^0.4.14 version: 0.4.14 - '@uiw/react-codemirror': - specifier: ^4.25.11 - version: 4.25.11 '@vitejs/plugin-react': specifier: ^6.0.3 version: 6.0.3 @@ -306,12 +285,6 @@ catalogs: '@xterm/xterm': specifier: ^6.0.0 version: 6.0.0 - acorn: - specifier: ^8.16.0 - version: 8.16.0 - acorn-jsx: - specifier: ^5.3.2 - version: 5.3.2 adm-zip: specifier: 0.5.18 version: 0.5.18 @@ -489,6 +462,9 @@ catalogs: react-error-boundary: specifier: ^6.1.2 version: 6.1.2 + react-jsx-parser: + specifier: ^2.4.1 + version: 2.4.1 react-markdown: specifier: ^10.1.0 version: 10.1.0 @@ -806,24 +782,6 @@ importers: apps/nextjs: dependencies: - '@codemirror/autocomplete': - specifier: 'catalog:' - version: 6.20.3 - '@codemirror/commands': - specifier: 'catalog:' - version: 6.10.3 - '@codemirror/lang-javascript': - specifier: 'catalog:' - version: 6.2.5 - '@codemirror/lang-json': - specifier: 'catalog:' - version: 6.0.2 - '@codemirror/lint': - specifier: 'catalog:' - version: 6.9.6 - '@codemirror/view': - specifier: 'catalog:' - version: 6.43.0 '@dnd-kit/core': specifier: 'catalog:' version: 6.3.1(react-dom@19.2.7(react@19.2.7))(react@19.2.7) @@ -838,7 +796,7 @@ importers: version: 3.2.2(react@19.2.7) '@gfazioli/mantine-onboarding-tour': specifier: 'catalog:' - version: 4.0.6(@mantine/core@9.4.1(@mantine/hooks@9.4.1(react@19.2.7))(@types/react@19.2.17)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(@mantine/hooks@9.4.1(react@19.2.7))(@tabler/icons-react@3.44.0(react@19.2.7))(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + version: 4.0.8(@mantine/core@9.4.1(@mantine/hooks@9.4.1(react@19.2.7))(@types/react@19.2.17)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(@mantine/hooks@9.4.1(react@19.2.7))(@tabler/icons-react@3.44.0(react@19.2.7))(react-dom@19.2.7(react@19.2.7))(react@19.2.7) '@homarr/analytics': specifier: workspace:^0.1.0 version: link:../../packages/analytics @@ -860,9 +818,6 @@ importers: '@homarr/cron-job-status': specifier: workspace:^0.1.0 version: link:../../packages/cron-job-status - '@homarr/custom-widgets': - specifier: workspace:^0.1.0 - version: link:../../packages/custom-widgets '@homarr/db': specifier: workspace:^0.1.0 version: link:../../packages/db @@ -989,9 +944,6 @@ importers: '@trpc/server': specifier: 'catalog:' version: 11.18.0(@typescript/typescript6@6.0.2) - '@uiw/react-codemirror': - specifier: 'catalog:' - version: 4.25.11(@babel/runtime@7.29.7)(@codemirror/autocomplete@6.20.3)(@codemirror/language@6.12.3)(@codemirror/lint@6.9.6)(@codemirror/search@6.7.1)(@codemirror/state@6.6.0)(@codemirror/theme-one-dark@6.1.3)(@codemirror/view@6.43.0)(codemirror@6.0.2)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) '@xterm/addon-canvas': specifier: 'catalog:' version: 0.7.0(@xterm/xterm@6.0.0) @@ -1317,9 +1269,6 @@ importers: '@homarr/cron-jobs': specifier: workspace:^0.1.0 version: link:../cron-jobs - '@homarr/custom-widgets': - specifier: workspace:^0.1.0 - version: link:../custom-widgets '@homarr/db': specifier: workspace:^0.1.0 version: link:../db @@ -1377,6 +1326,9 @@ importers: '@trpc/tanstack-react-query': specifier: 'catalog:' version: 11.18.0(@tanstack/react-query@5.101.2(react@19.2.7))(@trpc/client@11.18.0(@trpc/server@11.18.0(@typescript/typescript6@6.0.2))(@typescript/typescript6@6.0.2))(@trpc/server@11.18.0(@typescript/typescript6@6.0.2))(@typescript/typescript6@6.0.2)(react@19.2.7) + jsonpath-plus: + specifier: 'catalog:' + version: 10.4.0 lodash.clonedeep: specifier: 'catalog:' version: 4.5.0 @@ -1398,9 +1350,6 @@ importers: trpc-to-openapi: specifier: 'catalog:' version: 3.3.0(patch_hash=2ca3c16af0fcca0c736697ad4fe553a14f794524fa9ce0d5c3e8ee4aea76090c)(@trpc/server@11.18.0(@typescript/typescript6@6.0.2))(zod-openapi@5.3.0(zod@4.4.3))(zod@4.4.3) - undici: - specifier: 'catalog:' - version: 7.28.0 zod: specifier: 'catalog:' version: 4.4.3 @@ -1711,70 +1660,6 @@ importers: specifier: 'catalog:' version: '@typescript/typescript6@6.0.2' - packages/custom-widgets: - dependencies: - '@mantine/charts': - specifier: 'catalog:' - version: 9.4.1(@mantine/core@9.4.1(@mantine/hooks@9.4.1(react@19.2.7))(@types/react@19.2.17)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(@mantine/hooks@9.4.1(react@19.2.7))(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(recharts@3.9.1(@types/react@19.2.17)(react-dom@19.2.7(react@19.2.7))(react-is@19.2.7)(react@19.2.7)(redux@5.0.1)) - '@mantine/core': - specifier: 'catalog:' - version: 9.4.1(@mantine/hooks@9.4.1(react@19.2.7))(@types/react@19.2.17)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) - '@mantine/dates': - specifier: 'catalog:' - version: 9.4.1(@mantine/core@9.4.1(@mantine/hooks@9.4.1(react@19.2.7))(@types/react@19.2.17)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(@mantine/hooks@9.4.1(react@19.2.7))(dayjs@1.11.21)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) - '@mantine/hooks': - specifier: 'catalog:' - version: 9.4.1(react@19.2.7) - '@tabler/icons-react': - specifier: 'catalog:' - version: 3.44.0(react@19.2.7) - '@tanstack/react-query': - specifier: 'catalog:' - version: 5.101.2(react@19.2.7) - acorn: - specifier: 'catalog:' - version: 8.16.0 - acorn-jsx: - specifier: 'catalog:' - version: 5.3.2(acorn@8.16.0) - jsonpath-plus: - specifier: 'catalog:' - version: 10.4.0 - react: - specifier: 'catalog:' - version: 19.2.7 - undici: - specifier: 'catalog:' - version: 7.28.0 - zod: - specifier: 'catalog:' - version: 4.4.3 - devDependencies: - '@homarr/tsconfig': - specifier: workspace:^0.1.0 - version: link:../../tooling/typescript - '@types/node': - specifier: 'catalog:' - version: 24.13.3 - '@types/react': - specifier: 'catalog:' - version: 19.2.17 - '@types/react-dom': - specifier: 'catalog:' - version: 19.2.3(@types/react@19.2.17) - jsdom: - specifier: 'catalog:' - version: 29.1.1(@noble/hashes@2.0.1) - react-dom: - specifier: 'catalog:' - version: 19.2.7(react@19.2.7) - typescript: - specifier: 'catalog:' - version: '@typescript/typescript6@6.0.2' - vitest: - specifier: 'catalog:' - version: 4.1.10(@opentelemetry/api@1.9.0)(@types/node@24.13.3)(@vitest/coverage-v8@4.1.10)(@vitest/ui@4.1.10)(jsdom@29.1.1(@noble/hashes@2.0.1))(msw@2.14.6(@types/node@24.13.3)(@typescript/typescript6@6.0.2))(vite@8.1.4(@types/node@24.13.3)(esbuild@0.28.1)(jiti@2.7.0)(sass@1.101.0)(sugarss@5.0.0(postcss@8.5.16))(terser@5.46.1)(tsx@4.21.0)(yaml@2.9.0)) - packages/db: dependencies: '@auth/core': @@ -1786,9 +1671,6 @@ importers: '@homarr/core': specifier: workspace:^0.1.0 version: link:../core - '@homarr/custom-widgets': - specifier: workspace:^0.1.0 - version: link:../custom-widgets '@homarr/definitions': specifier: workspace:^0.1.0 version: link:../definitions @@ -1862,9 +1744,6 @@ importers: '@homarr/common': specifier: workspace:^0.1.0 version: link:../common - '@homarr/custom-widgets': - specifier: workspace:^0.1.0 - version: link:../custom-widgets fast-xml-parser: specifier: 'catalog:' version: 5.9.3 @@ -2617,12 +2496,6 @@ importers: '@homarr/translation': specifier: workspace:^0.1.0 version: link:../translation - acorn: - specifier: 'catalog:' - version: 8.16.0 - acorn-jsx: - specifier: 'catalog:' - version: 5.3.2(acorn@8.16.0) zod: specifier: 'catalog:' version: 4.4.3 @@ -2660,9 +2533,6 @@ importers: '@homarr/core': specifier: workspace:^0.1.0 version: link:../core - '@homarr/custom-widgets': - specifier: workspace:^0.1.0 - version: link:../custom-widgets '@homarr/db': specifier: workspace:^0.1.0 version: link:../db @@ -2717,9 +2587,6 @@ importers: '@mantine/core': specifier: 'catalog:' version: 9.4.1(@mantine/hooks@9.4.1(react@19.2.7))(@types/react@19.2.17)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) - '@mantine/dates': - specifier: 'catalog:' - version: 9.4.1(@mantine/core@9.4.1(@mantine/hooks@9.4.1(react@19.2.7))(@types/react@19.2.17)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(@mantine/hooks@9.4.1(react@19.2.7))(dayjs@1.11.21)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) '@mantine/form': specifier: 'catalog:' version: 9.4.1(react@19.2.7) @@ -2777,18 +2644,15 @@ importers: '@tiptap/starter-kit': specifier: 'catalog:' version: 3.27.3 - acorn: - specifier: 'catalog:' - version: 8.16.0 - acorn-jsx: - specifier: 'catalog:' - version: 5.3.2(acorn@8.16.0) clsx: specifier: 'catalog:' version: 2.1.1 dayjs: specifier: 'catalog:' version: 1.11.21 + jsonpath-plus: + specifier: 'catalog:' + version: 10.4.0 lucide-react: specifier: 'catalog:' version: 1.24.0(react@19.2.7) @@ -2807,6 +2671,9 @@ importers: react-dom: specifier: 'catalog:' version: 19.2.7(react@19.2.7) + react-jsx-parser: + specifier: 'catalog:' + version: 2.4.1(react-dom@19.2.7(react@19.2.7))(react@19.2.7) react-markdown: specifier: 'catalog:' version: 10.1.0(@types/react@19.2.17)(react@19.2.7) @@ -3727,15 +3594,9 @@ packages: '@codemirror/lint@6.9.6': resolution: {integrity: sha512-6Kp7r6XfCi/D/5sdXieMfg9pJU1bUEx96WITuLU6ESaKizCz0QHFMjY/TaFSbigDdEAIgi93itLBIUETP4oK+A==} - '@codemirror/search@6.7.1': - resolution: {integrity: sha512-uMe5UO6PamJtSHrXhhHOzSX3ReWtiJrva6GnPMwSOrZtiExb5X5eExhr2OUZQVvdxPsKpY3Ro2mFbQadpPWmHA==} - '@codemirror/state@6.6.0': resolution: {integrity: sha512-4nbvra5R5EtiCzr9BTHiTLc+MLXK2QGiAVYMyi8PkQd3SR+6ixar/Q/01Fa21TBIDOZXgeWV4WppsQolSreAPQ==} - '@codemirror/theme-one-dark@6.1.3': - resolution: {integrity: sha512-NzBdIvEJmx6fjeremiGp3t/okrLPYT0d9orIc7AFun8oZcRk58aejkqhv6spnz4MLAevrKNPMQYXEWMg4s+sKA==} - '@codemirror/view@6.43.0': resolution: {integrity: sha512-V7ZCLQO3Jus9hzh2jVCCPW3mO4IBMr43O37PqSUYautJSnnJF41YlgLw21x0fLJTYvJ+Vkm6Gp+qKGH9pltgXA==} @@ -5106,8 +4967,8 @@ packages: '@formatjs/intl-localematcher@0.8.1': resolution: {integrity: sha512-xwEuwQFdtSq1UKtQnyTZWC+eHdv7Uygoa+H2k/9uzBVQjDyp9r20LNDNKedWXll7FssT3GRHvqsdJGYSUWqYFA==} - '@gfazioli/mantine-onboarding-tour@4.0.6': - resolution: {integrity: sha512-EMXwq5VPdQO8ppgKGY3i/KbB3jfuqJir5xmbAx0RNV3Ua3uXfznXJb0mNLykP1gQ+qe6WceORNsFUtQS0tIZAw==} + '@gfazioli/mantine-onboarding-tour@4.0.8': + resolution: {integrity: sha512-5YePS8nXkrLyc0OEHPZ/cpkcVEPjtf9VP9QWl6HxfMW9s6pBq1bWz5VcOoRKEVZWKi4xmskBcEPxB81syYrYXQ==} peerDependencies: '@mantine/core': '>=9.0.0' '@mantine/hooks': '>=9.0.0' @@ -8040,12 +7901,20 @@ packages: '@types/prismjs@1.26.6': resolution: {integrity: sha512-vqlvI7qlMvcCBbVe0AKAb4f97//Hy0EBTaiW8AalRnG/xAN5zOiWWyrNqNXeq8+KAuvRewjCVY1+IPxk4RdNYw==} + '@types/prop-types@15.7.15': + resolution: {integrity: sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw==} + '@types/qs@6.9.16': resolution: {integrity: sha512-7i+zxXdPD0T4cKDuxCUXJ4wHcsJLwENa6Z3dCu8cfCK743OGy5Nu1RmAGqDPsoTDINVEcdXKRvR/zre+P2Ku1A==} '@types/range-parser@1.2.7': resolution: {integrity: sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==} + '@types/react-dom@18.3.7': + resolution: {integrity: sha512-MEe3UeoENYVFXzoXEWsvcpg6ZvlrFNlOQ7EOsvhI3CfAXwzPfO8Qwuxd40nepsYKqyyVQnTdEfv68q91yLcKrQ==} + peerDependencies: + '@types/react': ^18.0.0 + '@types/react-dom@19.2.3': resolution: {integrity: sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==} peerDependencies: @@ -8060,6 +7929,9 @@ packages: '@types/react-router@5.1.20': resolution: {integrity: sha512-jGjmu/ZqS7FjSH6owMcD5qpq19+1RS9DeVRqfl1FeBMxTDQAGwlMWOcs52NDoXaNKyG3d1cYQFMs9rCrb88o9Q==} + '@types/react@18.3.31': + resolution: {integrity: sha512-vfEqpXTvwT91yhmwdfouStN2hSKwTvyRs8qpLfADyrq/kxDw0hZM7Wk9Ug1FELj8hIby+S/+kQCSRFF32nv2Qw==} + '@types/react@19.2.17': resolution: {integrity: sha512-MXfmqaVPEVgkBT/aY0aGCkRWWtByiYQXo3xdQ8r5RzuFrPiRn8Gar2tQdXSUQ2GKV3bkXckek89V8wQBY2Q/Aw==} @@ -8142,28 +8014,6 @@ packages: resolution: {integrity: sha512-mbCddXd+jm7hfx7w2YU64/Av4/NqqeG3GoRZgxPcgoTxYjhrcfJRw9ULch71SS4G+Q3bOXFhRvPqjguN0Hyp5w==} hasBin: true - '@uiw/codemirror-extensions-basic-setup@4.25.11': - resolution: {integrity: sha512-otyFa+n9IOYtEjaKOxPedHkj15fTPUF21wdR9pv0GpZPfuGl27cvmcv6+tognbRu9VvEcsHKE+ESoszeo3KfTw==} - peerDependencies: - '@codemirror/autocomplete': '>=6.0.0' - '@codemirror/commands': '>=6.0.0' - '@codemirror/language': '>=6.0.0' - '@codemirror/lint': '>=6.0.0' - '@codemirror/search': '>=6.0.0' - '@codemirror/state': '>=6.0.0' - '@codemirror/view': '>=6.0.0' - - '@uiw/react-codemirror@4.25.11': - resolution: {integrity: sha512-DYVFAKLX+F/4JS9N/7xexh+TICrlncwkX9HKKInrP1bwO0tSfc3k0GB6oawTYhelVKh20cX3TuRx+NJSkVXuMw==} - peerDependencies: - '@babel/runtime': '>=7.29.7' - '@codemirror/state': '>=6.0.0' - '@codemirror/theme-one-dark': '>=6.0.0' - '@codemirror/view': '>=6.0.0' - codemirror: '>=6.0.0' - react: '>=17.0.0' - react-dom: '>=17.0.0' - '@ungap/structured-clone@1.3.0': resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} deprecated: Potential CWE-502 - Update to 1.3.1 or higher @@ -9107,9 +8957,6 @@ packages: resolution: {integrity: sha512-Kbpv2Yd1NdL1V/V4cwLVxraHDV6K8ayohr2rmH0J87Er8+zJjcTa6dAn9QMPC9CRgU8+aNajKbSf1TzDB1yKPA==} engines: {node: '>=8.0.0'} - codemirror@6.0.2: - resolution: {integrity: sha512-VhydHotNW5w1UGK0Qj96BwSk/Zqbp9WbnyK2W/eVMv4QyF41INRGpjUhFJY7/uDNuudSc33a/PKr4iDqRduvHw==} - collapse-white-space@2.1.0: resolution: {integrity: sha512-loKTxY1zCOuG4j9f6EPnuyyYkf58RnhhWTvRoZEokgB+WbdXehfjFviyOVYkqzEWz1Q5kRiZdBYS5SwxbQYwzw==} @@ -11014,6 +10861,9 @@ packages: immediate@3.0.6: resolution: {integrity: sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==} + immer@11.1.4: + resolution: {integrity: sha512-XREFCPo6ksxVzP4E0ekD5aMdf8WMwmdNaz6vuvxgI40UaEiu6q3p8X52aU6GdyvLY3XXX/8R7JOTXStz/nBbRw==} + immer@11.1.9: resolution: {integrity: sha512-sc/z0Cyti70bZa0ZU4sWfAElfovFb9Ni8tArJZLuklYWxegPiK3pDOql1Rq5H0FIRAW9LSQRG6OX4KqBldbhBA==} @@ -13535,6 +13385,13 @@ packages: peerDependencies: react: ^18.0.0 || ^19.0.0 + react-jsx-parser@2.4.1: + resolution: {integrity: sha512-gE25DiHseuKmSbb5O1K1IkyQ/bwth3zl4z3EdW8XMhwrb2agUpuh8GvqHFvGwh/wdZjDDuadGrSR2lEgjcOvqQ==} + engines: {bun: ^1.1.27} + peerDependencies: + react: '>=18' + react-dom: '>=18' + react-loadable-ssr-addon-v5-slorber@1.0.3: resolution: {integrity: sha512-GXfh9VLwB5ERaCsU6RULh7tkemeX15aNh6wuMEBtfdyMa7fFG8TXrhXlx1SoEK2Ty/l6XIkzzYIQmyaWW3JgdQ==} engines: {node: '>=10.13.0'} @@ -13832,6 +13689,9 @@ packages: requires-port@1.0.0: resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} + reselect@5.1.1: + resolution: {integrity: sha512-K/BG6eIky/SBpzfHZv/dd+9JBFiS4SWV7FIujVyJRux6e45+73RaUHXLmIR1f7WOMaQ0U1km6qwklRQxpJJY0w==} + reselect@5.2.0: resolution: {integrity: sha512-AgZ3UOZm3YndfrJ4OYjgrT7bmCm/1iqkjvEfH/oYjzh6PD2qw4QuT3jjnXIrpdt4MTpMXclMT3lXbmRY+XRakw==} @@ -16660,23 +16520,10 @@ snapshots: '@codemirror/view': 6.43.0 crelt: 1.0.6 - '@codemirror/search@6.7.1': - dependencies: - '@codemirror/state': 6.6.0 - '@codemirror/view': 6.43.0 - crelt: 1.0.6 - '@codemirror/state@6.6.0': dependencies: '@marijn/find-cluster-break': 1.0.2 - '@codemirror/theme-one-dark@6.1.3': - dependencies: - '@codemirror/language': 6.12.3 - '@codemirror/state': 6.6.0 - '@codemirror/view': 6.43.0 - '@lezer/highlight': 1.2.3 - '@codemirror/view@6.43.0': dependencies: '@codemirror/state': 6.6.0 @@ -18564,7 +18411,7 @@ snapshots: '@formatjs/fast-memoize': 3.1.0 tslib: 2.8.1 - '@gfazioli/mantine-onboarding-tour@4.0.6(@mantine/core@9.4.1(@mantine/hooks@9.4.1(react@19.2.7))(@types/react@19.2.17)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(@mantine/hooks@9.4.1(react@19.2.7))(@tabler/icons-react@3.44.0(react@19.2.7))(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': + '@gfazioli/mantine-onboarding-tour@4.0.8(@mantine/core@9.4.1(@mantine/hooks@9.4.1(react@19.2.7))(@types/react@19.2.17)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(@mantine/hooks@9.4.1(react@19.2.7))(@tabler/icons-react@3.44.0(react@19.2.7))(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': dependencies: '@mantine/core': 9.4.1(@mantine/hooks@9.4.1(react@19.2.7))(@types/react@19.2.17)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) '@mantine/hooks': 9.4.1(react@19.2.7) @@ -18920,7 +18767,7 @@ snapshots: '@jest/schemas': 29.6.3 '@types/istanbul-lib-coverage': 2.0.6 '@types/istanbul-reports': 3.0.4 - '@types/node': 24.13.3 + '@types/node': 24.13.2 '@types/yargs': 17.0.35 chalk: 4.1.2 @@ -20151,10 +19998,10 @@ snapshots: dependencies: '@standard-schema/spec': 1.1.0 '@standard-schema/utils': 0.3.0 - immer: 11.1.9 + immer: 11.1.4 redux: 5.0.1 redux-thunk: 3.1.0(redux@5.0.1) - reselect: 5.2.0 + reselect: 5.1.1 optionalDependencies: react: 19.2.7 react-redux: 9.2.0(@types/react@19.2.17)(react@19.2.7)(redux@5.0.1) @@ -20497,7 +20344,7 @@ snapshots: '@scalar/icons@0.7.3(@typescript/typescript6@6.0.2)': dependencies: '@phosphor-icons/core': 2.1.1 - '@types/node': 24.13.3 + '@types/node': 24.13.2 chalk: 5.6.2 vue: 3.5.35(@typescript/typescript6@6.0.2) transitivePeerDependencies: @@ -21472,11 +21319,11 @@ snapshots: '@types/body-parser@1.19.5': dependencies: '@types/connect': 3.4.38 - '@types/node': 24.13.3 + '@types/node': 24.13.2 '@types/bonjour@3.5.13': dependencies: - '@types/node': 24.13.3 + '@types/node': 24.13.2 '@types/chai@5.2.2': dependencies: @@ -21487,11 +21334,11 @@ snapshots: '@types/connect-history-api-fallback@1.5.4': dependencies: '@types/express-serve-static-core': 4.19.5 - '@types/node': 24.13.3 + '@types/node': 24.13.2 '@types/connect@3.4.38': dependencies: - '@types/node': 24.13.3 + '@types/node': 24.13.2 '@types/cookies@0.9.2': dependencies: @@ -21637,13 +21484,13 @@ snapshots: '@types/docker-modem@3.0.6': dependencies: - '@types/node': 24.13.3 + '@types/node': 24.13.2 '@types/ssh2': 1.15.1 '@types/dockerode@4.0.1': dependencies: '@types/docker-modem': 3.0.6 - '@types/node': 24.13.3 + '@types/node': 24.13.2 '@types/ssh2': 1.15.1 '@types/estree-jsx@1.0.5': @@ -21654,7 +21501,7 @@ snapshots: '@types/express-serve-static-core@4.19.5': dependencies: - '@types/node': 24.13.3 + '@types/node': 24.13.2 '@types/qs': 6.9.16 '@types/range-parser': 1.2.7 '@types/send': 0.17.4 @@ -21686,7 +21533,7 @@ snapshots: '@types/http-proxy@1.17.17': dependencies: - '@types/node': 24.13.3 + '@types/node': 24.13.2 '@types/istanbul-lib-coverage@2.0.6': {} @@ -21716,7 +21563,7 @@ snapshots: '@types/node-fetch@2.6.13': dependencies: - '@types/node': 24.13.3 + '@types/node': 24.13.2 form-data: 4.0.6 '@types/node-unifi@2.5.1(patch_hash=5e6ae51e2a17a7f9729bfa30b0eb3d0842a5810ac6db47603ab4a6efa1ed84c5)': @@ -21747,10 +21594,18 @@ snapshots: '@types/prismjs@1.26.6': {} + '@types/prop-types@15.7.15': + optional: true + '@types/qs@6.9.16': {} '@types/range-parser@1.2.7': {} + '@types/react-dom@18.3.7(@types/react@18.3.31)': + dependencies: + '@types/react': 18.3.31 + optional: true + '@types/react-dom@19.2.3(@types/react@19.2.17)': dependencies: '@types/react': 19.2.17 @@ -21772,6 +21627,12 @@ snapshots: '@types/history': 4.7.11 '@types/react': 19.2.17 + '@types/react@18.3.31': + dependencies: + '@types/prop-types': 15.7.15 + csstype: 3.2.3 + optional: true + '@types/react@19.2.17': dependencies: csstype: 3.2.3 @@ -21780,14 +21641,14 @@ snapshots: '@types/sax@1.2.7': dependencies: - '@types/node': 24.13.3 + '@types/node': 24.13.2 '@types/semver@7.5.8': {} '@types/send@0.17.4': dependencies: '@types/mime': 1.3.5 - '@types/node': 24.13.3 + '@types/node': 24.13.2 '@types/serve-index@1.9.4': dependencies: @@ -21796,7 +21657,7 @@ snapshots: '@types/serve-static@1.15.7': dependencies: '@types/http-errors': 2.0.4 - '@types/node': 24.13.3 + '@types/node': 24.13.2 '@types/send': 0.17.4 '@types/set-cookie-parser@2.4.10': @@ -21806,15 +21667,15 @@ snapshots: '@types/sockjs@0.3.36': dependencies: - '@types/node': 24.13.3 + '@types/node': 24.13.2 '@types/ssh2-streams@0.1.12': dependencies: - '@types/node': 24.13.3 + '@types/node': 24.13.2 '@types/ssh2@0.5.52': dependencies: - '@types/node': 24.13.3 + '@types/node': 24.13.2 '@types/ssh2-streams': 0.1.12 '@types/ssh2@1.15.1': @@ -21826,7 +21687,7 @@ snapshots: '@types/stream-buffers@3.0.7': dependencies: - '@types/node': 24.13.3 + '@types/node': 24.13.2 '@types/triple-beam@1.3.5': {} @@ -21851,7 +21712,7 @@ snapshots: '@types/xml2js@0.4.14': dependencies: - '@types/node': 24.13.3 + '@types/node': 24.13.2 '@types/yargs-parser@21.0.3': {} @@ -21863,33 +21724,6 @@ snapshots: dependencies: '@typescript/old': typescript@6.0.3 - '@uiw/codemirror-extensions-basic-setup@4.25.11(@codemirror/autocomplete@6.20.3)(@codemirror/commands@6.10.3)(@codemirror/language@6.12.3)(@codemirror/lint@6.9.6)(@codemirror/search@6.7.1)(@codemirror/state@6.6.0)(@codemirror/view@6.43.0)': - dependencies: - '@codemirror/autocomplete': 6.20.3 - '@codemirror/commands': 6.10.3 - '@codemirror/language': 6.12.3 - '@codemirror/lint': 6.9.6 - '@codemirror/search': 6.7.1 - '@codemirror/state': 6.6.0 - '@codemirror/view': 6.43.0 - - '@uiw/react-codemirror@4.25.11(@babel/runtime@7.29.7)(@codemirror/autocomplete@6.20.3)(@codemirror/language@6.12.3)(@codemirror/lint@6.9.6)(@codemirror/search@6.7.1)(@codemirror/state@6.6.0)(@codemirror/theme-one-dark@6.1.3)(@codemirror/view@6.43.0)(codemirror@6.0.2)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': - dependencies: - '@babel/runtime': 7.29.7 - '@codemirror/commands': 6.10.3 - '@codemirror/state': 6.6.0 - '@codemirror/theme-one-dark': 6.1.3 - '@codemirror/view': 6.43.0 - '@uiw/codemirror-extensions-basic-setup': 4.25.11(@codemirror/autocomplete@6.20.3)(@codemirror/commands@6.10.3)(@codemirror/language@6.12.3)(@codemirror/lint@6.9.6)(@codemirror/search@6.7.1)(@codemirror/state@6.6.0)(@codemirror/view@6.43.0) - codemirror: 6.0.2 - react: 19.2.7 - react-dom: 19.2.7(react@19.2.7) - transitivePeerDependencies: - - '@codemirror/autocomplete' - - '@codemirror/language' - - '@codemirror/lint' - - '@codemirror/search' - '@ungap/structured-clone@1.3.0': {} '@unhead/vue@2.1.15(vue@3.5.35(@typescript/typescript6@6.0.2))': @@ -22941,16 +22775,6 @@ snapshots: raw-body: 2.5.3 type-is: 1.6.18 - codemirror@6.0.2: - dependencies: - '@codemirror/autocomplete': 6.20.3 - '@codemirror/commands': 6.10.3 - '@codemirror/language': 6.12.3 - '@codemirror/lint': 6.9.6 - '@codemirror/search': 6.7.1 - '@codemirror/state': 6.6.0 - '@codemirror/view': 6.43.0 - collapse-white-space@2.1.0: {} color-convert@1.9.3: @@ -24121,7 +23945,7 @@ snapshots: eval@0.1.8: dependencies: - '@types/node': 24.13.3 + '@types/node': 24.13.2 require-like: 0.1.2 event-target-shim@5.0.1: {} @@ -25170,6 +24994,8 @@ snapshots: immediate@3.0.6: {} + immer@11.1.4: {} + immer@11.1.9: {} immutable@5.1.5: {} @@ -25427,7 +25253,7 @@ snapshots: jest-util@29.7.0: dependencies: '@jest/types': 29.6.3 - '@types/node': 24.13.3 + '@types/node': 24.13.2 chalk: 4.1.2 ci-info: 3.9.0 graceful-fs: 4.2.11 @@ -25441,7 +25267,7 @@ snapshots: jest-worker@29.7.0: dependencies: - '@types/node': 24.13.3 + '@types/node': 24.13.2 jest-util: 29.7.0 merge-stream: 2.0.0 supports-color: 8.1.1 @@ -27833,7 +27659,7 @@ snapshots: '@protobufjs/path': 1.1.2 '@protobufjs/pool': 1.1.0 '@protobufjs/utf8': 1.1.0 - '@types/node': 24.13.3 + '@types/node': 24.13.2 long: 5.3.2 proxmox-api@1.1.1: @@ -27965,6 +27791,16 @@ snapshots: dependencies: react: 19.2.7 + react-jsx-parser@2.4.1(react-dom@19.2.7(react@19.2.7))(react@19.2.7): + dependencies: + acorn: 8.16.0 + acorn-jsx: 5.3.2(acorn@8.16.0) + react: 19.2.7 + react-dom: 19.2.7(react@19.2.7) + optionalDependencies: + '@types/react': 18.3.31 + '@types/react-dom': 18.3.7(@types/react@18.3.31) + react-loadable-ssr-addon-v5-slorber@1.0.3(@docusaurus/react-loadable@6.0.0(react@19.2.7))(webpack@5.107.1(@swc/core@1.15.3(@swc/helpers@0.5.15))(esbuild@0.28.1)(postcss@8.5.16)): dependencies: '@babel/runtime': 7.29.7 @@ -28401,6 +28237,8 @@ snapshots: requires-port@1.0.0: {} + reselect@5.1.1: {} + reselect@5.2.0: {} reserved-identifiers@1.2.0: {} diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index f3dc6011c..2810f48d5 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -20,7 +20,7 @@ catalog: "@dnd-kit/utilities": ^3.2.2 "@drizzle-team/brocli": ^0.12.0 "@extractus/feed-extractor": 7.2.1 - "@gfazioli/mantine-onboarding-tour": ^4.0.6 + "@gfazioli/mantine-onboarding-tour": ^4.0.7 "@gitbeaker/rest": ^43.8.0 "@homarr/gridstack": ^1.12.0 "@homarr/node-unifi": ^2.6.0