blob: 8a9b8e7392681786fff10126e3a8e824ed63786c [file] [log] [blame]
Konstantin Aladyshev7c1cfe72023-05-16 09:03:25 +00001<template>
2 <b-container fluid="xl">
3 <page-title :description="$t('pageSnmpAlerts.pageDescription')" />
4 <b-row>
5 <b-col xl="9" class="text-right">
6 <b-button variant="primary" @click="initModalAddDestination">
7 <icon-add />
8 {{ $t('pageSnmpAlerts.addDestination') }}
9 </b-button>
10 </b-col>
11 </b-row>
12 <b-row>
13 <b-col xl="9">
14 <table-toolbar
15 ref="toolbar"
16 :selected-items-count="selectedRows.length"
17 :actions="tableToolbarActions"
18 @clear-selected="clearSelectedRows($refs.table)"
19 @batch-action="onBatchAction"
20 />
21 <b-table
22 ref="table"
23 responsive="md"
24 selectable
25 show-empty
26 no-select-on-click
27 hover
28 :fields="fields"
29 :items="tableItems"
30 :empty-text="$t('global.table.emptyMessage')"
31 @row-selected="onRowSelected($event, tableItems.length)"
32 >
33 <!-- Checkbox column -->
34 <template #head(checkbox)>
35 <b-form-checkbox
36 v-model="tableHeaderCheckboxModel"
37 data-test-id="snmpAlerts-checkbox-selectAll"
38 :indeterminate="tableHeaderCheckboxIndeterminate"
39 @change="onChangeHeaderCheckbox($refs.table)"
40 >
41 <span class="sr-only">{{ $t('global.table.selectAll') }}</span>
42 </b-form-checkbox>
43 </template>
44 <template #cell(checkbox)="row">
45 <b-form-checkbox
46 v-model="row.rowSelected"
47 :data-test-id="`snmpAlerts-checkbox-selectRow-${row.index}`"
48 @change="toggleSelectRow($refs.table, row.index)"
49 >
50 <span class="sr-only">{{ $t('global.table.selectItem') }}</span>
51 </b-form-checkbox>
52 </template>
53
54 <!-- table actions column -->
55 <template #cell(actions)="{ item }">
56 <table-row-action
57 v-for="(action, index) in item.actions"
58 :key="index"
59 :value="action.value"
60 :enabled="action.enabled"
61 :title="action.title"
62 :data-test-id="`snmpAlerts-button-deleteRow-${item.index}`"
63 @click-table-action="onTableRowAction($event, item)"
64 >
65 <template #icon>
66 <icon-trashcan v-if="action.value === 'delete'" />
67 </template>
68 </table-row-action>
69 </template>
70 </b-table>
71 </b-col>
72 </b-row>
73 <!-- Modals -->
74 <modal-add-destination @ok="onModalOk" />
75 </b-container>
76</template>
77
78<script>
79import IconTrashcan from '@carbon/icons-vue/es/trash-can/20';
80import ModalAddDestination from './ModalAddDestination';
81import PageTitle from '@/components/Global/PageTitle';
82import IconAdd from '@carbon/icons-vue/es/add--alt/20';
83import TableToolbar from '@/components/Global/TableToolbar';
84import TableRowAction from '@/components/Global/TableRowAction';
85import LoadingBarMixin from '@/components/Mixins/LoadingBarMixin';
86import BVToastMixin from '@/components/Mixins/BVToastMixin';
87
88import BVTableSelectableMixin, {
89 selectedRows,
90 tableHeaderCheckboxModel,
91 tableHeaderCheckboxIndeterminate,
92} from '@/components/Mixins/BVTableSelectableMixin';
93export default {
94 name: 'SnmpAlerts',
95 components: {
96 PageTitle,
97 IconAdd,
98 TableToolbar,
99 IconTrashcan,
100 ModalAddDestination,
101 TableRowAction,
102 },
103 mixins: [BVTableSelectableMixin, BVToastMixin, LoadingBarMixin],
104 beforeRouteLeave(to, from, next) {
105 this.hideLoader();
106 next();
107 },
108 data() {
109 return {
110 fields: [
111 {
112 key: 'checkbox',
113 },
114 {
115 key: 'IP',
116 label: this.$t('pageSnmpAlerts.table.ipaddress'),
117 },
118 {
119 key: 'Port',
120 label: this.$t('pageSnmpAlerts.table.port'),
121 },
122 {
123 key: 'actions',
124 label: '',
125 tdClass: 'text-right text-nowrap',
126 },
127 ],
128 tableToolbarActions: [
129 {
130 value: 'delete',
131 label: this.$t('global.action.delete'),
132 },
133 ],
134 selectedRows: selectedRows,
135 tableHeaderCheckboxModel: tableHeaderCheckboxModel,
136 tableHeaderCheckboxIndeterminate: tableHeaderCheckboxIndeterminate,
137 };
138 },
139 computed: {
140 allSnmpDetails() {
141 return this.$store.getters['snmpAlerts/allSnmpDetails'];
142 },
143 tableItems() {
144 // transform destination data to table data
145 return this.allSnmpDetails.map((subscriptions) => {
146 const [destination, dataWithProtocol, dataWithoutProtocol] = [
147 subscriptions.Destination,
148 subscriptions.Destination.split('/')[2].split(':'),
149 subscriptions.Destination.split(':'),
150 ];
151 //condition to check if destination comes with protocol or not
152 const conditionForProtocolCheck = destination.includes('://');
153 const ip = conditionForProtocolCheck
154 ? dataWithProtocol[0]
155 : dataWithoutProtocol[0];
156 const port = conditionForProtocolCheck
157 ? dataWithProtocol[1]
158 : dataWithoutProtocol[1];
159 return {
160 IP: ip,
161 Port: port,
162 id: subscriptions.Id,
163 actions: [
164 {
165 value: 'delete',
166 enabled: true,
167 title: this.$tc('pageSnmpAlerts.deleteDestination'),
168 },
169 ],
170 ...subscriptions,
171 };
172 });
173 },
174 },
175 created() {
176 this.startLoader();
177 this.$store
178 .dispatch('snmpAlerts/getSnmpDetails')
179 .finally(() => this.endLoader());
180 },
181 methods: {
182 onModalOk({ ipAddress, port }) {
183 const protocolIpAddress = 'snmp://' + ipAddress;
184 const destination = port
185 ? protocolIpAddress + ':' + port
186 : protocolIpAddress;
187 const data = {
188 Destination: destination,
189 SubscriptionType: 'SNMPTrap',
190 Protocol: 'SNMPv2c',
191 };
192 this.startLoader();
193 this.$store
194 .dispatch('snmpAlerts/addDestination', { data })
195 .then((success) => this.successToast(success))
196 .catch(({ message }) => this.errorToast(message))
197 .finally(() => this.endLoader());
198 },
199 initModalAddDestination() {
200 this.$bvModal.show('add-destination');
201 },
202 initModalDeleteDestination(destination) {
203 this.$bvModal
204 .msgBoxConfirm(
205 this.$t('pageSnmpAlerts.modal.deleteConfirmMessage', {
206 destination: destination.id,
207 }),
208 {
209 title: this.$tc('pageSnmpAlerts.modal.deleteSnmpDestinationTitle'),
210 okTitle: this.$tc('pageSnmpAlerts.deleteDestination'),
211 cancelTitle: this.$t('global.action.cancel'),
212 }
213 )
214 .then((deleteConfirmed) => {
215 if (deleteConfirmed) {
216 this.deleteDestination(destination);
217 }
218 });
219 },
220 deleteDestination({ id }) {
221 this.startLoader();
222 this.$store
223 .dispatch('snmpAlerts/deleteDestination', id)
224 .then((success) => this.successToast(success))
225 .catch(({ message }) => this.errorToast(message))
226 .finally(() => this.endLoader());
227 },
228 onBatchAction(action) {
229 if (action === 'delete') {
230 this.$bvModal
231 .msgBoxConfirm(
232 this.$tc(
233 'pageSnmpAlerts.modal.batchDeleteConfirmMessage',
234 this.selectedRows.length
235 ),
236 {
237 title: this.$tc(
238 'pageSnmpAlerts.modal.deleteSnmpDestinationTitle',
239 this.selectedRows.length
240 ),
241 okTitle: this.$tc(
242 'pageSnmpAlerts.deleteDestination',
243 this.selectedRows.length
244 ),
245 cancelTitle: this.$t('global.action.cancel'),
246 }
247 )
248 .then((deleteConfirmed) => {
249 if (deleteConfirmed) {
250 this.startLoader();
251 this.$store
252 .dispatch(
253 'snmpAlerts/deleteMultipleDestinations',
254 this.selectedRows
255 )
256 .then((messages) => {
257 messages.forEach(({ type, message }) => {
258 if (type === 'success') this.successToast(message);
259 if (type === 'error') this.errorToast(message);
260 });
261 })
262 .finally(() => this.endLoader());
263 }
264 });
265 }
266 },
267 onTableRowAction(action, row) {
268 if (action === 'delete') {
269 this.initModalDeleteDestination(row);
270 }
271 },
272 },
273};
274</script>