|
|
|
@@ -2,20 +2,26 @@ import { useMemo, useState } from "react";
|
|
|
|
|
import { Avatar, Button, Card, Center, Grid, Group, Input, Stack, Text, Tooltip } from "@mantine/core";
|
|
|
|
|
import { IconSearch } from "@tabler/icons-react";
|
|
|
|
|
|
|
|
|
|
import { objectEntries } from "@homarr/common";
|
|
|
|
|
import { clientApi } from "@homarr/api/client";
|
|
|
|
|
import { createId, objectEntries } from "@homarr/common";
|
|
|
|
|
import { getIconUrl, getIntegrationName } from "@homarr/definitions";
|
|
|
|
|
import type { IntegrationKind, WidgetKind } from "@homarr/definitions";
|
|
|
|
|
import { createModal } from "@homarr/modals";
|
|
|
|
|
import { createModal, useModalAction } from "@homarr/modals";
|
|
|
|
|
import { useSettings } from "@homarr/settings";
|
|
|
|
|
import { useI18n } from "@homarr/translation/client";
|
|
|
|
|
import type { TablerIcon } from "@homarr/ui";
|
|
|
|
|
import { widgetImports } from "@homarr/widgets";
|
|
|
|
|
import { reduceWidgetOptionsWithDefaultValues, widgetImports } from "@homarr/widgets";
|
|
|
|
|
import { WidgetEditModal } from "@homarr/widgets/modals";
|
|
|
|
|
|
|
|
|
|
import { useItemActions } from "./item-actions";
|
|
|
|
|
|
|
|
|
|
export const ItemSelectModal = createModal<void>(({ actions }) => {
|
|
|
|
|
const [search, setSearch] = useState("");
|
|
|
|
|
const t = useI18n();
|
|
|
|
|
const { createItem } = useItemActions();
|
|
|
|
|
const { createItem, updateItemOptions, updateItemAdvancedOptions, updateItemIntegrations } = useItemActions();
|
|
|
|
|
const { openModal: openEditModal } = useModalAction(WidgetEditModal);
|
|
|
|
|
const { data: integrationData } = clientApi.integration.all.useQuery();
|
|
|
|
|
const settings = useSettings();
|
|
|
|
|
|
|
|
|
|
const items = useMemo(
|
|
|
|
|
() =>
|
|
|
|
@@ -40,8 +46,43 @@ export const ItemSelectModal = createModal<void>(({ actions }) => {
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
const handleAdd = (kind: WidgetKind) => {
|
|
|
|
|
createItem({ kind });
|
|
|
|
|
const definition = widgetImports[kind].definition;
|
|
|
|
|
const hasIntegrationSupport = "supportedIntegrations" in definition;
|
|
|
|
|
|
|
|
|
|
const matchingIntegrations = hasIntegrationSupport
|
|
|
|
|
? (integrationData ?? []).filter((integration) =>
|
|
|
|
|
(definition.supportedIntegrations as string[]).includes(integration.kind),
|
|
|
|
|
)
|
|
|
|
|
: [];
|
|
|
|
|
|
|
|
|
|
const integrationIds = matchingIntegrations.map((i) => i.id);
|
|
|
|
|
const itemId = createId();
|
|
|
|
|
const defaultOptions = reduceWidgetOptionsWithDefaultValues(kind, settings);
|
|
|
|
|
|
|
|
|
|
createItem({ id: itemId, kind, integrationIds });
|
|
|
|
|
actions.closeModal();
|
|
|
|
|
|
|
|
|
|
openEditModal(
|
|
|
|
|
{
|
|
|
|
|
kind,
|
|
|
|
|
value: {
|
|
|
|
|
advancedOptions: { title: null, customCssClasses: [], borderColor: "" },
|
|
|
|
|
options: defaultOptions,
|
|
|
|
|
integrationIds,
|
|
|
|
|
},
|
|
|
|
|
onSuccessfulEdit: ({ options, integrationIds: newIntegrationIds, advancedOptions }) => {
|
|
|
|
|
updateItemOptions({ itemId, newOptions: options });
|
|
|
|
|
updateItemAdvancedOptions({ itemId, newAdvancedOptions: advancedOptions });
|
|
|
|
|
updateItemIntegrations({ itemId, newIntegrations: newIntegrationIds });
|
|
|
|
|
},
|
|
|
|
|
integrationData: matchingIntegrations,
|
|
|
|
|
integrationSupport: hasIntegrationSupport,
|
|
|
|
|
settings,
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
title: (titleT) => `${titleT("item.edit.title")} - ${titleT(`widget.${kind}.name`)}`,
|
|
|
|
|
},
|
|
|
|
|
);
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
return (
|
|
|
|
|