diff options
Diffstat (limited to 'src/views')
| -rw-r--r-- | src/views/Overview/ModalAssetTag.vue | 126 | ||||
| -rw-r--r-- | src/views/Overview/OverviewServer.vue | 40 |
2 files changed, 165 insertions, 1 deletions
diff --git a/src/views/Overview/ModalAssetTag.vue b/src/views/Overview/ModalAssetTag.vue new file mode 100644 index 000000000..c73b5ba5e --- /dev/null +++ b/src/views/Overview/ModalAssetTag.vue @@ -0,0 +1,126 @@ +<template> + <b-modal + id="modal-asset-tag" + ref="modal" + :title="$t('pageOverview.modal.editAssetTag')" + @hidden="resetForm" + > + <b-form id="asset-settings" @submit.prevent="handleSubmit"> + <b-row> + <b-col sm="8"> + <b-form-group + :label="$t('pageOverview.assetTag')" + label-for="asset-tag" + > + <b-form-input + id="asset-tag" + v-model="form.assetTag" + type="text" + :state="getValidationState(v$.form.assetTag)" + @input="v$.form.assetTag.$touch()" + /> + <b-form-invalid-feedback role="alert"> + <template v-if="v$.form.assetTag.required.$invalid"> + {{ $t('global.form.fieldRequired') }} + </template> + </b-form-invalid-feedback> + </b-form-group> + </b-col> + </b-row> + </b-form> + <template #footer="{ cancel }"> + <b-button variant="secondary" @click="cancel()"> + {{ $t('global.action.cancel') }} + </b-button> + <b-button + form="asset-settings" + type="submit" + variant="primary" + @click="onOk" + > + {{ $t('global.action.save') }} + </b-button> + </template> + </b-modal> +</template> + +<script> +import VuelidateMixin from '@/components/Mixins/VuelidateMixin.js'; +import { useVuelidate } from '@vuelidate/core'; +import { required } from '@vuelidate/validators'; + +export default { + mixins: [VuelidateMixin], + props: { + modelValue: { + type: Boolean, + default: false, + }, + tag: { + type: String, + default: '', + }, + }, + emits: ['ok', 'hidden', 'update:modelValue'], + setup() { + return { + v$: useVuelidate(), + }; + }, + data() { + return { + form: { + assetTag: this.tag ? this.tag : '', + }, + }; + }, + watch: { + tag() { + this.form.assetTag = this.tag; + }, + modelValue: { + handler(newValue) { + if (newValue) { + this.$nextTick(() => { + this.$refs.modal?.show(); + }); + } + }, + immediate: true, + }, + }, + validations() { + return { + form: { + assetTag: { + required, + }, + }, + }; + }, + methods: { + handleSubmit() { + this.v$.$touch(); + if (this.v$.$invalid) return; + this.$emit('ok', { AssetTag: this.form.assetTag }); + this.closeModal(); + }, + closeModal() { + this.$nextTick(() => { + this.$refs.modal.hide(); + }); + }, + resetForm() { + this.form.assetTag = this.tag; + this.v$.$reset(); + this.$emit('update:modelValue', false); + this.$emit('hidden'); + }, + onOk(bvModalEvt) { + // prevent modal close + bvModalEvt.preventDefault(); + this.handleSubmit(); + }, + }, +}; +</script> diff --git a/src/views/Overview/OverviewServer.vue b/src/views/Overview/OverviewServer.vue index 044440a04..8d66da689 100644 --- a/src/views/Overview/OverviewServer.vue +++ b/src/views/Overview/OverviewServer.vue @@ -10,6 +10,13 @@ <dd>{{ dataFormatter(serverModel) }}</dd> <dt>{{ $t('pageOverview.serialNumber') }}</dt> <dd>{{ dataFormatter(serverSerialNumber) }}</dd> + <dt> + {{ $t('pageOverview.assetTag') }} + <b-button variant="link" class="p-1" @click="initAssetTagModal()"> + <icon-edit :title="$t('pageOverview.modal.editAssetTag')" /> + </b-button> + </dt> + <dd :title="assetTag">{{ dataFormatter(assetTag) }}</dd> </dl> </b-col> <b-col sm="6"> @@ -19,26 +26,41 @@ </dl> </b-col> </b-row> + <modal-asset-tag v-model="showAssetTagModal" :tag="assetTag" @ok="saveAssetTag" /> </overview-card> </template> <script> import OverviewCard from './OverviewCard'; import DataFormatterMixin from '@/components/Mixins/DataFormatterMixin'; +import BVToastMixin from '@/components/Mixins/BVToastMixin'; +import LoadingBarMixin from '@/components/Mixins/LoadingBarMixin'; import { mapState } from 'vuex'; +import ModalAssetTag from './ModalAssetTag.vue'; +import IconEdit from '@carbon/icons-vue/es/edit/16'; export default { name: 'Server', components: { OverviewCard, + IconEdit, + ModalAssetTag, + }, + mixins: [DataFormatterMixin, BVToastMixin, LoadingBarMixin], + data() { + return { + showAssetTagModal: false, + }; }, - mixins: [DataFormatterMixin], computed: { ...mapState({ server: (state) => state.system.systems[0], serverModel() { return this.server?.model; }, + assetTag() { + return this.$store.getters['global/assetTag']; + }, serverSerialNumber() { return this.server?.serialNumber; }, @@ -52,5 +74,21 @@ export default { this.$eventBus.$emit('overview-server-complete'); }); }, + methods: { + initAssetTagModal() { + this.showAssetTagModal = true; + }, + saveAssetTag(modalFormData) { + this.startLoader(); + this.$store + .dispatch('system/saveAssetTag', modalFormData) + .then((message) => { + this.$store.dispatch('global/getSystemInfo'); + this.successToast(message); + }) + .catch(({ message }) => this.errorToast(message)) + .finally(() => this.endLoader()); + }, + } }; </script> |
