| <template> |
| <page-section :section-title="$t('pageNetwork.ipv4')"> |
| <b-row class="mb-4"> |
| <b-col lg="2" md="6"> |
| <dl> |
| <dt>{{ $t('pageNetwork.dhcp') }}</dt> |
| <dd> |
| <b-form-checkbox |
| id="dhcpSwitch" |
| v-model="dhcpEnabledState" |
| data-test-id="networkSettings-switch-dhcpEnabled" |
| switch |
| @change="changeDhcpEnabledState" |
| > |
| <span v-if="dhcpEnabledState"> |
| {{ $t('global.status.enabled') }} |
| </span> |
| <span v-else>{{ $t('global.status.disabled') }}</span> |
| </b-form-checkbox> |
| </dd> |
| </dl> |
| </b-col> |
| </b-row> |
| <b-row> |
| <b-col> |
| <h3 class="h5"> |
| {{ $t('pageNetwork.ipv4Addresses') }} |
| </h3> |
| </b-col> |
| <b-col class="text-right"> |
| <b-button variant="primary" @click="initAddIpv4Address()"> |
| <icon-add /> |
| {{ $t('pageNetwork.table.addIpv4Address') }} |
| </b-button> |
| </b-col> |
| </b-row> |
| <b-table |
| responsive="md" |
| hover |
| :fields="ipv4TableFields" |
| :items="form.ipv4TableItems" |
| :empty-text="$t('global.table.emptyMessage')" |
| class="mb-0" |
| show-empty |
| > |
| <template #cell(actions)="{ item, index }"> |
| <table-row-action |
| v-for="(action, actionIndex) in filteredActions(item)" |
| :key="actionIndex" |
| :value="action.value" |
| :title="action.title" |
| :enabled="action.enabled" |
| @click-table-action="onIpv4TableAction(action, $event, index)" |
| > |
| <template #icon> |
| <icon-edit v-if="action.value === 'edit'" /> |
| <icon-trashcan v-if="action.value === 'delete'" /> |
| </template> |
| </table-row-action> |
| </template> |
| </b-table> |
| </page-section> |
| </template> |
| |
| <script> |
| import BVToastMixin from '@/components/Mixins/BVToastMixin'; |
| import IconAdd from '@carbon/icons-vue/es/add--alt/20'; |
| import IconEdit from '@carbon/icons-vue/es/edit/20'; |
| import IconTrashcan from '@carbon/icons-vue/es/trash-can/20'; |
| import LoadingBarMixin from '@/components/Mixins/LoadingBarMixin'; |
| import PageSection from '@/components/Global/PageSection'; |
| import TableRowAction from '@/components/Global/TableRowAction'; |
| import { mapState } from 'vuex'; |
| |
| export default { |
| name: 'Ipv4Table', |
| components: { |
| IconAdd, |
| IconEdit, |
| IconTrashcan, |
| PageSection, |
| TableRowAction, |
| }, |
| mixins: [BVToastMixin, LoadingBarMixin], |
| props: { |
| tabIndex: { |
| type: Number, |
| default: 0, |
| }, |
| }, |
| data() { |
| return { |
| form: { |
| ipv4TableItems: [], |
| }, |
| actions: [ |
| { |
| value: 'edit', |
| title: this.$t('global.action.edit'), |
| }, |
| { |
| value: 'delete', |
| title: this.$t('global.action.delete'), |
| }, |
| ], |
| ipv4TableFields: [ |
| { |
| key: 'Address', |
| label: this.$t('pageNetwork.table.ipAddress'), |
| }, |
| { |
| key: 'Gateway', |
| label: this.$t('pageNetwork.table.gateway'), |
| }, |
| { |
| key: 'SubnetMask', |
| label: this.$t('pageNetwork.table.subnet'), |
| }, |
| { |
| key: 'AddressOrigin', |
| label: this.$t('pageNetwork.table.addressOrigin'), |
| }, |
| { key: 'actions', label: '', tdClass: 'text-right' }, |
| ], |
| }; |
| }, |
| computed: { |
| ...mapState('network', ['ethernetData']), |
| selectedInterface() { |
| return this.$store.getters['network/selectedInterfaceIndex']; |
| }, |
| dhcpEnabledState: { |
| get() { |
| return this.$store.getters['network/globalNetworkSettings'][ |
| this.selectedInterface |
| ].dhcpEnabled; |
| }, |
| set(newValue) { |
| return newValue; |
| }, |
| }, |
| filteredActions() { |
| return (item) => { |
| if (item.AddressOrigin === 'DHCP') { |
| return item.actions.filter((action) => action.value !== 'delete'); |
| } else { |
| return item.actions; |
| } |
| }; |
| }, |
| }, |
| watch: { |
| // Watch for change in tab index |
| tabIndex() { |
| this.getIpv4TableItems(); |
| }, |
| ethernetData() { |
| this.getIpv4TableItems(); |
| }, |
| }, |
| created() { |
| this.getIpv4TableItems(); |
| this.$store.dispatch('network/getEthernetData').finally(() => { |
| // Emit initial data fetch complete to parent component |
| this.$root.$emit('network-table-ipv4-complete'); |
| }); |
| }, |
| methods: { |
| getIpv4TableItems() { |
| const index = this.tabIndex; |
| const addresses = this.ethernetData[index].IPv4Addresses || []; |
| this.form.ipv4TableItems = addresses.map((ipv4) => { |
| return { |
| Address: ipv4.Address, |
| SubnetMask: ipv4.SubnetMask, |
| Gateway: ipv4.Gateway, |
| AddressOrigin: ipv4.AddressOrigin, |
| actions: [ |
| { |
| value: 'delete', |
| title: this.$t('pageNetwork.table.deleteIpv4'), |
| }, |
| ], |
| }; |
| }); |
| }, |
| onIpv4TableAction(action, $event, index) { |
| if ($event === 'delete') { |
| this.deleteIpv4TableRow(index); |
| } |
| }, |
| deleteIpv4TableRow(index) { |
| this.form.ipv4TableItems.splice(index, 1); |
| const newIpv4Array = this.form.ipv4TableItems.map((ipv4) => { |
| const { Address, SubnetMask, Gateway } = ipv4; |
| return { |
| Address, |
| SubnetMask, |
| Gateway, |
| }; |
| }); |
| this.$store |
| .dispatch('network/editIpv4Address', newIpv4Array) |
| .then((message) => this.successToast(message)) |
| .catch(({ message }) => this.errorToast(message)); |
| }, |
| initAddIpv4Address() { |
| this.$bvModal.show('modal-add-ipv4'); |
| }, |
| changeDhcpEnabledState(state) { |
| this.$bvModal |
| .msgBoxConfirm( |
| state |
| ? this.$t('pageNetwork.modal.confirmEnableDhcp') |
| : this.$t('pageNetwork.modal.confirmDisableDhcp'), |
| { |
| title: this.$t('pageNetwork.modal.dhcpConfirmTitle', { |
| dhcpState: state |
| ? this.$t('global.action.enable') |
| : this.$t('global.action.disable'), |
| }), |
| okTitle: state |
| ? this.$t('global.action.enable') |
| : this.$t('global.action.disable'), |
| okVariant: 'danger', |
| cancelTitle: this.$t('global.action.cancel'), |
| autoFocusButton: 'cancel', |
| }, |
| ) |
| .then((dhcpEnableConfirmed) => { |
| if (dhcpEnableConfirmed) { |
| this.$store |
| .dispatch('network/saveDhcpEnabledState', state) |
| .then((message) => this.successToast(message)) |
| .catch(({ message }) => this.errorToast(message)); |
| } else { |
| let onDhcpCancel = document.getElementById('dhcpSwitch'); |
| onDhcpCancel.checked = !state; |
| } |
| }); |
| }, |
| }, |
| }; |
| </script> |