/* eslint-disable react/no-unknown-property */ // Ignored because of gridstack attributes import type { RefObject } from "react"; import { ActionIcon, Card, Menu } from "@mantine/core"; import { useElementSize } from "@mantine/hooks"; import { IconDotsVertical, IconLayoutKanban, IconPencil, IconTrash, } from "@tabler/icons-react"; import combineClasses from "clsx"; import { useAtomValue } from "jotai"; import { useConfirmModal, useModalAction } from "@homarr/modals"; import { useScopedI18n } from "@homarr/translation/client"; import { loadWidgetDynamic, reduceWidgetOptionsWithDefaultValues, useServerDataFor, WidgetEditModal, } from "@homarr/widgets"; import type { Item } from "~/app/[locale]/boards/_types"; import { useRequiredBoard } from "~/app/[locale]/boards/(content)/_context"; import { editModeAtom } from "../editMode"; import { useItemActions } from "../items/item-actions"; import type { UseGridstackRefs } from "./gridstack/use-gridstack"; import classes from "./item.module.css"; interface Props { items: Item[]; refs: UseGridstackRefs; } export const SectionContent = ({ items, refs }: Props) => { const board = useRequiredBoard(); const { ref, width, height } = useElementSize(); return ( <> {items.map((item) => { return (
} > = 96 ? undefined : "xs"} >
); })} ); }; interface ItemProps { item: Item; width: number; height: number; } const BoardItem = ({ item, ...dimensions }: ItemProps) => { const board = useRequiredBoard(); const editMode = useAtomValue(editModeAtom); const serverData = useServerDataFor(item.id); const Comp = loadWidgetDynamic(item.kind); const options = reduceWidgetOptionsWithDefaultValues(item.kind, item.options); const newItem = { ...item, options }; if (!serverData?.isReady) return null; return ( <> ); }; const ItemMenu = ({ offset, item }: { offset: number; item: Item }) => { const t = useScopedI18n("item"); const { openModal } = useModalAction(WidgetEditModal); const { openConfirmModal } = useConfirmModal(); const isEditMode = useAtomValue(editModeAtom); const { updateItemOptions, removeItem } = useItemActions(); if (!isEditMode) return null; const openEditModal = () => { openModal({ kind: item.kind, value: { options: item.options, integrations: item.integrations.map(({ id }) => id), }, onSuccessfulEdit: ({ options, integrations: _ }) => { updateItemOptions({ itemId: item.id, newOptions: options, }); }, integrationData: [], integrationSupport: false, }); }; const openRemoveModal = () => { openConfirmModal({ title: t("remove.title"), children: t("remove.message"), onConfirm: () => { removeItem({ itemId: item.id }); }, }); }; return ( {t("menu.label.settings")} } onClick={openEditModal} > {t("action.edit")} }> {t("action.move")} {t("menu.label.dangerZone")} } onClick={openRemoveModal} > {t("action.remove")} ); };