export const applyPermissionSettingsList = (settingsList = []) => { const permissions = {} for (const setting of settingsList) { const matrix = setting?.permissions if (!matrix || typeof matrix !== 'object' || Array.isArray(matrix)) { continue } for (const [modelName, actions] of Object.entries(matrix)) { if (!actions || typeof actions !== 'object' || Array.isArray(actions)) { continue } if (!permissions[modelName]) { permissions[modelName] = {} } for (const [actionName, value] of Object.entries(actions)) { if (value === true || value === false) { permissions[modelName][actionName] = value } } if (Object.keys(permissions[modelName]).length === 0) { delete permissions[modelName] } } } return permissions } export const calculateUserPermissions = (objectData = {}) => applyPermissionSettingsList([ ...(objectData.groups || []), ...(objectData.permissionSettings || []) ]) export const calculateUserGroupPermissions = (objectData = {}) => applyPermissionSettingsList(objectData.permissionSettings) const PERMISSION_ACTION_ALIASES = { cancelEdit: 'edit', finishEdit: 'edit' } export const getPermissionActionName = (actionName) => PERMISSION_ACTION_ALIASES[actionName] || actionName const isTopLevelModelAction = (model, actionName) => (model?.actions || []).some( (action) => action?.name === actionName && action.type !== 'divider' && action.type !== 'alias' && action.type !== 'callback' ) export const hasActionPermission = (userProfile, model, actionName) => { if (!actionName) return true const permissionAction = getPermissionActionName(actionName) const isControlled = Boolean(PERMISSION_ACTION_ALIASES[actionName]) || isTopLevelModelAction(model, actionName) if (!isControlled) return true const modelName = typeof model === 'string' ? model : model?.name return userProfile?.permissions?.[modelName]?.[permissionAction] === true }