diff --git a/entity/ActivityLink_entity/ActivityLink_entity.aod b/entity/ActivityLink_entity/ActivityLink_entity.aod index f7987fab4718097f8b6e7b3f19dadcd043fa4265..5a442b8bdb42c51c181ffacc1125aeb10bca904e 100644 --- a/entity/ActivityLink_entity/ActivityLink_entity.aod +++ b/entity/ActivityLink_entity/ActivityLink_entity.aod @@ -20,6 +20,7 @@ <title>{$OBJECTLINK_TYPE}</title> <consumer>Context</consumer> <mandatory v="true" /> + <stateProcess>%aditoprj%/entity/ActivityLink_entity/entityfields/object_type/stateProcess.js</stateProcess> <displayValueProcess>%aditoprj%/entity/ActivityLink_entity/entityfields/object_type/displayValueProcess.js</displayValueProcess> </entityField> <entityField> @@ -28,6 +29,7 @@ <consumer>Objects</consumer> <linkedContextProcess>%aditoprj%/entity/ActivityLink_entity/entityfields/object_rowid/linkedContextProcess.js</linkedContextProcess> <mandatory v="true" /> + <stateProcess>%aditoprj%/entity/ActivityLink_entity/entityfields/object_rowid/stateProcess.js</stateProcess> <displayValueProcess>%aditoprj%/entity/ActivityLink_entity/entityfields/object_rowid/displayValueProcess.js</displayValueProcess> </entityField> <entityField> @@ -94,6 +96,10 @@ <name>#PROVIDER_AGGREGATES</name> <useAggregates v="true" /> </entityProvider> + <entityField> + <name>OBJECT_PERMISSION_RESULT</name> + <valueProcess>%aditoprj%/entity/ActivityLink_entity/entityfields/object_permission_result/valueProcess.js</valueProcess> + </entityField> </entityFields> <recordContainers> <dbRecordContainer> diff --git a/entity/ActivityLink_entity/entityfields/object_permission_result/valueProcess.js b/entity/ActivityLink_entity/entityfields/object_permission_result/valueProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..88f23e2bd91abf20ab02f207f8a5b4cd75133f7d --- /dev/null +++ b/entity/ActivityLink_entity/entityfields/object_permission_result/valueProcess.js @@ -0,0 +1,6 @@ +import("Permission_lib"); +import("system.result"); +import("system.vars"); + +var res = PermissionUtil.getPermissionResult(vars.get("$field.OBJECT_TYPE"), vars.get("$field.OBJECT_ROWID"), vars.get("$sys.recordstate"), vars.get("$sys.user")); +result.string(JSON.stringify(res)); diff --git a/entity/ActivityLink_entity/entityfields/object_rowid/displayValueProcess.js b/entity/ActivityLink_entity/entityfields/object_rowid/displayValueProcess.js index 95c4eea5367140dc2d81e470ba0607adf52f07c1..d6a0d0797444273c5ef01266eae170a48f1e9b81 100644 --- a/entity/ActivityLink_entity/entityfields/object_rowid/displayValueProcess.js +++ b/entity/ActivityLink_entity/entityfields/object_rowid/displayValueProcess.js @@ -1,11 +1,5 @@ -import("system.neon"); import("system.vars"); -import("system.db"); import("system.result"); -import("Context_lib"); -if(vars.get("$sys.recordstate") == neon.OPERATINGSTATE_NEW && !vars.get("$field.OBJECT_ROWID")) { - result.string(""); -} else if (vars.exists("$field.OBJECT_TYPE") && vars.get("$field.OBJECT_TYPE")) { - result.string(ContextUtils.getTitleByContext(vars.get("$field.OBJECT_TYPE"), vars.get("$field.OBJECT_ROWID"))); -} \ No newline at end of file +var permissionResult = JSON.parse(vars.get("$field.OBJECT_PERMISSION_RESULT")); +result.string(permissionResult.title); diff --git a/entity/ActivityLink_entity/entityfields/object_rowid/stateProcess.js b/entity/ActivityLink_entity/entityfields/object_rowid/stateProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..efa6035588f424554c113306c1916811f01b028d --- /dev/null +++ b/entity/ActivityLink_entity/entityfields/object_rowid/stateProcess.js @@ -0,0 +1,6 @@ +import("Permission_lib"); +import("system.result"); +import("system.vars"); + +var permissionResult = JSON.parse(vars.get("$field.OBJECT_PERMISSION_RESULT")); +result.string(PermissionUtil.getVisibilityByPermissionResult(permissionResult, vars.get("$sys.recordstate"))); diff --git a/entity/ActivityLink_entity/entityfields/object_type/stateProcess.js b/entity/ActivityLink_entity/entityfields/object_type/stateProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..d371cb8fb2daade746a6ec85d775388087fc5eef --- /dev/null +++ b/entity/ActivityLink_entity/entityfields/object_type/stateProcess.js @@ -0,0 +1,6 @@ +import("Permission_lib"); +import("system.vars"); +import("system.result"); + +var permissionResult = JSON.parse(vars.get("$field.OBJECT_PERMISSION_RESULT")); +result.string(PermissionUtil.getVisibilityByPermissionResult(permissionResult, vars.get("$sys.recordstate"))); diff --git a/process/Permission_lib/process.js b/process/Permission_lib/process.js index 0273d9b02dbc9161d1ac4af462398653c131999c..717172cf8db3d2d151e29a23fe77057c53e95310 100644 --- a/process/Permission_lib/process.js +++ b/process/Permission_lib/process.js @@ -1,3 +1,7 @@ +import("system.translate"); +import("Context_lib"); +import("system.logging"); +import("system.neon"); import("system.vars"); import("system.tools"); import("system.SQLTYPES"); @@ -52,6 +56,10 @@ PermissionEnums.RESTRICTED_ACTION_ICON = function () { PermissionEnums.FORBIDDEN_ACTION_ICON = function () { return "VAADIN:CLOSE"; } +PermissionEnums.NO_PERMISSION = function () { + return "NO_PERMISSION"; +} + /** * Provides functions to work with permissions. @@ -983,6 +991,120 @@ function PermissionUtil () {} }); } + /** + * Returns the permission result for a given object. + * + * @param pObjectType the type of the object, e.g. "Organisation". + * + * @param pObjectRowId the id of the object. + * + * @param pRecordState the current record state. + * + * @param pUser the user. + * + * @return {Object{}} returns an object with a status to react accordingly in stateProcesses and a title for display. + */ + PermissionUtil.getPermissionResult = function(pObjectType, pObjectRowId, pRecordState, pUser) + { + var NO_PERMISSION_TITLE = translate.text("No Permission"); + var DEFAULT_ERROR = translate.text("Error"); + + var res = { + status: null, + title: null + }; + + if(pRecordState != neon.OPERATINGSTATE_NEW && pObjectType) + { + var entity = ContextUtils.getEntity(pObjectType); + if (tools.hasPermission(tools.PERMISSION_VIEW, entity, null, pUser, null)) + { + if (pObjectRowId) + { + try { + if (tools.hasPermission(tools.PERMISSION_READ, entity, null, pUser, [pObjectRowId])) + { + res = { + status: tools.PERMISSION_READ, + title: ContextUtils.getTitleByContext(pObjectType, pObjectRowId) + }; + } + else + { + res = { + status: tools.PERMISSION_VIEW, + title: NO_PERMISSION_TITLE + }; + } + } + catch (err) + { + // display "no permission" if there was an error while calculating permissions + if (err.fileName == "Permission_lib") + { + res = { + status: tools.PERMISSION_VIEW, + title: NO_PERMISSION_TITLE + }; + } + else + { + // otherwise display a default error message + res = { + status: tools.PERMISSION_VIEW, + title: DEFAULT_ERROR + }; + } + + logging.log(err); + } + } + else + { + res = { + status: tools.PERMISSION_VIEW, + title: NO_PERMISSION_TITLE + }; + } + } + else + { + res = { + status: PermissionEnums.NO_PERMISSION(), + title: NO_PERMISSION_TITLE + }; + } + } + + return res; + } + + /** + * Returns the visibility for a given object determined by the permission result. + * + * @param pPermissionResult as object. Has to contain the property 'status'. + * + * @param pRecordState the current record state. + * + * @return {String} returns the visibility determined by the permission result. + */ + PermissionUtil.getVisibilityByPermissionResult = function(pPermissionResult, pRecordState) + { + if (pRecordState != neon.OPERATINGSTATE_NEW) + { + switch (pPermissionResult.status) + { + case tools.PERMISSION_VIEW: + return neon.COMPONENTSTATE_READONLY; + case tools.PERMISSION_READ: + return neon.COMPONENTSTATE_EDITABLE; + default: + return neon.COMPONENTSTATE_INVISIBLE; + } + } + return neon.COMPONENTSTATE_AUTO; + } + } //end of block