farmcontrol-ui/src/database/permissions.js
Tom Butcher 24c06c25d3 Refactor JavaScript Language Support and Enhance Autocomplete Functionality
- Consolidated JavaScript completion sources into a new module, improving organization and maintainability.
- Updated the `fcTemplateLang` to utilize the new `javascriptCompletionSources` for enhanced autocomplete capabilities.
- Removed redundant imports and streamlined the code in various components, including Invoices, Payments, TaxRecords, and Inventory sections, by replacing dropdown actions with a unified `ObjectActions` component.
- Improved the handling of object actions across multiple inventory and finance components, enhancing user experience and code consistency.
2026-08-20 19:35:09 +01:00

70 lines
2.0 KiB
JavaScript

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
}