import { useIsAnyMutationRunning, useLanguageProfiles } from "@/apis/hooks"; import { SimpleTable, Toolbox } from "@/components"; import { Selector, SelectorOption } from "@/components/inputs"; import { useCustomSelection } from "@/components/tables/plugins"; import { GetItemId, useSelectorOptions } from "@/utilities"; import { faCheck, faUndo } from "@fortawesome/free-solid-svg-icons"; import { Box, Container } from "@mantine/core"; import { uniqBy } from "lodash"; import { useCallback, useMemo, useState } from "react"; import { UseMutationResult } from "react-query"; import { useNavigate } from "react-router-dom"; import { Column, useRowSelect } from "react-table"; interface MassEditorProps { columns: Column[]; data: T[]; mutation: UseMutationResult; } function MassEditor(props: MassEditorProps) { const { columns, data: raw, mutation } = props; const [selections, setSelections] = useState([]); const [dirties, setDirties] = useState([]); const hasTask = useIsAnyMutationRunning(); const { data: profiles } = useLanguageProfiles(); const navigate = useNavigate(); const onEnded = useCallback(() => navigate(".."), [navigate]); const data = useMemo( () => uniqBy([...dirties, ...(raw ?? [])], GetItemId), [dirties, raw] ); const profileOptions = useSelectorOptions(profiles ?? [], (v) => v.name); const profileOptionsWithAction = useMemo< SelectorOption[] >( () => [ { label: "Clear", value: null, group: "Action" }, ...profileOptions.options, ], [profileOptions.options] ); const getKey = useCallback((value: Language.Profile | null) => { if (value) { return value.name; } return "Clear"; }, []); const { mutateAsync } = mutation; const save = useCallback(() => { const form: FormType.ModifyItem = { id: [], profileid: [], }; dirties.forEach((v) => { const id = GetItemId(v); if (id) { form.id.push(id); form.profileid.push(v.profileId); } }); return mutateAsync(form); }, [dirties, mutateAsync]); const setProfiles = useCallback( (profile: Language.Profile | null) => { const id = profile?.profileId ?? null; const newItems = selections.map((v) => ({ ...v, profileId: id })); setDirties((dirty) => { return uniqBy([...newItems, ...dirty], GetItemId); }); }, [selections] ); return ( Cancel Save ); } export default MassEditor;