diff --git a/app/client/src/ce/pages/workspace/WorkspaceInviteUsersForm.tsx b/app/client/src/ce/pages/workspace/WorkspaceInviteUsersForm.tsx index d60453c0f1..8e5a319f35 100644 --- a/app/client/src/ce/pages/workspace/WorkspaceInviteUsersForm.tsx +++ b/app/client/src/ce/pages/workspace/WorkspaceInviteUsersForm.tsx @@ -40,7 +40,7 @@ import { isEmail } from "utils/formhelpers"; import { isPermitted, PERMISSION_TYPE, -} from "pages/Applications/permissionHelpers"; +} from "@appsmith/utils/permissionHelpers"; import { getAppsmithConfigs } from "@appsmith/configs"; import { ReactComponent as NoEmailConfigImage } from "assets/images/email-not-configured.svg"; import AnalyticsUtil from "utils/AnalyticsUtil"; diff --git a/app/client/src/ce/sagas/tenantSagas.tsx b/app/client/src/ce/sagas/tenantSagas.tsx index 624d635810..56ff39134b 100644 --- a/app/client/src/ce/sagas/tenantSagas.tsx +++ b/app/client/src/ce/sagas/tenantSagas.tsx @@ -2,7 +2,7 @@ import { ReduxActionTypes, ReduxActionErrorTypes, } from "@appsmith/constants/ReduxActionConstants"; -import { PERMISSION_TYPE } from "pages/Applications/permissionHelpers"; +import { PERMISSION_TYPE } from "@appsmith/utils/permissionHelpers"; import { put } from "redux-saga/effects"; // On CE we don't expose tenant config so this shouldn't make any API calls and should just return necessary permissions for the user diff --git a/app/client/src/ce/selectors/tenantSelectors.tsx b/app/client/src/ce/selectors/tenantSelectors.tsx index 687595572f..ce35412c83 100644 --- a/app/client/src/ce/selectors/tenantSelectors.tsx +++ b/app/client/src/ce/selectors/tenantSelectors.tsx @@ -1,5 +1,5 @@ import { AppState } from "@appsmith/reducers"; export const getTenantPermissions = (state: AppState) => { - return state.tenant.userPermissions; + return state.tenant?.userPermissions; }; diff --git a/app/client/src/ce/utils/permissionHelpers.tsx b/app/client/src/ce/utils/permissionHelpers.tsx new file mode 100644 index 0000000000..6adca2c528 --- /dev/null +++ b/app/client/src/ce/utils/permissionHelpers.tsx @@ -0,0 +1,50 @@ +export enum PERMISSION_TYPE { + /* Workspace permissions */ + CREATE_WORKSPACE = "create:workspaces", + MANAGE_WORKSPACE = "manage:workspaces", + READ_WORKSPACE = "read:workspaces", + INVITE_USER_TO_WORKSPACE = "inviteUsers:workspace", + /* Application permissions */ + CREATE_APPLICATION = "manage:workspaceApplications", + MANAGE_APPLICATION = "manage:applications", + EXPORT_APPLICATION = "export:applications", + READ_APPLICATION = "read:applications", + MAKE_PUBLIC_APPLICATION = "makePublic:applications", + PUBLISH_APPLICATION = "publish:workspaceApplications", + /* Datasource permissions */ + CREATE_DATASOURCES = "create:datasources", + EXECUTE_DATASOURCES = "execute:datasources", + CREATE_DATASOURCE_ACTIONS = "create:datasourceActions", + DELETE_DATASOURCES = "delete:datasources", + MANAGE_DATASOURCES = "manage:datasources", + EXECUTE_WORKSPACE_DATASOURCES = "execute:workspaceDatasources", + /* Page permissions */ + CREATE_PAGES = "create:pages", + MANAGE_PAGES = "manage:pages", + DELETE_PAGES = "delete:pages", + /* Query permissions */ + CREATE_ACTIONS = "create:pageActions", + MANAGE_ACTIONS = "manage:actions", + DELETE_ACTIONS = "delete:actions", + EXECUTE_ACTIONS = "execute:actions", +} + +export enum LOGIC_FILTER { + AND = "AND", + OR = "OR", +} + +export const isPermitted = ( + permissions: string[] = [], + type: string | string[], + filter: LOGIC_FILTER = LOGIC_FILTER.AND, +) => { + if (Array.isArray(type)) { + if (filter === LOGIC_FILTER.AND) { + return type.every((t) => permissions.includes(t)); + } else { + return type.some((t) => permissions.includes(t)); + } + } + return permissions.includes(type); +}; diff --git a/app/client/src/components/editorComponents/form/FormDialogComponent.tsx b/app/client/src/components/editorComponents/form/FormDialogComponent.tsx index 91b7652185..2f4f3e8b43 100644 --- a/app/client/src/components/editorComponents/form/FormDialogComponent.tsx +++ b/app/client/src/components/editorComponents/form/FormDialogComponent.tsx @@ -1,5 +1,5 @@ import React, { ReactNode, useState, useEffect } from "react"; -import { isPermitted } from "pages/Applications/permissionHelpers"; +import { isPermitted } from "@appsmith/utils/permissionHelpers"; import { useDispatch } from "react-redux"; import { setShowAppInviteUsersDialog } from "actions/applicationActions"; import { diff --git a/app/client/src/ee/utils/permissionHelpers.tsx b/app/client/src/ee/utils/permissionHelpers.tsx new file mode 100644 index 0000000000..a3174a7d38 --- /dev/null +++ b/app/client/src/ee/utils/permissionHelpers.tsx @@ -0,0 +1,6 @@ +export * from "ce/utils/permissionHelpers"; +import { PERMISSION_TYPE as CE_PERMISSION_TYPE } from "ce/utils/permissionHelpers"; + +export const PERMISSION_TYPE = { + ...CE_PERMISSION_TYPE, +}; diff --git a/app/client/src/pages/AppViewer/AppViewerPageContainer.tsx b/app/client/src/pages/AppViewer/AppViewerPageContainer.tsx index d9b7693695..3bad29d682 100644 --- a/app/client/src/pages/AppViewer/AppViewerPageContainer.tsx +++ b/app/client/src/pages/AppViewer/AppViewerPageContainer.tsx @@ -14,7 +14,7 @@ import { getCurrentApplication } from "selectors/applicationSelectors"; import { isPermitted, PERMISSION_TYPE, -} from "../Applications/permissionHelpers"; +} from "@appsmith/utils/permissionHelpers"; import { builderURL } from "RouteBuilder"; import { getCanvasWidgetsStructure } from "selectors/entitiesSelector"; import equal from "fast-deep-equal/es6"; diff --git a/app/client/src/pages/AppViewer/PrimaryCTA.tsx b/app/client/src/pages/AppViewer/PrimaryCTA.tsx index a34fabaab1..996e3019a0 100644 --- a/app/client/src/pages/AppViewer/PrimaryCTA.tsx +++ b/app/client/src/pages/AppViewer/PrimaryCTA.tsx @@ -6,7 +6,7 @@ import { AUTH_LOGIN_URL } from "constants/routes"; import { PERMISSION_TYPE, isPermitted, -} from "pages/Applications/permissionHelpers"; +} from "@appsmith/utils/permissionHelpers"; import { getCurrentApplication, getCurrentPageId, diff --git a/app/client/src/pages/Applications/ApplicationCard.tsx b/app/client/src/pages/Applications/ApplicationCard.tsx index c28a664358..6727ace612 100644 --- a/app/client/src/pages/Applications/ApplicationCard.tsx +++ b/app/client/src/pages/Applications/ApplicationCard.tsx @@ -18,7 +18,7 @@ import { ApplicationPayload } from "@appsmith/constants/ReduxActionConstants"; import { isPermitted, PERMISSION_TYPE, -} from "pages/Applications/permissionHelpers"; +} from "@appsmith/utils/permissionHelpers"; import { getInitialsAndColorCode, getApplicationIcon, diff --git a/app/client/src/pages/Applications/ForkApplicationModal.tsx b/app/client/src/pages/Applications/ForkApplicationModal.tsx index 6a92fa31ec..0742c15b14 100644 --- a/app/client/src/pages/Applications/ForkApplicationModal.tsx +++ b/app/client/src/pages/Applications/ForkApplicationModal.tsx @@ -2,7 +2,10 @@ import React, { useState, useMemo, useEffect } from "react"; import { useDispatch } from "react-redux"; import { useSelector } from "store"; import { getUserApplicationsWorkspaces } from "selectors/applicationSelectors"; -import { isPermitted, PERMISSION_TYPE } from "./permissionHelpers"; +import { + isPermitted, + PERMISSION_TYPE, +} from "@appsmith/utils/permissionHelpers"; import { ReduxActionTypes } from "@appsmith/constants/ReduxActionConstants"; import { AppState } from "@appsmith/reducers"; import { diff --git a/app/client/src/pages/Applications/index.tsx b/app/client/src/pages/Applications/index.tsx index e1d03a62ce..1b8c515dca 100644 --- a/app/client/src/pages/Applications/index.tsx +++ b/app/client/src/pages/Applications/index.tsx @@ -36,7 +36,6 @@ import PageWrapper from "pages/common/PageWrapper"; import SubHeader from "pages/common/SubHeader"; import ApplicationCard from "./ApplicationCard"; import WorkspaceInviteUsersForm from "@appsmith/pages/workspace/WorkspaceInviteUsersForm"; -import { isPermitted, PERMISSION_TYPE } from "./permissionHelpers"; import FormDialogComponent from "components/editorComponents/form/FormDialogComponent"; import { User } from "constants/userConstants"; import { getCurrentUser, selectFeatureFlags } from "selectors/usersSelectors"; @@ -103,6 +102,10 @@ import { MOBILE_MAX_WIDTH } from "constants/AppConstants"; import urlBuilder from "entities/URLRedirect/URLAssembly"; import RepoLimitExceededErrorModal from "../Editor/gitSync/RepoLimitExceededErrorModal"; import { resetEditorRequest } from "actions/initActions"; +import { + isPermitted, + PERMISSION_TYPE, +} from "@appsmith/utils/permissionHelpers"; const WorkspaceDropDown = styled.div<{ isMobile?: boolean }>` display: flex; diff --git a/app/client/src/pages/Applications/permissionHelpers.tsx b/app/client/src/pages/Applications/permissionHelpers.tsx deleted file mode 100644 index affca79d4b..0000000000 --- a/app/client/src/pages/Applications/permissionHelpers.tsx +++ /dev/null @@ -1,16 +0,0 @@ -export enum PERMISSION_TYPE { - CREATE_WORKSPACE = "create:workspaces", - MANAGE_WORKSPACE = "manage:workspaces", - CREATE_APPLICATION = "manage:workspaceApplications", - MANAGE_APPLICATION = "manage:applications", - EXPORT_APPLICATION = "export:applications", - READ_APPLICATION = "read:applications", - READ_WORKSPACE = "read:workspaces", - INVITE_USER_TO_WORKSPACE = "inviteUsers:workspace", - MAKE_PUBLIC_APPLICATION = "makePublic:applications", - PUBLISH_APPLICATION = "publish:workspaceApplications", -} - -export const isPermitted = (permissions: string[], type: string) => { - return permissions.includes(type); -}; diff --git a/app/client/src/pages/Editor/EditorAppName/NavigationMenuData.ts b/app/client/src/pages/Editor/EditorAppName/NavigationMenuData.ts index 647bc84e6c..9045e45fd8 100644 --- a/app/client/src/pages/Editor/EditorAppName/NavigationMenuData.ts +++ b/app/client/src/pages/Editor/EditorAppName/NavigationMenuData.ts @@ -15,7 +15,7 @@ import { getExportAppAPIRoute } from "@appsmith/constants/ApiConstants"; import { isPermitted, PERMISSION_TYPE, -} from "../../Applications/permissionHelpers"; +} from "@appsmith/utils/permissionHelpers"; import { getCurrentApplication } from "selectors/applicationSelectors"; import { Colors } from "constants/Colors"; import { setIsGitSyncModalOpen } from "actions/gitSyncActions"; diff --git a/app/client/src/pages/workspace/AppInviteUsersForm.tsx b/app/client/src/pages/workspace/AppInviteUsersForm.tsx index dbb3b5a21b..1f9d619b85 100644 --- a/app/client/src/pages/workspace/AppInviteUsersForm.tsx +++ b/app/client/src/pages/workspace/AppInviteUsersForm.tsx @@ -8,7 +8,7 @@ import { CopyToClipboard } from "design-system"; import { isPermitted, PERMISSION_TYPE, -} from "../Applications/permissionHelpers"; +} from "@appsmith/utils/permissionHelpers"; import WorkspaceInviteUsersForm, { InviteButtonWidth, } from "@appsmith/pages/workspace/WorkspaceInviteUsersForm"; diff --git a/app/client/src/selectors/applicationSelectors.tsx b/app/client/src/selectors/applicationSelectors.tsx index 4cc65f181e..626744a6b1 100644 --- a/app/client/src/selectors/applicationSelectors.tsx +++ b/app/client/src/selectors/applicationSelectors.tsx @@ -14,7 +14,7 @@ import { GitApplicationMetadata } from "api/ApplicationApi"; import { isPermitted, PERMISSION_TYPE, -} from "pages/Applications/permissionHelpers"; +} from "@appsmith/utils/permissionHelpers"; const fuzzySearchOptions = { keys: ["applications.name", "workspace.name"], diff --git a/app/client/src/selectors/onboardingSelectors.tsx b/app/client/src/selectors/onboardingSelectors.tsx index 3367f4c330..1264e07f48 100644 --- a/app/client/src/selectors/onboardingSelectors.tsx +++ b/app/client/src/selectors/onboardingSelectors.tsx @@ -1,7 +1,7 @@ import { isPermitted, PERMISSION_TYPE, -} from "pages/Applications/permissionHelpers"; +} from "@appsmith/utils/permissionHelpers"; import { AppState } from "@appsmith/reducers"; import { createSelector } from "reselect"; import { getUserApplicationsWorkspaces } from "./applicationSelectors"; diff --git a/app/client/src/selectors/usersSelectors.tsx b/app/client/src/selectors/usersSelectors.tsx index d8e1f47ca7..6b24bcd942 100644 --- a/app/client/src/selectors/usersSelectors.tsx +++ b/app/client/src/selectors/usersSelectors.tsx @@ -3,7 +3,7 @@ import { User } from "constants/userConstants"; import { PropertyPanePositionConfig } from "reducers/uiReducers/usersReducer"; export const getCurrentUser = (state: AppState): User | undefined => - state.ui.users.currentUser; + state.ui?.users?.currentUser; export const getUserAuthError = (state: AppState): string => state.ui.users.error; export const getUsers = (state: AppState): User[] => state.ui.users.users; diff --git a/app/client/src/utils/helpers.tsx b/app/client/src/utils/helpers.tsx index 036eec3d8c..6fc0e9b027 100644 --- a/app/client/src/utils/helpers.tsx +++ b/app/client/src/utils/helpers.tsx @@ -14,7 +14,7 @@ import { Workspace } from "constants/workspaceConstants"; import { isPermitted, PERMISSION_TYPE, -} from "pages/Applications/permissionHelpers"; +} from "@appsmith/utils/permissionHelpers"; import moment from "moment"; import { extraLibrariesNames, isDynamicValue } from "./DynamicBindingUtils"; import { ApiResponse } from "api/ApiResponses";