diff options
-rw-r--r-- | src/locales/en-US.json | 9 | ||||
-rw-r--r-- | src/store/modules/Health/EventLogStore.js | 11 | ||||
-rw-r--r-- | src/views/Health/EventLogs/EventLogs.vue | 59 |
3 files changed, 67 insertions, 12 deletions
diff --git a/src/locales/en-US.json b/src/locales/en-US.json index e73adbc0..eccd302a 100644 --- a/src/locales/en-US.json +++ b/src/locales/en-US.json @@ -7,11 +7,13 @@ "confirm": "Confirm", "copy": "Copy", "delete": "Delete", + "deleteAll": "Delete all", "disable": "Disable", "download": "Download", "edit": "Edit", "enable": "Enable", "export": "Export", + "exportAll": "Export all", "filter": "Filter", "refresh": "Refresh", "replace": "Replace", @@ -246,12 +248,13 @@ }, "pageEventLogs": { "additionalDataUri": "Download additional data", - "exportFilePrefix": "event_logs_", "resolve": "Resolve", "resolved": "Resolved", "unresolve": "Unresolve", "unresolved": "Unresolved", "modal": { + "deleteAllTitle": "Delete all logs", + "deleteAllMessage": "Are you sure you want to delete all logs? This action cannot be undone.", "deleteTitle": "Delete log | Delete logs", "deleteMessage": "Are you sure you want to delete %{count} log? This action cannot be undone. | Are you sure you want to delete %{count} logs? This action cannot be undone." }, @@ -268,13 +271,11 @@ }, "toast": { "errorDelete": "Error deleting %{count} log. | Error deleting %{count} logs.", - "successDelete": "Successfully deleted %{count} log. | Successfully deleted %{count} logs.", "errorLogStatusUpdate": "Error updating log status.", "errorResolveLogs": "Error resolving %{count} log. | Error resolving %{count} logs.", "errorUnresolveLogs": "Error unresolving %{count} log. | Error unresolving %{count} logs.", - "successResolveLog": "Successfully resolved log.", + "successDelete": "Successfully deleted %{count} log. | Successfully deleted %{count} logs.", "successResolveLogs": "Successfully resolved %{count} log. | Successfully resolved %{count} logs.", - "successUnresolveLog": "Successfully unresolved log.", "successUnresolveLogs": "Successfully unresolved %{count} log. | Successfully unresolved %{count} logs." } }, diff --git a/src/store/modules/Health/EventLogStore.js b/src/store/modules/Health/EventLogStore.js index 5664e99f..c9bd82fd 100644 --- a/src/store/modules/Health/EventLogStore.js +++ b/src/store/modules/Health/EventLogStore.js @@ -80,10 +80,12 @@ const EventLogStore = { '/redfish/v1/Systems/system/LogServices/EventLog/Actions/LogService.ClearLog' ) .then(() => dispatch('getEventLogData')) - .then(() => i18n.tc('pageEventLogs.toast.successDelete', data)) + .then(() => i18n.tc('pageEventLogs.toast.successDelete', data.length)) .catch((error) => { console.log(error); - throw new Error(i18n.tc('pageEventLogs.toast.errorDelete', data)); + throw new Error( + i18n.tc('pageEventLogs.toast.errorDelete', data.length) + ); }); }, async deleteEventLogs({ dispatch }, uris = []) { @@ -194,6 +196,7 @@ const EventLogStore = { }) ); }, + // Single log entry async updateEventLogStatus({ dispatch }, log) { const updatedEventLogStatus = log.status; return await api @@ -203,9 +206,9 @@ const EventLogStore = { }) .then(() => { if (log.status) { - return i18n.t('pageEventLogs.toast.successResolveLog'); + return i18n.tc('pageEventLogs.toast.successResolveLogs', 1); } else { - return i18n.t('pageEventLogs.toast.successUnresolveLog'); + return i18n.tc('pageEventLogs.toast.successUnresolveLogs', 1); } }) .catch((error) => { diff --git a/src/views/Health/EventLogs/EventLogs.vue b/src/views/Health/EventLogs/EventLogs.vue index 9bc88c1a..fa3f43cb 100644 --- a/src/views/Health/EventLogs/EventLogs.vue +++ b/src/views/Health/EventLogs/EventLogs.vue @@ -2,7 +2,7 @@ <b-container fluid="xl"> <page-title /> <b-row class="align-items-start"> - <b-col sm="8" xl="6" class="d-sm-flex align-items-end"> + <b-col sm="8" xl="6" class="d-sm-flex align-items-end mb-4"> <search :placeholder="$t('pageEventLogs.table.searchLogs')" data-test-id="eventLogs-input-searchLogs" @@ -23,6 +23,21 @@ <b-row> <b-col class="text-right"> <table-filter :filters="tableFilters" @filter-change="onFilterChange" /> + <b-button + variant="link" + :disabled="allLogs.length === 0" + @click="deleteAllLogs" + > + <icon-delete /> {{ $t('global.action.deleteAll') }} + </b-button> + <b-button + variant="primary" + :class="{ disabled: allLogs.length === 0 }" + :download="exportFileNameByDate()" + :href="href" + > + <icon-export /> {{ $t('global.action.exportAll') }} + </b-button> </b-col> </b-row> <b-row> @@ -180,7 +195,7 @@ :value="action.value" :title="action.title" :row-data="row.item" - :export-name="exportFileNameByDate()" + :export-name="exportFileNameByDate('export')" :data-test-id="`eventLogs-button-deleteRow-${row.index}`" @click-table-action="onTableRowAction($event, row.item)" > @@ -224,6 +239,7 @@ </template> <script> +import IconDelete from '@carbon/icons-vue/es/trash-can/20'; import IconTrashcan from '@carbon/icons-vue/es/trash-can/20'; import IconExport from '@carbon/icons-vue/es/document--export/20'; import IconChevron from '@carbon/icons-vue/es/chevron--down/20'; @@ -264,6 +280,7 @@ import SearchFilterMixin, { export default { components: { + IconDelete, IconExport, IconTrashcan, IconChevron, @@ -373,6 +390,9 @@ export default { }; }, computed: { + href() { + return `data:text/json;charset=utf-8,${this.exportAllLogs()}`; + }, filteredRows() { return this.searchFilter ? this.searchTotalFilteredRows @@ -430,6 +450,23 @@ export default { }) .catch(({ message }) => this.errorToast(message)); }, + deleteAllLogs() { + this.$bvModal + .msgBoxConfirm(this.$t('pageEventLogs.modal.deleteAllMessage'), { + title: this.$t('pageEventLogs.modal.deleteAllTitle'), + okTitle: this.$t('global.action.delete'), + okVariant: 'danger', + cancelTitle: this.$t('global.action.cancel'), + }) + .then((deleteConfirmed) => { + if (deleteConfirmed) { + this.$store + .dispatch('eventLog/deleteAllEventLogs', this.allLogs) + .then((message) => this.successToast(message)) + .catch(({ message }) => this.errorToast(message)); + } + }); + }, deleteLogs(uris) { this.$store .dispatch('eventLog/deleteEventLogs', uris) @@ -443,6 +480,14 @@ export default { }); }); }, + exportAllLogs() { + { + return this.$store.getters['eventLog/allEvents'].map((eventLogs) => { + const allEventLogsString = JSON.stringify(eventLogs); + return allEventLogsString; + }); + } + }, onFilterChange({ activeFilters }) { this.activeFilters = activeFilters; }, @@ -507,13 +552,19 @@ export default { this.searchTotalFilteredRows = filteredItems.length; }, // Create export file name based on date - exportFileNameByDate() { + exportFileNameByDate(value) { let date = new Date(); date = date.toISOString().slice(0, 10) + '_' + date.toString().split(':').join('-').split(' ')[4]; - return this.$t('pageEventLogs.exportFilePrefix') + date; + let fileName; + if (value === 'export') { + fileName = 'event_log_'; + } else { + fileName = 'all_event_logs_'; + } + return fileName + date; }, resolveLogs() { this.$store |