| <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.$bvModal | 
 |             .msgBoxConfirm( | 
 |               this.$tc( | 
 |                 'pageUserManagement.modal.batchDisableConfirmMessage', | 
 |                 this.selectedRows.length, | 
 |               ), | 
 |               { | 
 |                 title: this.$tc( | 
 |                   'pageUserManagement.disableUser', | 
 |                   this.selectedRows.length, | 
 |                 ), | 
 |                 okTitle: this.$tc( | 
 |                   'pageUserManagement.disableUser', | 
 |                   this.selectedRows.length, | 
 |                 ), | 
 |                 cancelTitle: this.$t('global.action.cancel'), | 
 |                 autoFocusButton: 'ok', | 
 |               }, | 
 |             ) | 
 |             .then((disableConfirmed) => { | 
 |               if (disableConfirmed) { | 
 |                 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> |