iceshrimp-legacy/src/client/app/admin/views/dashboard.vue

290 lines
5.6 KiB
Vue
Raw Normal View History

2018-11-02 15:05:53 +01:00
<template>
<div class="obdskegsannmntldydackcpzezagxqfy">
2018-11-02 19:30:28 +01:00
<header v-if="meta">
<p><b>Misskey</b><span>{{ meta.version }}</span></p>
<p><b>Machine</b><span>{{ meta.machine }}</span></p>
<p><b>OS</b><span>{{ meta.os }}</span></p>
<p><b>Node</b><span>{{ meta.node }}</span></p>
<p>{{ $t('@.ai-chan-kawaii') }}</p>
2018-11-02 19:30:28 +01:00
</header>
2018-11-03 03:38:00 +01:00
2018-11-15 21:07:59 +01:00
<marquee-text v-if="instances.length > 0" class="instances" :repeat="10" :duration="60">
<span v-for="instance in instances" class="instance">
<b :style="{ background: instance.bg }">{{ instance.host }}</b>{{ instance.notesCount | number }} / {{ instance.usersCount | number }}
</span>
</marquee-text>
2018-11-02 15:05:53 +01:00
<div v-if="stats" class="stats">
<div>
<div>
<div><fa icon="user"/></div>
2018-11-02 18:06:34 +01:00
<div>
<span>{{ $t('accounts') }}</span>
2018-11-15 21:21:52 +01:00
<b>{{ stats.originalUsersCount | number }}</b>
2018-11-02 18:06:34 +01:00
</div>
</div>
<div>
<span><fa icon="home"/> {{ $t('this-instance') }}</span>
<span @click="setChartSrc('users')"><fa :icon="['far', 'chart-bar']"/></span>
2018-11-02 15:05:53 +01:00
</div>
</div>
<div>
<div>
<div><fa icon="pencil-alt"/></div>
2018-11-02 18:06:34 +01:00
<div>
<span>{{ $t('notes') }}</span>
2018-11-15 21:21:52 +01:00
<b>{{ stats.originalNotesCount | number }}</b>
2018-11-02 18:06:34 +01:00
</div>
</div>
<div>
<span><fa icon="home"/> {{ $t('this-instance') }}</span>
<span @click="setChartSrc('notes')"><fa :icon="['far', 'chart-bar']"/></span>
2018-11-02 15:05:53 +01:00
</div>
</div>
<div>
<div>
2018-11-14 06:57:59 +01:00
<div><fa :icon="faDatabase"/></div>
2018-11-02 18:06:34 +01:00
<div>
<span>{{ $t('drive') }}</span>
2018-11-03 03:38:00 +01:00
<b>{{ stats.driveUsageLocal | bytes }}</b>
2018-11-02 18:06:34 +01:00
</div>
</div>
<div>
<span><fa icon="home"/> {{ $t('this-instance') }}</span>
<span @click="setChartSrc('drive')"><fa :icon="['far', 'chart-bar']"/></span>
2018-11-02 15:05:53 +01:00
</div>
</div>
<div>
<div>
<div><fa :icon="['far', 'hdd']"/></div>
2018-11-02 18:06:34 +01:00
<div>
<span>{{ $t('instances') }}</span>
2018-11-03 03:38:00 +01:00
<b>{{ stats.instances | number }}</b>
2018-11-02 18:06:34 +01:00
</div>
</div>
<div>
<span><fa icon="globe"/> {{ $t('federated') }}</span>
<span @click="setChartSrc('federation-instances-total')"><fa :icon="['far', 'chart-bar']"/></span>
2018-11-02 15:05:53 +01:00
</div>
</div>
</div>
2018-11-02 19:00:23 +01:00
<div class="charts">
2018-11-03 14:21:20 +01:00
<x-charts ref="charts"/>
2018-11-02 19:00:23 +01:00
</div>
2019-03-12 16:13:56 +01:00
<div class="queue">
<x-queue/>
</div>
2018-11-02 15:05:53 +01:00
<div class="cpu-memory">
<x-cpu-memory :connection="connection"/>
</div>
2018-11-03 03:38:00 +01:00
<div class="ap">
<x-ap-log/>
</div>
2018-11-02 15:05:53 +01:00
</div>
</template>
<script lang="ts">
import Vue from 'vue';
import i18n from '../../i18n';
2019-03-12 16:14:44 +01:00
import XCpuMemory from "./dashboard.cpu-memory.vue";
2019-03-12 16:13:56 +01:00
import XQueue from "./dashboard.queue-charts.vue";
2019-03-13 15:04:17 +01:00
import XCharts from "./dashboard.charts.vue";
import XApLog from "./dashboard.ap-log.vue";
2018-11-14 06:57:59 +01:00
import { faDatabase } from '@fortawesome/free-solid-svg-icons';
2018-11-15 21:07:59 +01:00
import MarqueeText from 'vue-marquee-text-component';
import randomColor from 'randomcolor';
2018-11-02 15:05:53 +01:00
export default Vue.extend({
i18n: i18n('admin/views/dashboard.vue'),
2018-11-14 06:57:59 +01:00
2018-11-02 15:05:53 +01:00
components: {
2018-11-02 19:00:23 +01:00
XCpuMemory,
2019-03-12 16:13:56 +01:00
XQueue,
2018-11-03 03:38:00 +01:00
XCharts,
2018-11-15 21:07:59 +01:00
XApLog,
MarqueeText
2018-11-02 15:05:53 +01:00
},
2018-11-03 14:21:20 +01:00
2018-11-02 15:05:53 +01:00
data() {
return {
stats: null,
2018-11-02 19:30:28 +01:00
connection: null,
2018-11-14 06:57:59 +01:00
meta: null,
2018-11-15 21:07:59 +01:00
instances: [],
2018-11-15 21:21:52 +01:00
clock: null,
2018-11-14 06:57:59 +01:00
faDatabase
2018-11-02 15:05:53 +01:00
};
},
2018-11-03 14:21:20 +01:00
2018-11-02 15:05:53 +01:00
created() {
2018-11-09 00:13:34 +01:00
this.connection = this.$root.stream.useSharedConnection('serverStats');
2018-11-02 15:05:53 +01:00
2018-11-15 21:21:52 +01:00
this.updateStats();
this.clock = setInterval(this.updateStats, 1000);
2018-11-09 00:13:34 +01:00
this.$root.getMeta().then(meta => {
2018-11-02 19:30:28 +01:00
this.meta = meta;
2018-11-02 15:05:53 +01:00
});
this.$root.api('federation/instances', {
2018-11-15 21:07:59 +01:00
sort: '+notes'
}).then(instances => {
for (const i of instances) {
2018-11-15 21:07:59 +01:00
i.bg = randomColor({
seed: i.host,
luminosity: 'dark'
});
}
2018-11-15 21:07:59 +01:00
this.instances = instances;
});
2018-11-02 15:05:53 +01:00
},
2018-11-03 14:21:20 +01:00
2018-11-02 15:05:53 +01:00
beforeDestroy() {
this.connection.dispose();
2018-11-15 21:21:52 +01:00
clearInterval(this.clock);
2018-11-03 14:21:20 +01:00
},
methods: {
setChartSrc(src) {
this.$refs.charts.setSrc(src);
2018-11-15 21:21:52 +01:00
},
updateStats() {
this.$root.api('stats', {}, true).then(stats => {
2018-11-15 21:21:52 +01:00
this.stats = stats;
});
2018-11-03 14:21:20 +01:00
}
2018-11-02 15:05:53 +01:00
}
});
</script>
<style lang="stylus" scoped>
.obdskegsannmntldydackcpzezagxqfy
padding 16px
@media (min-width 500px)
2019-01-19 15:00:15 +01:00
padding 16px
2018-11-02 19:30:28 +01:00
> header
display flex
padding-bottom 16px
2018-11-04 03:08:03 +01:00
border-bottom solid 1px var(--adminDashboardHeaderBorder)
color var(--adminDashboardHeaderFg)
2018-11-02 19:30:28 +01:00
font-size 14px
2018-11-04 10:31:27 +01:00
white-space nowrap
2018-11-02 19:30:28 +01:00
@media (max-width 1000px)
display none
2018-11-02 19:30:28 +01:00
> p
2018-11-04 10:31:27 +01:00
display block
2018-11-02 19:30:28 +01:00
margin 0 32px 0 0
2018-11-04 10:31:27 +01:00
overflow hidden
text-overflow ellipsis
2018-11-02 19:30:28 +01:00
> b
&:after
content ':'
margin-right 8px
&:last-child
margin-left auto
margin-right 0
2018-11-15 21:07:59 +01:00
> .instances
padding 16px
color var(--adminDashboardHeaderFg)
font-size 13px
>>> .instance
margin 0 10px
> b
padding 2px 6px
margin-right 4px
border-radius 4px
color #fff
2018-11-02 15:05:53 +01:00
> .stats
display flex
justify-content space-between
margin-bottom 16px
> div
flex 1
margin-right 16px
2018-11-04 03:08:03 +01:00
color var(--adminDashboardCardFg)
2018-11-02 15:05:53 +01:00
box-shadow 0 2px 4px rgba(0, 0, 0, 0.1)
2018-11-04 03:08:03 +01:00
background var(--adminDashboardCardBg)
2018-11-02 15:05:53 +01:00
border-radius 8px
&:last-child
2018-11-02 18:06:34 +01:00
margin-right 0
2018-11-02 15:05:53 +01:00
> div:first-child
2018-11-02 18:06:34 +01:00
display flex
align-items center
text-align center
&:last-child
margin-right 0
> div:first-child
padding 16px 24px
font-size 28px
> div:last-child
flex 1
padding 16px 32px 16px 0
text-align right
> span
font-size 70%
opacity 0.7
> b
display block
2018-11-02 15:05:53 +01:00
> div:last-child
2018-11-03 14:21:20 +01:00
display flex
2018-11-02 18:06:34 +01:00
padding 6px 16px
2018-11-04 03:08:03 +01:00
border-top solid 1px var(--adminDashboardCardDivider)
2018-11-02 15:05:53 +01:00
> span
2018-11-02 18:06:34 +01:00
font-size 70%
2018-11-02 15:05:53 +01:00
opacity 0.7
2018-11-03 14:21:20 +01:00
&:last-child
margin-left auto
cursor pointer
@media (max-width 900px)
display grid
grid-template-columns 1fr 1fr
grid-template-rows 1fr 1fr
gap 16px
> div
margin-right 0
@media (max-width 500px)
display block
> div:not(:last-child)
margin-bottom 16px
2018-11-02 19:00:23 +01:00
> .charts
margin-bottom 16px
2019-03-12 16:13:56 +01:00
> .queue
margin-bottom 16px
2018-11-02 15:05:53 +01:00
> .cpu-memory
margin-bottom 16px
</style>