Files
mixtape/zero.Backoffice.UI/old_app/components/permissions.vue
T

211 lines
5.1 KiB
Vue
Raw Normal View History

<template>
<div>
<ui-inline-tabs v-if="permissions.length" class="ui-permissions" :force-count="true">
<ui-tab v-for="(permissionCollection, index) in permissions" :key="index" :label="permissionCollection.label" :title="permissionCollection.description" :count="getCount(permissionCollection)">
<ui-error field="Claims" />
2021-08-24 16:06:13 +02:00
<ui-property v-for="(permission, index) in permissionCollection.items" :key="index" class="role-permission-toggle" :label="permission.label" :description="permission.description" :vertical="false">
<div class="ui-permissions-crud" v-if="permission.valueType === 'crud'">
<ui-toggle :value="permission.value != 'none'" :disabled="disabled" @input="onPermissionToggle($event, permission)" />
2020-09-17 11:26:23 +02:00
<ui-check-list :value="permission.value.split(',')" :items="stateItems" v-if="permission.value != 'none'" :inline="true" @input="onPermissionCRUDChecked($event, permission)" :disabled="disabled" />
</div>
2021-08-24 16:06:13 +02:00
<ui-toggle v-if="permission.valueType === 'boolean'" :disabled="disabled" v-model="permission.value" @input="onChange" />
<!--<input v-if="permission.valueType === 'string'" :disabled="disabled" v-model="permission.value" type="text" class="ui-input" @input="onChange" />-->
</ui-property>
</ui-tab>
</ui-inline-tabs>
</div>
</template>
<script>
2020-11-20 15:17:41 +01:00
import UserRolesApi from 'zero/api/userRoles.js';
import { filter as _filter } from 'underscore';
export default {
name: 'uiPermissions',
props: {
value: {
type: Array,
default: () => []
2020-04-28 14:51:17 +02:00
},
disabled: {
type: Boolean,
default: false
}
},
watch: {
value(value)
{
this.rebuild();
}
},
data: () => ({
claims: [],
stateItems: [
2020-10-22 15:45:34 +02:00
{ value: '@permission.states.read', key: 'read' },
{ value: '@permission.states.update', key: 'update' },
{ value: '@permission.states.create', key: 'create' }
],
permissions: []
}),
created()
{
UserRolesApi.getAllPermissions().then(response =>
{
this.permissions = response;
this.rebuild();
});
},
methods: {
rebuild()
{
if (!this.permissions.length)
{
return;
}
let claims = {};
this.value.forEach(claim =>
{
const parts = claim.value.split(':');
claims[parts[0]] = parts[1];
});
this.permissions.forEach(collection =>
{
collection.items.forEach(permission =>
{
permission.value = this.parsePermissionValue(claims[permission.key], permission.valueType);
});
});
},
getCount(permissionGroup)
{
return _filter(permissionGroup.items, claim =>
{
return claim.value !== 'none' && claim.value !== 'false' && !!claim.value;
}).length;
},
2020-04-28 14:51:17 +02:00
onChange()
{
let claims = [];
this.permissions.forEach(collection =>
{
collection.items.forEach(permission =>
{
if (
2020-04-29 12:11:35 +02:00
(permission.valueType === 'boolean') ||
2020-08-11 16:01:10 +02:00
(permission.valueType === 'crud') ||
2020-04-29 12:11:35 +02:00
(permission.valueType === 'string'))
2020-04-28 14:51:17 +02:00
{
claims.push({
//$type: 'zero.Core.Entities.UserClaim, zero.Core',
type: 'zero.claim.permission',
value: permission.key + ":" + permission.value
});
}
});
});
//console.info(claims);
2020-08-11 16:01:10 +02:00
2020-04-28 14:51:17 +02:00
this.$emit('input', claims);
},
onPermissionToggle(isOn, permission)
{
if (!isOn)
{
permission._oldValue = permission.value;
permission.value = 'none';
}
else
{
permission.value = permission._oldValue || 'read,create,update,delete';
}
this.onChange();
},
onPermissionCRUDChecked(val, permission)
{
if (val.indexOf('read') < 0)
{
val.push('read');
}
permission.value = val.join(',').trim(',');
this.onChange();
},
parsePermissionValue(value, type)
{
if (type === 'boolean')
{
return value === 'true';
}
2020-08-11 16:01:10 +02:00
else if (type === 'crud' && !value)
{
return 'none';
}
return value;
}
}
}
</script>
<style lang="scss">
2020-05-06 21:46:34 +02:00
.ui-permissions > .ui-property + .ui-property
{
border-top: 1px solid var(--color-line);
2020-05-06 21:46:34 +02:00
padding-top: 40px;
margin-top: 40px;
}
.ui-permissions > .ui-property > .ui-property-label
{
width: 300px;
}
2020-06-24 14:03:54 +02:00
.ui-permissions .ui-tab
{
2020-09-05 17:35:47 +02:00
border-top: 1px solid var(--color-line);
padding-top: var(--padding);
//background: var(--color-bg-dim);
//border-radius: var(--radius);
//padding: var(--padding);
}
2020-06-24 14:03:54 +02:00
.role-permission-toggle
{
border-top-width: 0 !important;
}
.ui-permissions-crud
{
display: flex;
.ui-toggle
{
margin-right: var(--padding);
}
.ui-check-list
{
margin-top: 1px;
}
}
</style>