blob: ab3166889d1e16c6822be9e4236d3bee24d048e5 [file] [log] [blame]
<template>
<b-container fluid="xl">
<page-title />
<b-row>
<b-col xl="9" class="text-right">
<b-button variant="link" @click="initModalSettings">
<icon-settings />
{{ $t('pageUserManagement.accountPolicySettings') }}
</b-button>
<b-button
variant="primary"
data-test-id="userManagement-button-addUser"
@click="initModalUser(null)"
>
<icon-add />
{{ $t('pageUserManagement.addUser') }}
</b-button>
</b-col>
</b-row>
<b-row>
<b-col xl="9">
<table-toolbar
ref="toolbar"
:selected-items-count="selectedRows.length"
:actions="tableToolbarActions"
@clear-selected="clearSelectedRows($refs.table)"
@batch-action="onBatchAction"
/>
<b-table
ref="table"
responsive="md"
selectable
show-empty
no-select-on-click
hover
:busy="isBusy"
:fields="fields"
:items="tableItems"
:empty-text="$t('global.table.emptyMessage')"
@row-selected="onRowSelected($event, tableItems.length)"
>
<!-- Checkbox column -->
<template #head(checkbox)>
<b-form-checkbox
v-model="tableHeaderCheckboxModel"
data-test-id="userManagement-checkbox-tableHeaderCheckbox"
:indeterminate="tableHeaderCheckboxIndeterminate"
@change="onChangeHeaderCheckbox($refs.table)"
>
<span class="sr-only">{{ $t('global.table.selectAll') }}</span>
</b-form-checkbox>
</template>
<template #cell(checkbox)="row">
<b-form-checkbox
v-model="row.rowSelected"
data-test-id="userManagement-checkbox-toggleSelectRow"
@change="toggleSelectRow($refs.table, row.index)"
>
<span class="sr-only">{{ $t('global.table.selectItem') }}</span>
</b-form-checkbox>
</template>
<!-- table actions column -->
<template #cell(actions)="{ item }">
<table-row-action
v-for="(action, index) in item.actions"
:key="index"
:value="action.value"
:enabled="action.enabled"
:title="action.title"
@click-table-action="onTableRowAction($event, item)"
>
<template #icon>
<icon-edit
v-if="action.value === 'edit'"
:data-test-id="`userManagement-tableRowAction-edit-${index}`"
/>
<icon-trashcan
v-if="action.value === 'delete'"
:data-test-id="`userManagement-tableRowAction-delete-${index}`"
/>
</template>
</table-row-action>
</template>
</b-table>
</b-col>
</b-row>
<b-row>
<b-col xl="8">
<b-button
v-b-toggle.collapse-role-table
data-test-id="userManagement-button-viewPrivilegeRoleDescriptions"
variant="link"
class="mt-3"
>
<icon-chevron />
{{ $t('pageUserManagement.viewPrivilegeRoleDescriptions') }}
</b-button>
<b-collapse id="collapse-role-table" class="mt-3">
<table-roles />
</b-collapse>
</b-col>
</b-row>
<!-- Modals -->
<modal-settings :settings="setting" @ok="saveAccountSettings" />
<modal-user
:user="activeUser"
:password-requirements="passwordRequirements"
@ok="saveUser"
@hidden="activeUser = null"
/>
</b-container>
</template>
<script>
import IconTrashcan from '@carbon/icons-vue/es/trash-can/20';
import IconEdit from '@carbon/icons-vue/es/edit/20';
import IconAdd from '@carbon/icons-vue/es/add--alt/20';
import IconSettings from '@carbon/icons-vue/es/settings/20';
import IconChevron from '@carbon/icons-vue/es/chevron--up/20';
import ModalUser from './ModalUser';
import ModalSettings from './ModalSettings';
import PageTitle from '@/components/Global/PageTitle';
import TableRoles from './TableRoles';
import TableToolbar from '@/components/Global/TableToolbar';
import TableRowAction from '@/components/Global/TableRowAction';
import BVTableSelectableMixin, {
selectedRows,
tableHeaderCheckboxModel,
tableHeaderCheckboxIndeterminate,
} from '@/components/Mixins/BVTableSelectableMixin';
import BVToastMixin from '@/components/Mixins/BVToastMixin';
import LoadingBarMixin from '@/components/Mixins/LoadingBarMixin';
export default {
name: 'UserManagement',
components: {
IconAdd,
IconChevron,
IconEdit,
IconSettings,
IconTrashcan,
ModalSettings,
ModalUser,
PageTitle,
TableRoles,
TableRowAction,
TableToolbar,
},
mixins: [BVTableSelectableMixin, BVToastMixin, LoadingBarMixin],
beforeRouteLeave(to, from, next) {
this.hideLoader();
next();
},
data() {
return {
isBusy: true,
activeUser: null,
setting: {},
fields: [
{
key: 'checkbox',
},
{
key: 'username',
label: this.$t('pageUserManagement.table.username'),
},
{
key: 'privilege',
label: this.$t('pageUserManagement.table.privilege'),
},
{
key: 'status',
label: this.$t('pageUserManagement.table.status'),
},
{
key: 'actions',
label: '',
tdClass: 'text-right text-nowrap',
},
],
tableToolbarActions: [
{
value: 'delete',
label: this.$t('global.action.delete'),
},
{
value: 'enable',
label: this.$t('global.action.enable'),
},
{
value: 'disable',
label: this.$t('global.action.disable'),
},
],
selectedRows: selectedRows,
tableHeaderCheckboxModel: tableHeaderCheckboxModel,
tableHeaderCheckboxIndeterminate: tableHeaderCheckboxIndeterminate,
};
},
computed: {
allUsers() {
return this.$store.getters['userManagement/allUsers'];
},
tableItems() {
// transform user data to table data
return this.allUsers.map((user) => {
return {
username: user.UserName,
privilege: user.RoleId,
status: user.Locked
? 'Locked'
: user.Enabled
? 'Enabled'
: 'Disabled',
actions: [
{
value: 'edit',
enabled: this.editEnable(user),
title: this.$t('pageUserManagement.editUser'),
},
{
value: 'delete',
enabled:
user.UserName === this.$store.getters['global/username']
? false
: true && user.UserName === 'root'
? false
: true,
title: this.$tc('pageUserManagement.deleteUser'),
},
],
...user,
};
});
},
settings() {
return this.$store.getters['userManagement/accountSettings'];
},
passwordRequirements() {
return this.$store.getters['userManagement/accountPasswordRequirements'];
},
},
created() {
this.startLoader();
this.$store.dispatch('userManagement/getUsers').finally(() => {
this.endLoader();
this.isBusy = false;
});
this.$store.dispatch('userManagement/getAccountSettings');
this.$store.dispatch('userManagement/getAccountRoles');
},
methods: {
editEnable(user) {
if ('root' === this.$store.getters['global/username']) {
return true;
} else {
return user.UserName === 'root' ? false : true;
}
},
initModalUser(user) {
this.activeUser = user;
this.$bvModal.show('modal-user');
},
initModalDelete(user) {
this.$bvModal
.msgBoxConfirm(
this.$t('pageUserManagement.modal.deleteConfirmMessage', {
user: user.username,
}),
{
title: this.$tc('pageUserManagement.deleteUser'),
okTitle: this.$tc('pageUserManagement.deleteUser'),
cancelTitle: this.$t('global.action.cancel'),
autoFocusButton: 'ok',
},
)
.then((deleteConfirmed) => {
if (deleteConfirmed) {
this.deleteUser(user);
}
});
},
initModalSettings() {
this.setting = this.settings;
this.$bvModal.show('modal-settings');
},
saveUser({ isNewUser, userData }) {
this.startLoader();
if (isNewUser) {
this.$store
.dispatch('userManagement/createUser', userData)
.then((success) => this.successToast(success))
.catch(({ message }) => this.errorToast(message))
.finally(() => this.endLoader());
} else {
this.$store
.dispatch('userManagement/updateUser', userData)
.then((success) => this.successToast(success))
.catch(({ message }) => this.errorToast(message))
.finally(() => this.endLoader());
}
},
deleteUser({ username }) {
this.startLoader();
this.$store
.dispatch('userManagement/deleteUser', username)
.then((success) => this.successToast(success))
.catch(({ message }) => this.errorToast(message))
.finally(() => this.endLoader());
},
onBatchAction(action) {
switch (action) {
case 'delete':
this.$bvModal
.msgBoxConfirm(
this.$tc(
'pageUserManagement.modal.batchDeleteConfirmMessage',
this.selectedRows.length,
),
{
title: this.$tc(
'pageUserManagement.deleteUser',
this.selectedRows.length,
),
okTitle: this.$tc(
'pageUserManagement.deleteUser',
this.selectedRows.length,
),
cancelTitle: this.$t('global.action.cancel'),
autoFocusButton: 'ok',
},
)
.then((deleteConfirmed) => {
if (deleteConfirmed) {
this.startLoader();
this.$store
.dispatch('userManagement/deleteUsers', this.selectedRows)
.then((messages) => {
messages.forEach(({ type, message }) => {
if (type === 'success') this.successToast(message);
if (type === 'error') this.errorToast(message);
});
})
.finally(() => this.endLoader());
}
});
break;
case 'enable':
this.startLoader();
this.$store
.dispatch('userManagement/enableUsers', this.selectedRows)
.then((messages) => {
messages.forEach(({ type, message }) => {
if (type === 'success') this.successToast(message);
if (type === 'error') this.errorToast(message);
});
})
.finally(() => this.endLoader());
break;
case 'disable':
this.startLoader();
this.$store
.dispatch('userManagement/disableUsers', this.selectedRows)
.then((messages) => {
messages.forEach(({ type, message }) => {
if (type === 'success') this.successToast(message);
if (type === 'error') this.errorToast(message);
});
})
.finally(() => this.endLoader());
break;
}
},
onTableRowAction(action, row) {
switch (action) {
case 'edit':
this.initModalUser(row);
break;
case 'delete':
this.initModalDelete(row);
break;
default:
break;
}
},
saveAccountSettings(settings) {
this.startLoader();
this.$store
.dispatch('userManagement/saveAccountSettings', settings)
.then((message) => this.successToast(message))
.catch(({ message }) => this.errorToast(message))
.finally(() => this.endLoader());
},
},
};
</script>
<style lang="scss" scoped>
.btn.collapsed {
svg {
transform: rotate(180deg);
}
}
</style>