Skip to content

Commit

Permalink
fix(page-builder-flp): do not show editor-related actions for viewers (
Browse files Browse the repository at this point in the history
…#3825)

Co-authored-by: Pavel Denisjuk <pavel@webiny.com>
  • Loading branch information
adrians5j and Pavel910 committed Jan 23, 2024
1 parent a748d0c commit 0e08224
Show file tree
Hide file tree
Showing 43 changed files with 767 additions and 264 deletions.
2 changes: 2 additions & 0 deletions packages/api-page-builder-aco/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import { getSearchablePageContent } from "~/utils/getSearchableContent";
import { PageSearchProcessor, PbAcoContext } from "~/types";
import { createApp } from "~/app";
import { PageBuilderCrudDecorators } from "~/utils/PageBuilderCrudDecorators";
import { createPbPageWbyAcoLocationGqlField } from "~/page/graphql/createPbPageWbyAcoLocationGqlField";

export * from "./createAppModifier";
export * from "./plugins";
Expand Down Expand Up @@ -47,6 +48,7 @@ export const createAcoPageBuilderContext = () => {
await decoratePageBuilderCrud(context);
createPageHooks(context);
createPageProcessors(context);
createPbPageWbyAcoLocationGqlField(context);
});

plugin.name = "page-builder-aco.createContext";
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
import { PbAcoContext } from "~/types";
import { Page } from "@webiny/api-page-builder/types";
import { GraphQLSchemaPlugin } from "@webiny/handler-graphql";

export const createPbPageWbyAcoLocationGqlField = (context: PbAcoContext) => {
context.plugins.register(
new GraphQLSchemaPlugin<PbAcoContext>({
typeDefs: /* GraphQL */ `
type WbyPbAcoLocation {
folderId: String
}
extend type PbPage {
wbyAco_location: WbyPbAcoLocation
}
`,
resolvers: {
PbPage: {
wbyAco_location: async (page: Page, args, context: PbAcoContext) => {
const pageSearchRecord = await context.pageBuilderAco.app.search.get(
page.pid
);

if (pageSearchRecord && pageSearchRecord.location.folderId !== "root") {
return {
folderId: pageSearchRecord.location.folderId
};
}

return {
folderId: null
};
}
}
}
})
);
};
Original file line number Diff line number Diff line change
Expand Up @@ -98,6 +98,9 @@ describe("page custom field", () => {
},
{
name: "customViews"
},
{
name: "wbyAco_location"
}
]
});
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ import { routePaths } from "~/utils";

// TODO: Fix this import so that we can import it from root level maybe
import { PublishRevisionProps } from "@webiny/app-page-builder/admin/plugins/pageDetails/header/publishRevision/PublishRevision";
import { PublishPageMenuOptionProps } from "@webiny/app-page-builder/admin/plugins/pageDetails/pageRevisions/PublishPageMenuOption";
import { PublishPageMenuOptionProps } from "@webiny/app-page-builder/admin/plugins/pageDetails/pageRevisions/MenuOptions/PublishPageMenuOption";
import { PageRevisionListItemGraphicProps } from "@webiny/app-page-builder/admin/plugins/pageDetails/pageRevisions/PageRevisionListItemGraphic";
import { usePage } from "@webiny/app-page-builder/pageEditor/hooks/usePage";

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,11 +4,9 @@ import { useRecords } from "@webiny/app-aco";
import { observer } from "mobx-react-lite";
import { PageListConfig } from "~/admin/config/pages";
import { useAdminPageBuilder } from "~/admin/hooks/useAdminPageBuilder";
import { usePagesPermissions } from "~/hooks/permissions";
import { getPagesLabel } from "~/admin/components/BulkActions/BulkActions";

