@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
JavaScript
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 };