diff --git a/lib/vue/src/components/permissions/CPermissionsModal.vue b/lib/vue/src/components/permissions/CPermissionsModal.vue
index 26e0daeaf..579a507cc 100644
--- a/lib/vue/src/components/permissions/CPermissionsModal.vue
+++ b/lib/vue/src/components/permissions/CPermissionsModal.vue
@@ -48,6 +48,7 @@
data-test-id="select-user-list-roles"
key="roleID"
label="name"
+ :disabled="!currentRoleID"
:clearable="false"
:options="roles"
:get-option-key="getOptionRoleKey"
@@ -177,7 +178,7 @@
@@ -268,6 +269,7 @@ export default {
data () {
return {
processing: false,
+ submitting: false,
backendComponentName: undefined,
@@ -313,7 +315,7 @@ export default {
},
submitDisabled () {
- return !this.dirty
+ return !this.dirty || this.processing || this.submitting
},
addEnabled () {
@@ -354,6 +356,8 @@ export default {
methods: {
loadModal ({ resource, title, target, allSpecific }) {
+ this.processing = true
+
this.resource = resource
this.title = title
this.target = target
@@ -366,83 +370,57 @@ export default {
if (!this.roles.length) {
return this.fetchRoles()
} else if (this.currentRoleID) {
- const roleID = this.currentRoleID
- this.processing = true
-
- return this.fetchRules(roleID).then(() => {
- return Promise.all(this.evaluate.map(e => {
- const { userID } = e.userID || {}
- let { roleID = [] } = e
- roleID = roleID.map(({ roleID }) => roleID)
-
- return this.evaluatePermissions({ roleID, userID }).then(rules => {
- return {
- ...e,
- rules,
- }
- })
- })).then(evaluate => {
- this.evaluate = evaluate
- })
- })
+ return this.reevaluatePermissions(this.currentRoleID)
}
+ }).finally(() => {
+ this.processing = false
})
},
onHide () {
- this.clear()
- },
-
- clear () {
this.resource = undefined
this.title = undefined
this.target = undefined
},
onRoleChange (roleID) {
- this.fetchRules(roleID)
+ this.processing = true
+
+ this.fetchRules(roleID).finally(() => {
+ this.processing = false
+ })
},
onSubmit () {
- this.processing = true
+ this.submitting = true
const rules = this.collectChangedRules()
const roleID = this.currentRoleID
this.api.permissionsUpdate({ roleID, rules }).then(() => {
- this.fetchRules(roleID)
+ this.reevaluatePermissions(roleID)
}).finally(() => {
- this.processing = false
- this.onHide()
+ this.submitting = false
})
},
async fetchPermissions () {
- this.processing = true
-
// clean loaded rules
this.rules = []
this.permissions = []
return this.api.permissionsList().then((pp) => {
this.permissions = this.filterPermissions(pp)
- }).finally(() => {
- this.processing = false
})
},
async fetchRules (roleID) {
- this.processing = true
-
return this.api.permissionsRead({ roleID, resource: this.resource }).then((rules) => {
this.rules = this.normalizeRules(rules)
- }).finally(() => {
- this.processing = false
})
},
async fetchRoles () {
- this.processing = true
// Roles are always fetched from $SystemAPI.
return this.$SystemAPI.roleList().then(({ set }) => {
this.roles = set
@@ -453,8 +431,6 @@ export default {
this.currentRoleID = this.roles[0].roleID
this.onRoleChange(this.currentRoleID)
}
- }).finally(() => {
- this.processing = false
})
},
@@ -468,6 +444,24 @@ export default {
})
},
+ async reevaluatePermissions (roleID) {
+ return this.fetchRules(roleID).then(() => {
+ return Promise.all(this.evaluate.map(e => {
+ let { roleID = [], userID } = e
+ roleID = roleID.map(({ roleID }) => roleID)
+
+ return this.evaluatePermissions({ roleID, userID }).then(rules => {
+ return {
+ ...e,
+ rules,
+ }
+ })
+ })).then(evaluate => {
+ this.evaluate = evaluate
+ })
+ })
+ },
+
searchUsers (query = '', loading) {
loading(true)
@@ -601,6 +595,7 @@ export default {
setDefaultValues () {
this.processing = false
+ this.submitting = false
this.backendComponentName = undefined
this.resource = undefined
this.title = undefined
diff --git a/lib/vue/src/components/permissions/form/Rule.vue b/lib/vue/src/components/permissions/form/Rule.vue
index 76d5dab63..257bf63ee 100644
--- a/lib/vue/src/components/permissions/form/Rule.vue
+++ b/lib/vue/src/components/permissions/form/Rule.vue
@@ -4,7 +4,7 @@
>
{{ title || `${operation} on ${resource}` }}