export const ActionDelete = observer(() => {
const { canDelete } = usePagesPermissions();
const { deletePage, client } = useAdminPageBuilder();
const { removeRecordFromCache } = useRecords();

Expand All @@ -21,10 +19,6 @@ export const ActionDelete = observer(() => {
return getPagesLabel(worker.items.length);
}, [worker.items.length]);

const canDeleteAll = useMemo(() => {
return worker.items.every(item => canDelete(item.data.createdBy.id));
}, [worker.items]);

const openDeletePagesDialog = () =>
showConfirmationDialog({
title: "Delete pages",
Expand Down Expand Up @@ -79,11 +73,6 @@ export const ActionDelete = observer(() => {
}
});

if (!canDeleteAll) {
console.log("You don't have permissions to delete pages.");
return null;
}

return (
<IconButton
icon={<DeleteIcon />}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import React, { useCallback, useMemo } from "react";
import { ReactComponent as MoveIcon } from "@material-design-icons/svg/outlined/drive_file_move.svg";
import { useRecords, useMoveToFolderDialog, useNavigateFolder } from "@webiny/app-aco";
import { useMoveToFolderDialog, useNavigateFolder, useRecords } from "@webiny/app-aco";
import { FolderItem } from "@webiny/app-aco/types";
import { observer } from "mobx-react-lite";
import { PageListConfig } from "~/admin/config/pages";
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,11 +4,9 @@ import { useRecords } from "@webiny/app-aco";
import { observer } from "mobx-react-lite";
import { PageListConfig } from "~/admin/config/pages";
import { useAdminPageBuilder } from "~/admin/hooks/useAdminPageBuilder";
import { usePagesPermissions } from "~/hooks/permissions";
import { getPagesLabel } from "~/admin/components/BulkActions/BulkActions";

export const ActionPublish = observer(() => {
const { canPublish } = usePagesPermissions();
const { publishPage, client } = useAdminPageBuilder();
const { getRecord } = useRecords();

Expand Down Expand Up @@ -68,11 +66,6 @@ export const ActionPublish = observer(() => {
}
});

if (!canPublish()) {
console.log("You don't have permissions to publish pages.");
return null;
}

return (
<IconButton
icon={<PublishIcon />}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,11 +4,9 @@ import { observer } from "mobx-react-lite";
import { useRecords } from "@webiny/app-aco";
import { PageListConfig } from "~/admin/config/pages";
import { useAdminPageBuilder } from "~/admin/hooks/useAdminPageBuilder";
import { usePagesPermissions } from "~/hooks/permissions";
import { getPagesLabel } from "~/admin/components/BulkActions/BulkActions";

export const ActionUnpublish = observer(() => {
const { canUnpublish } = usePagesPermissions();
const { unpublishPage, client } = useAdminPageBuilder();
const { getRecord } = useRecords();

Expand Down Expand Up @@ -68,11 +66,6 @@ export const ActionUnpublish = observer(() => {
}
});

if (!canUnpublish()) {
console.log("You don't have permissions to unpublish pages.");
return null;
}

return (
<IconButton
icon={<UnpublishIcon />}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
import React, { useMemo } from "react";
import { useFolders } from "@webiny/app-aco";
import { observer } from "mobx-react-lite";
import { PageListConfig } from "~/admin/config/pages";
import { usePagesPermissions } from "~/hooks/permissions";
import { ActionDelete as ActionDeleteBase } from "~/admin/components/BulkActions";

export const SecureActionDelete = observer(() => {
const { canDelete } = usePagesPermissions();
const { folderLevelPermissions: flp } = useFolders();

const { useWorker } = PageListConfig.Browser.BulkAction;
const worker = useWorker();

const canDeleteAll = useMemo(() => {
return worker.items.every(item => {
return (
canDelete(item.data.createdBy.id) && flp.canManageContent(item.location?.folderId)
);
});
}, [worker.items]);

if (!canDeleteAll) {
console.log("You don't have permissions to delete pages.");
return null;
}

return <ActionDeleteBase />;
});
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
import React, { useMemo } from "react";
import { useFolders } from "@webiny/app-aco";
import { observer } from "mobx-react-lite";
import { PageListConfig } from "~/admin/config/pages";
import { ActionMove as ActionMoveBase } from "~/admin/components/BulkActions";

export const SecureActionMove = observer(() => {
const { useWorker } = PageListConfig.Browser.BulkAction;
const worker = useWorker();
const { folderLevelPermissions: flp } = useFolders();

const canMoveAll = useMemo(() => {
return worker.items.every(item => {
return flp.canManageContent(item.location?.folderId);
});
}, [worker.items]);

if (!canMoveAll) {
return null;
}

return <ActionMoveBase />;
});
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
import React, { useMemo } from "react";
import { useFolders } from "@webiny/app-aco";
import { observer } from "mobx-react-lite";
import { PageListConfig } from "~/admin/config/pages";
import { usePagesPermissions } from "~/hooks/permissions";
import { ActionPublish as ActionPublishBase } from "~/admin/components/BulkActions";

export const SecureActionPublish = observer(() => {
const { canPublish } = usePagesPermissions();

const { folderLevelPermissions: flp } = useFolders();

const { useWorker } = PageListConfig.Browser.BulkAction;
const worker = useWorker();

const canPublishAll = useMemo(() => {
return worker.items.every(item => {
return canPublish() && flp.canManageContent(item.location?.folderId);
});
}, [worker.items]);

if (!canPublishAll) {
console.log("You don't have permissions to publish pages.");
return null;
}

return <ActionPublishBase />;
});
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
import React, { useMemo } from "react";
import { observer } from "mobx-react-lite";
import { useFolders } from "@webiny/app-aco";
import { PageListConfig } from "~/admin/config/pages";
import { usePagesPermissions } from "~/hooks/permissions";
import { ActionUnpublish as ActionUnpublishBase } from "~/admin/components/BulkActions";

export const SecureActionUnpublish = observer(() => {
const { canUnpublish } = usePagesPermissions();
const { folderLevelPermissions: flp } = useFolders();

const { useWorker } = PageListConfig.Browser.BulkAction;

const worker = useWorker();

const canUnpublishAll = useMemo(() => {
return worker.items.every(item => {
return canUnpublish() && flp.canManageContent(item.location?.folderId);
});
}, [worker.items]);

if (!canUnpublishAll) {
console.log("You don't have permissions to unpublish pages.");
return null;
}

return <ActionUnpublishBase />;
});
Original file line number Diff line number Diff line change
@@ -1,6 +1,10 @@
export { ActionDelete } from "./ActionDelete";
export { SecureActionDelete } from "./SecureActionDelete";
export { ActionExport } from "./ActionExport";
export { ActionMove } from "./ActionMove";
export { SecureActionMove } from "./SecureActionMove";
export { ActionPublish } from "./ActionPublish";
export { SecureActionPublish } from "./SecureActionPublish";
export { ActionUnpublish } from "./ActionUnpublish";
export { SecureActionUnpublish } from "./SecureActionUnpublish";
export * from "./BulkActions";
Original file line number Diff line number Diff line change
Expand Up @@ -4,19 +4,13 @@ import { ReactComponent as Unpublish } from "@material-design-icons/svg/outlined
import { PageListConfig } from "~/admin/config/pages";
import { usePage } from "~/admin/views/Pages/hooks/usePage";
import { useChangePageStatus } from "~/admin/views/Pages/hooks/useChangePageStatus";
import { usePagesPermissions } from "~/hooks/permissions";

export const ChangePageStatus = () => {
const { page } = usePage();
const { openDialogUnpublishPage, openDialogPublishPage } = useChangePageStatus({ page });
const { OptionsMenuItem } = PageListConfig.Browser.PageAction;
const { hasPermissions, canPublish, canUnpublish } = usePagesPermissions();

if (!hasPermissions()) {
return null;
}

if (page.data.status === "published" && canUnpublish()) {
if (page.data.status === "published") {
return (
<OptionsMenuItem
icon={<Unpublish />}
Expand All @@ -27,16 +21,12 @@ export const ChangePageStatus = () => {
);
}

if (canPublish()) {
return (
<OptionsMenuItem
icon={<Publish />}
label={"Publish"}
onAction={openDialogPublishPage}
data-testid={"aco.actions.pb.page.publish"}
/>
);
}

return null;
return (
<OptionsMenuItem
icon={<Publish />}
label={"Publish"}
onAction={openDialogPublishPage}
data-testid={"aco.actions.pb.page.publish"}
/>
);
};
Original file line number Diff line number Diff line change
Expand Up @@ -3,18 +3,12 @@ import { ReactComponent as Delete } from "@material-design-icons/svg/outlined/de
import { PageListConfig } from "~/admin/config/pages";
import { usePage } from "~/admin/views/Pages/hooks/usePage";
import { useDeletePage } from "~/admin/views/Pages/hooks/useDeletePage";
import { usePagesPermissions } from "~/hooks/permissions";

export const DeletePage = () => {
const { page } = usePage();
const { canDelete } = usePagesPermissions();
const { openDialogDeletePage } = useDeletePage({ page });
const { OptionsMenuItem } = PageListConfig.Browser.PageAction;

if (!canDelete(page.data.createdBy.id)) {
return null;
}

return (
<OptionsMenuItem
icon={<Delete />}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,22 +4,16 @@ import { PageListConfig } from "~/admin/config/pages";
import { usePage } from "~/admin/views/Pages/hooks/usePage";
import { useCreatePageFrom } from "~/admin/views/Pages/hooks/useCreatePageFrom";
import { useNavigatePage } from "~/admin/hooks/useNavigatePage";
import { usePagesPermissions } from "~/hooks/permissions";

export const EditPage = () => {
const { page } = usePage();
const { canUpdate } = usePagesPermissions();
const { OptionsMenuItem, OptionsMenuLink } = PageListConfig.Browser.PageAction;
const { getPageEditorUrl, navigateToPageEditor } = useNavigatePage();
const { createPageForm, loading } = useCreatePageFrom({
page,
onSuccess: () => navigateToPageEditor(page.data.pid)
});

if (!canUpdate(page.data.createdBy.id)) {
return null;
}

if (page.data.locked) {
return (
<OptionsMenuItem
Expand Down
Loading

0 comments on commit 0e08224

Please sign in to comment.