blob: dba181f2566f6a15ffd0ac589b9fa0ccaaa03847 [file] [log] [blame]
<template>
<b-container fluid="xl">
<page-title :description="$t('pageSnmpAlerts.pageDescription')" />
<b-row>
<b-col xl="9" class="text-right">
<b-button variant="primary" @click="initModalAddDestination">
<icon-add />
{{ $t('pageSnmpAlerts.addDestination') }}
</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
: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="snmpAlerts-checkbox-selectAll"
: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="`snmpAlerts-checkbox-selectRow-${row.index}`"
@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"
:data-test-id="`snmpAlerts-button-deleteRow-${item.index}`"
@click-table-action="onTableRowAction($event, item)"
>
<template #icon>
<icon-trashcan v-if="action.value === 'delete'" />
</template>
</table-row-action>
</template>
</b-table>
</b-col>
</b-row>
<!-- Modals -->
<modal-add-destination @ok="onModalOk" />
</b-container>
</template>
<script>
import IconTrashcan from '@carbon/icons-vue/es/trash-can/20';
import ModalAddDestination from './ModalAddDestination';
import PageTitle from '@/components/Global/PageTitle';
import IconAdd from '@carbon/icons-vue/es/add--alt/20';
import TableToolbar from '@/components/Global/TableToolbar';
import TableRowAction from '@/components/Global/TableRowAction';
import LoadingBarMixin from '@/components/Mixins/LoadingBarMixin';
import BVToastMixin from '@/components/Mixins/BVToastMixin';
import BVTableSelectableMixin, {
selectedRows,
tableHeaderCheckboxModel,
tableHeaderCheckboxIndeterminate,
} from '@/components/Mixins/BVTableSelectableMixin';
export default {
name: 'SnmpAlerts',
components: {
PageTitle,
IconAdd,
TableToolbar,
IconTrashcan,
ModalAddDestination,
TableRowAction,
},
mixins: [BVTableSelectableMixin, BVToastMixin, LoadingBarMixin],
beforeRouteLeave(to, from, next) {
this.hideLoader();
next();
},
data() {
return {
fields: [
{
key: 'checkbox',
},
{
key: 'IP',
label: this.$t('pageSnmpAlerts.table.ipaddress'),
},
{
key: 'Port',
label: this.$t('pageSnmpAlerts.table.port'),
},
{
key: 'actions',
label: '',
tdClass: 'text-right text-nowrap',
},
],
tableToolbarActions: [
{
value: 'delete',
label: this.$t('global.action.delete'),
},
],
selectedRows: selectedRows,
tableHeaderCheckboxModel: tableHeaderCheckboxModel,
tableHeaderCheckboxIndeterminate: tableHeaderCheckboxIndeterminate,
};
},
computed: {
allSnmpDetails() {
return this.$store.getters['snmpAlerts/allSnmpDetails'];
},
tableItems() {
// transform destination data to table data
return this.allSnmpDetails.map((subscriptions) => {
const [destination, dataWithProtocol, dataWithoutProtocol] = [
subscriptions.Destination,
subscriptions.Destination.split('/')[2].split(':'),
subscriptions.Destination.split(':'),
];
//condition to check if destination comes with protocol or not
const conditionForProtocolCheck = destination.includes('://');
const ip = conditionForProtocolCheck
? dataWithProtocol[0]
: dataWithoutProtocol[0];
const port = conditionForProtocolCheck
? dataWithProtocol[1]
: dataWithoutProtocol[1];
return {
IP: ip,
Port: port,
id: subscriptions.Id,
actions: [
{
value: 'delete',
enabled: true,
title: this.$tc('pageSnmpAlerts.deleteDestination'),
},
],
...subscriptions,
};
});
},
},
created() {
this.startLoader();
this.$store
.dispatch('snmpAlerts/getSnmpDetails')
.finally(() => this.endLoader());
},
methods: {
onModalOk({ ipAddress, port }) {
const protocolIpAddress = 'snmp://' + ipAddress;
const destination = port
? protocolIpAddress + ':' + port
: protocolIpAddress;
const data = {
Destination: destination,
SubscriptionType: 'SNMPTrap',
Protocol: 'SNMPv2c',
};
this.startLoader();
this.$store
.dispatch('snmpAlerts/addDestination', { data })
.then((success) => this.successToast(success))
.catch(({ message }) => this.errorToast(message))
.finally(() => this.endLoader());
},
initModalAddDestination() {
this.$bvModal.show('add-destination');
},
initModalDeleteDestination(destination) {
this.$bvModal
.msgBoxConfirm(
this.$t('pageSnmpAlerts.modal.deleteConfirmMessage', {
destination: destination.id,
}),
{
title: this.$tc('pageSnmpAlerts.modal.deleteSnmpDestinationTitle'),
okTitle: this.$tc('pageSnmpAlerts.deleteDestination'),
cancelTitle: this.$t('global.action.cancel'),
autoFocusButton: 'ok',
},
)
.then((deleteConfirmed) => {
if (deleteConfirmed) {
this.deleteDestination(destination);
}
});
},
deleteDestination({ id }) {
this.startLoader();
this.$store
.dispatch('snmpAlerts/deleteDestination', id)
.then((success) => this.successToast(success))
.catch(({ message }) => this.errorToast(message))
.finally(() => this.endLoader());
},
onBatchAction(action) {
if (action === 'delete') {
this.$bvModal
.msgBoxConfirm(
this.$tc(
'pageSnmpAlerts.modal.batchDeleteConfirmMessage',
this.selectedRows.length,
),
{
title: this.$tc(
'pageSnmpAlerts.modal.deleteSnmpDestinationTitle',
this.selectedRows.length,
),
okTitle: this.$tc(
'pageSnmpAlerts.deleteDestination',
this.selectedRows.length,
),
cancelTitle: this.$t('global.action.cancel'),
autoFocusButton: 'ok',
},
)
.then((deleteConfirmed) => {
if (deleteConfirmed) {
this.startLoader();
this.$store
.dispatch(
'snmpAlerts/deleteMultipleDestinations',
this.selectedRows,
)
.then((messages) => {
messages.forEach(({ type, message }) => {
if (type === 'success') this.successToast(message);
if (type === 'error') this.errorToast(message);
});
})
.finally(() => this.endLoader());
}
});
}
},
onTableRowAction(action, row) {
if (action === 'delete') {
this.initModalDeleteDestination(row);
}
},
},
};
</script>