UNPKG

@premieroctet/next-admin

Version:

Next-Admin provides a customizable and turnkey admin dashboard for applications built with Next.js and powered by the Prisma ORM. It aims to simplify the development process by providing a turnkey admin system that can be easily integrated into your proje

168 lines (167 loc) 8.33 kB
import { jsx, jsxs } from "react/jsx-runtime"; import { Transition, TransitionChild } from "@headlessui/react"; import { SortableTree } from "dnd-kit-sortable-tree"; import external_lodash_unset_default from "lodash.unset"; import external_lodash_update_default from "lodash.update"; import { Fragment, useCallback, useMemo } from "react"; import { useI18n } from "../../context/I18nContext.mjs"; import useAdvancedSearch_mjs_default from "../../hooks/useAdvancedSearch.mjs"; import { cleanEmptyBlocks, setInternalPathToBlocks } from "../../utils/advancedSearch.mjs"; import Button_mjs_default from "../radix/Button.mjs"; import { DialogContent, DialogOverlay, DialogPortal, DialogRoot, DialogTitle } from "../radix/Dialog.mjs"; import { AdvancedSearchContext } from "./AdvancedSearchContext.mjs"; import external_AdvancedSearchDropdown_mjs_default from "./AdvancedSearchDropdown.mjs"; import external_AdvancedSearchTreeItem_mjs_default from "./AdvancedSearchTreeItem.mjs"; const AdvancedSearchModal = ({ isOpen, onClose, resource, schema })=>{ const { uiBlocks, setUiBlocks, submitSearch } = useAdvancedSearch_mjs_default({ resource, schema }); const { t } = useI18n(); const addUiBlock = useCallback((uiBlock)=>{ setUiBlocks((prev)=>{ const newBlocks = prev ? prev.slice() : []; newBlocks.push(uiBlock); setInternalPathToBlocks(newBlocks); return newBlocks; }); }, [ setUiBlocks ]); const removeUiBlock = useCallback((path)=>{ setUiBlocks((prev)=>{ if (!prev) return prev; const newBlocks = prev.slice(); external_lodash_unset_default(newBlocks, path); cleanEmptyBlocks(newBlocks); setInternalPathToBlocks(newBlocks); return newBlocks; }); }, [ setUiBlocks ]); const updateUiBlock = useCallback((uiBlock)=>{ setUiBlocks((prev)=>{ if (!prev) return prev; const newBlocks = prev.slice(); external_lodash_update_default(newBlocks, uiBlock.internalPath, ()=>uiBlock); return newBlocks; }); }, [ setUiBlocks ]); const contextValue = useMemo(()=>({ addUiBlock, removeUiBlock, updateUiBlock, resource, schema }), [ addUiBlock, removeUiBlock, updateUiBlock, resource, schema ]); const onClear = ()=>{ setUiBlocks(null); }; return /*#__PURE__*/ jsx(DialogRoot, { open: isOpen, onOpenChange: (open)=>{ if (!open) onClose(); }, modal: true, children: /*#__PURE__*/ jsx(DialogPortal, { forceMount: true, children: /*#__PURE__*/ jsxs(Transition, { show: isOpen, as: "div", children: [ /*#__PURE__*/ jsx(TransitionChild, { as: Fragment, enter: "transition-opacity ease-in-out duration-300", enterFrom: "opacity-0", enterTo: "opacity-100", leaveFrom: "opacity-100", leaveTo: "opacity-0", leave: "transition-opacity ease-in-out duration-300", children: /*#__PURE__*/ jsx(DialogOverlay, { forceMount: true }) }), /*#__PURE__*/ jsx(TransitionChild, { as: Fragment, enter: "transition-opacity ease-in-out duration-300", enterFrom: "opacity-0", enterTo: "opacity-100", leaveFrom: "opacity-100", leaveTo: "opacity-0", leave: "transition-opacity ease-in-out duration-300", children: /*#__PURE__*/ jsx(DialogContent, { forceMount: true, className: "max-w-xl md:left-[50%] md:top-[50%]", children: /*#__PURE__*/ jsxs("div", { className: "flex flex-col gap-4", children: [ /*#__PURE__*/ jsx(DialogTitle, { children: t("search.advanced.title") }), /*#__PURE__*/ jsxs(AdvancedSearchContext.Provider, { value: contextValue, children: [ uiBlocks && /*#__PURE__*/ jsx(SortableTree, { items: uiBlocks, onItemsChanged: (items, reason)=>{ const newItems = items.slice(); setInternalPathToBlocks(newItems); setUiBlocks(newItems); }, TreeItemComponent: external_AdvancedSearchTreeItem_mjs_default }), /*#__PURE__*/ jsx(external_AdvancedSearchDropdown_mjs_default, { resource: resource, schema: schema, onAddBlock: addUiBlock }), /*#__PURE__*/ jsxs("div", { className: "flex justify-between", children: [ /*#__PURE__*/ jsx(Button_mjs_default, { variant: "destructiveOutline", onClick: onClear, children: t("search.advanced.clear") }), /*#__PURE__*/ jsxs("div", { className: "flex justify-end gap-4", children: [ /*#__PURE__*/ jsx(Button_mjs_default, { variant: "ghost", onClick: onClose, children: t("search.advanced.cancel") }), /*#__PURE__*/ jsx(Button_mjs_default, { variant: "default", onClick: ()=>{ submitSearch(); onClose(); }, children: t("search.advanced.save") }) ] }) ] }) ] }) ] }) }) }) ] }) }) }); }; const advancedSearch_AdvancedSearchModal = AdvancedSearchModal; export { advancedSearch_AdvancedSearchModal as default };