* chore(eslint): init & config eslint Signed-off-by: Stefan Dej <meteyou@gmail.com> * chore(eslint): fix eslint rules Signed-off-by: Stefan Dej <meteyou@gmail.com>
172 lines
6.5 KiB
Vue
172 lines
6.5 KiB
Vue
<style scoped>
|
|
.updaterLogScroll {
|
|
height: 350px;
|
|
max-height: 350px;
|
|
overflow-x: hidden;
|
|
}
|
|
|
|
.updaterLog .title-cell {
|
|
white-space: nowrap;
|
|
vertical-align: top;
|
|
}
|
|
|
|
.updaterLog.v-data-table > .v-data-table__wrapper > table > tbody > tr > td {
|
|
height: auto;
|
|
}
|
|
</style>
|
|
|
|
<template>
|
|
<v-dialog :value="application !== ''" persistent max-width="800" class="mx-0">
|
|
<v-card
|
|
dark
|
|
:loading="!complete"
|
|
>
|
|
<template slot="progress">
|
|
<v-progress-linear color="primary" indeterminate></v-progress-linear>
|
|
</template>
|
|
<v-toolbar flat dense >
|
|
<v-toolbar-title>
|
|
<span class="subheading">
|
|
<v-icon left>mdi-update</v-icon>
|
|
<template v-if="application.substr(0, 8) === 'recover_' && !complete">
|
|
{{ $t("App.UpdateDialog.Recovering", { software: application.substr(8) }) }}
|
|
</template>
|
|
<template v-else-if="application.substr(0, 8) === 'recover_'">
|
|
{{ $t("App.UpdateDialog.RecoveringDone", { software: application.substr(8) }) }}
|
|
</template>
|
|
<template v-else-if="!complete">
|
|
{{ $t("App.UpdateDialog.Updating", { software: application }) }}
|
|
</template>
|
|
<template v-else>
|
|
{{ $t("App.UpdateDialog.UpdatingDone", { software: application }) }}
|
|
</template>
|
|
</span>
|
|
</v-toolbar-title>
|
|
</v-toolbar>
|
|
<v-card-text class="px-3">
|
|
<v-row>
|
|
<v-col class="py-6 px-0">
|
|
<perfect-scrollbar class="updaterLogScroll" :options="{ suppressScrollX: true }" ref="updaterLogScroll">
|
|
<v-data-table
|
|
:headers="headers"
|
|
:items="messages"
|
|
item-key="date"
|
|
hide-default-footer
|
|
hide-default-header
|
|
disable-pagination
|
|
class="updaterLog"
|
|
ref="updaterLog"
|
|
:custom-sort="customSort"
|
|
sort-by="date"
|
|
:sort-desc="true"
|
|
color="primary"
|
|
>
|
|
<template #no-data>
|
|
<div class="py-2">{{ $t("App.UpdateDialog.Empty")}}</div>
|
|
</template>
|
|
|
|
<template #item="{ item }">
|
|
<tr>
|
|
<td class="log-cell title-cell py-2">
|
|
{{ formatTime(item.date)}}
|
|
</td>
|
|
<td class="log-cell content-cell pl-0 py-2" colspan="2" style="width:100%;">
|
|
<span v-if="item.message" class="message" v-html="item.message"></span>
|
|
</td>
|
|
</tr>
|
|
</template>
|
|
</v-data-table>
|
|
</perfect-scrollbar>
|
|
</v-col>
|
|
</v-row>
|
|
<v-row>
|
|
<v-col class="text-center pt-5">
|
|
<v-btn @click="close" :disabled="!complete" color="primary">{{ $t("App.UpdateDialog.Close")}}</v-btn>
|
|
</v-col>
|
|
</v-row>
|
|
</v-card-text>
|
|
</v-card>
|
|
</v-dialog>
|
|
</template>
|
|
|
|
<script lang="ts">
|
|
import Component from 'vue-class-component'
|
|
import {Mixins, Watch} from 'vue-property-decorator'
|
|
import BaseMixin from '@/components/mixins/base'
|
|
|
|
@Component({
|
|
components: {
|
|
}
|
|
})
|
|
export default class TheUpdateDialog extends Mixins(BaseMixin) {
|
|
$refs!: {
|
|
updaterLogScroll: any
|
|
updaterLog: HTMLDivElement
|
|
}
|
|
|
|
headers = [
|
|
{
|
|
text: 'Date',
|
|
value: 'date',
|
|
width: '1%',
|
|
dateType: 'Date',
|
|
}, {
|
|
text: 'Message',
|
|
sortable: false,
|
|
value: 'message',
|
|
width: '99%'
|
|
},
|
|
]
|
|
|
|
get application() {
|
|
return this.$store.state.server.updateManager.updateResponse.application ?? ''
|
|
}
|
|
|
|
get messages() {
|
|
return this.$store.state.server.updateManager.updateResponse.messages ?? []
|
|
}
|
|
|
|
get complete() {
|
|
return this.$store.state.server.updateManager.updateResponse.complete ?? true
|
|
}
|
|
|
|
customSort(items: any[], index: string, isDesc: boolean[]) {
|
|
items.sort((a, b) => {
|
|
if (index[0] === 'date') {
|
|
if (!isDesc[0]) return new Date(b[index]).getTime() - new Date(a[index]).getTime()
|
|
else return new Date(a[index]).getTime() - new Date(b[index]).getTime()
|
|
} else {
|
|
if(typeof a[index] !== 'undefined'){
|
|
if (!isDesc[0]) return a[index].toLowerCase().localeCompare(b[index].toLowerCase())
|
|
else return b[index].toLowerCase().localeCompare(a[index].toLowerCase())
|
|
}
|
|
}
|
|
})
|
|
|
|
return items
|
|
}
|
|
|
|
formatTime(date: Date) {
|
|
const hours = (date.getHours() < 10) ? '0'+date.getHours().toString() : date.getHours()
|
|
const minutes = (date.getMinutes() < 10) ? '0'+date.getMinutes().toString() : date.getMinutes()
|
|
const seconds = (date.getSeconds() < 10) ? '0'+date.getSeconds().toString() : date.getSeconds()
|
|
|
|
return hours+':'+minutes+':'+seconds
|
|
}
|
|
|
|
close() {
|
|
if (this.application !== null && this.complete && ['client', 'mainsail'].includes(this.application.toLowerCase())) window.location.reload(true)
|
|
else {
|
|
this.$store.commit('server/updateManager/resetUpdateResponse')
|
|
this.$socket.emit('machine.update.status', { refresh: false }, { action: 'server/updateManager/getStatus' })
|
|
}
|
|
}
|
|
|
|
@Watch('messages')
|
|
messagesChanged() {
|
|
this.$nextTick(() => {
|
|
if (this.$refs.updaterLogScroll) this.$refs.updaterLogScroll.$el.scrollTop = this.$refs.updaterLogScroll.$el.scrollHeight
|
|
})
|
|
}
|
|
}
|
|
</script> |