import { useListContext, useTranslate } from "ra-core"; import type { ChangeEvent, FormEvent, ReactElement } from "react"; import { useState } from "react"; import isEqual from "lodash/isEqual"; import { Button } from "@/components/ui/button"; import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, } from "@/components/ui/dialog"; import { Input } from "@/components/ui/input"; import { Label } from "@/components/ui/label"; import { extractValidSavedQueries, useSavedQueries, } from "@/hooks/saved-queries"; /** * Dialog for saving the current list view query (filters, sort, pagination) as a named saved query. * * Used by FilterButton in the List view. * * @internal */ export const AddSavedQueryDialog = ({ open, onClose, }: AddSavedQueryDialogProps): ReactElement => { const translate = useTranslate(); const { resource, filterValues, displayedFilters, sort, perPage } = useListContext(); const [savedQueries, setSavedQueries] = useSavedQueries(resource); // input state const [queryName, setQueryName] = useState(""); const handleQueryNameChange = ( event: ChangeEvent, ): void => { setQueryName(event.target.value); }; const handleFormSubmit = (e: FormEvent): void => { e.preventDefault(); addQuery(); }; const addQuery = (): void => { const newSavedQuery = { label: queryName, value: { filter: filterValues, sort, perPage, displayedFilters, }, }; const newSavedQueries = extractValidSavedQueries(savedQueries); setSavedQueries(newSavedQueries.concat(newSavedQuery)); setQueryName(""); onClose(); }; return ( {translate("ra.saved_queries.new_dialog_title", { _: "Save current query as", })}
); }; export interface AddSavedQueryDialogProps { open: boolean; onClose: () => void; } /** * Dialog for removing a saved query from the user's list. * * @internal */ export const RemoveSavedQueryDialog = ({ open, onClose, }: RemoveSavedQueryDialogProps): ReactElement => { const translate = useTranslate(); const { resource, filterValues, sort, perPage, displayedFilters } = useListContext(); const [savedQueries, setSavedQueries] = useSavedQueries(resource); const removeQuery = (): void => { const savedQueryToRemove = { filter: filterValues, sort, perPage, displayedFilters, }; const newSavedQueries = extractValidSavedQueries(savedQueries); const index = newSavedQueries.findIndex((savedFilter) => isEqual(savedFilter.value, savedQueryToRemove), ); setSavedQueries([ ...newSavedQueries.slice(0, index), ...newSavedQueries.slice(index + 1), ]); onClose(); }; return ( {translate("ra.saved_queries.remove_dialog_title", { _: "Remove saved query?", })} {translate("ra.saved_queries.remove_message", { _: "Are you sure you want to remove that item from your list of saved queries?", })} ); }; export interface RemoveSavedQueryDialogProps { open: boolean; onClose: () => void; }