fix: Empty context menu when user does not have permission to update collection

This commit is contained in:
Tom Moor
2021-07-06 22:02:31 -04:00
parent 429c5fba85
commit aeba8ce4eb
3 changed files with 73 additions and 61 deletions

View File

@ -83,7 +83,7 @@ const Submenu = React.forwardRef(({ templateItems, title, ...rest }, ref) => {
); );
}); });
function Template({ items, ...menu }: Props): React.Node { export function filterTemplateItems(items: TMenuItem[]): TMenuItem[] {
let filtered = items.filter((item) => item.visible !== false); let filtered = items.filter((item) => item.visible !== false);
// this block literally just trims unneccessary separators // this block literally just trims unneccessary separators
@ -101,7 +101,11 @@ function Template({ items, ...menu }: Props): React.Node {
return [...acc, item]; return [...acc, item];
}, []); }, []);
return filtered.map((item, index) => { return filtered;
}
function Template({ items, ...menu }: Props): React.Node {
return filterTemplateItems(items).map((item, index) => {
if (item.to) { if (item.to) {
return ( return (
<MenuItem <MenuItem

View File

@ -12,7 +12,7 @@ import CollectionExport from "scenes/CollectionExport";
import CollectionPermissions from "scenes/CollectionPermissions"; import CollectionPermissions from "scenes/CollectionPermissions";
import ContextMenu from "components/ContextMenu"; import ContextMenu from "components/ContextMenu";
import OverflowMenuButton from "components/ContextMenu/OverflowMenuButton"; import OverflowMenuButton from "components/ContextMenu/OverflowMenuButton";
import Template from "components/ContextMenu/Template"; import Template, { filterTemplateItems } from "components/ContextMenu/Template";
import Modal from "components/Modal"; import Modal from "components/Modal";
import useStores from "hooks/useStores"; import useStores from "hooks/useStores";
import getDataTransferFiles from "utils/getDataTransferFiles"; import getDataTransferFiles from "utils/getDataTransferFiles";
@ -110,33 +110,9 @@ function CollectionMenu({
); );
const can = policies.abilities(collection.id); const can = policies.abilities(collection.id);
const items = React.useMemo(
return ( () =>
<> filterTemplateItems([
<VisuallyHidden>
<input
type="file"
ref={file}
onChange={handleFilePicked}
onClick={stopPropagation}
accept={documents.importFileTypes.join(", ")}
tabIndex="-1"
/>
</VisuallyHidden>
{label ? (
<MenuButton {...menu}>{label}</MenuButton>
) : (
<OverflowMenuButton aria-label={t("Show menu")} {...menu} />
)}
<ContextMenu
{...menu}
onOpen={handleOpen}
onClose={onClose}
aria-label={t("Collection")}
>
<Template
{...menu}
items={[
{ {
title: t("New document"), title: t("New document"),
visible: can.update, visible: can.update,
@ -173,8 +149,38 @@ function CollectionMenu({
visible: !!(collection && can.delete), visible: !!(collection && can.delete),
onClick: () => setShowCollectionDelete(true), onClick: () => setShowCollectionDelete(true),
}, },
]} ]),
[can, collection, handleNewDocument, handleImportDocument, t]
);
if (!items.length) {
return null;
}
return (
<>
<VisuallyHidden>
<input
type="file"
ref={file}
onChange={handleFilePicked}
onClick={stopPropagation}
accept={documents.importFileTypes.join(", ")}
tabIndex="-1"
/> />
</VisuallyHidden>
{label ? (
<MenuButton {...menu}>{label}</MenuButton>
) : (
<OverflowMenuButton aria-label={t("Show menu")} {...menu} />
)}
<ContextMenu
{...menu}
onOpen={handleOpen}
onClose={onClose}
aria-label={t("Collection")}
>
<Template {...menu} items={items} />
</ContextMenu> </ContextMenu>
{renderModals && ( {renderModals && (
<> <>

View File

@ -149,6 +149,7 @@ function CollectionScene() {
/> />
</Action> </Action>
{can.update && ( {can.update && (
<>
<Action> <Action>
<Tooltip <Tooltip
tooltip={t("New document")} tooltip={t("New document")}
@ -166,8 +167,9 @@ function CollectionScene() {
</Button> </Button>
</Tooltip> </Tooltip>
</Action> </Action>
)}
<Separator /> <Separator />
</>
)}
<Action> <Action>
<CollectionMenu <CollectionMenu
collection={collection} collection={collection}