From 4e4c559db6964cbf17fcadf38d55fc79c995ca42 Mon Sep 17 00:00:00 2001
From: syuilo <Syuilotan@yahoo.co.jp>
Date: Fri, 22 Oct 2021 05:36:48 +0900
Subject: Migrate to Chart.js v3 (#7896)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

* wip

* wip

* wip

* wip

* wip

* wip

* wip

* 定期的にresync

* Update overview.vue

* wip

* wip
---
 src/client/pages/instance/instance.vue | 266 ++-------------------------------
 1 file changed, 14 insertions(+), 252 deletions(-)

(limited to 'src/client/pages/instance/instance.vue')

diff --git a/src/client/pages/instance/instance.vue b/src/client/pages/instance/instance.vue
index 6117f090de..5572fbbf75 100644
--- a/src/client/pages/instance/instance.vue
+++ b/src/client/pages/instance/instance.vue
@@ -78,17 +78,17 @@
 				<span class="label">{{ $ts.charts }}</span>
 				<div class="selects">
 					<MkSelect v-model="chartSrc" style="margin: 0; flex: 1;">
-						<option value="requests">{{ $ts._instanceCharts.requests }}</option>
-						<option value="users">{{ $ts._instanceCharts.users }}</option>
-						<option value="users-total">{{ $ts._instanceCharts.usersTotal }}</option>
-						<option value="notes">{{ $ts._instanceCharts.notes }}</option>
-						<option value="notes-total">{{ $ts._instanceCharts.notesTotal }}</option>
-						<option value="ff">{{ $ts._instanceCharts.ff }}</option>
-						<option value="ff-total">{{ $ts._instanceCharts.ffTotal }}</option>
-						<option value="drive-usage">{{ $ts._instanceCharts.cacheSize }}</option>
-						<option value="drive-usage-total">{{ $ts._instanceCharts.cacheSizeTotal }}</option>
-						<option value="drive-files">{{ $ts._instanceCharts.files }}</option>
-						<option value="drive-files-total">{{ $ts._instanceCharts.filesTotal }}</option>
+						<option value="instance-requests">{{ $ts._instanceCharts.requests }}</option>
+						<option value="instance-users">{{ $ts._instanceCharts.users }}</option>
+						<option value="instance-users-total">{{ $ts._instanceCharts.usersTotal }}</option>
+						<option value="instance-notes">{{ $ts._instanceCharts.notes }}</option>
+						<option value="instance-notes-total">{{ $ts._instanceCharts.notesTotal }}</option>
+						<option value="instance-ff">{{ $ts._instanceCharts.ff }}</option>
+						<option value="instance-ff-total">{{ $ts._instanceCharts.ffTotal }}</option>
+						<option value="instance-drive-usage">{{ $ts._instanceCharts.cacheSize }}</option>
+						<option value="instance-drive-usage-total">{{ $ts._instanceCharts.cacheSizeTotal }}</option>
+						<option value="instance-drive-files">{{ $ts._instanceCharts.files }}</option>
+						<option value="instance-drive-files-total">{{ $ts._instanceCharts.filesTotal }}</option>
 					</MkSelect>
 					<MkSelect v-model="chartSpan" style="margin: 0;">
 						<option value="hour">{{ $ts.perHour }}</option>
@@ -97,7 +97,7 @@
 				</div>
 			</div>
 			<div class="chart">
-				<canvas :ref="setChart"></canvas>
+				<MkChart :src="chartSrc" :span="chartSpan" :limit="90" :detailed="true"></MkChart>
 			</div>
 		</div>
 		<div class="operations section">
@@ -124,28 +124,17 @@
 
 <script lang="ts">
 import { defineComponent, markRaw } from 'vue';
-import Chart from 'chart.js';
 import XModalWindow from '@client/components/ui/modal-window.vue';
 import MkUsersDialog from '@client/components/users-dialog.vue';
 import MkSelect from '@client/components/form/select.vue';
 import MkButton from '@client/components/ui/button.vue';
 import MkSwitch from '@client/components/form/switch.vue';
 import MkInfo from '@client/components/ui/info.vue';
+import MkChart from '@client/components/chart.vue';
 import bytes from '@client/filters/bytes';
 import number from '@client/filters/number';
 import * as os from '@client/os';
 
-const chartLimit = 90;
-const sum = (...arr) => arr.reduce((r, a) => r.map((b, i) => a[i] + b));
-const negate = arr => arr.map(x => -x);
-const alpha = hex => {
-	const result = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(hex)!;
-	const r = parseInt(result[1], 16);
-	const g = parseInt(result[2], 16);
-	const b = parseInt(result[3], 16);
-	return `rgba(${r}, ${g}, ${b}, 0.1)`;
-};
-
 export default defineComponent({
 	components: {
 		XModalWindow,
@@ -153,6 +142,7 @@ export default defineComponent({
 		MkButton,
 		MkSwitch,
 		MkInfo,
+		MkChart,
 	},
 
 	props: {
@@ -167,42 +157,12 @@ export default defineComponent({
 	data() {
 		return {
 			isSuspended: this.instance.isSuspended,
-			now: null,
-			canvas: null,
-			chart: null,
-			chartInstance: null,
 			chartSrc: 'requests',
 			chartSpan: 'hour',
 		};
 	},
 
 	computed: {
-		data(): any {
-			if (this.chart == null) return null;
-			switch (this.chartSrc) {
-				case 'requests': return this.requestsChart();
-				case 'users': return this.usersChart(false);
-				case 'users-total': return this.usersChart(true);
-				case 'notes': return this.notesChart(false);
-				case 'notes-total': return this.notesChart(true);
-				case 'ff': return this.ffChart(false);
-				case 'ff-total': return this.ffChart(true);
-				case 'drive-usage': return this.driveUsageChart(false);
-				case 'drive-usage-total': return this.driveUsageChart(true);
-				case 'drive-files': return this.driveFilesChart(false);
-				case 'drive-files-total': return this.driveFilesChart(true);
-			}
-		},
-
-		stats(): any[] {
-			const stats =
-				this.chartSpan == 'day' ? this.chart.perDay :
-				this.chartSpan == 'hour' ? this.chart.perHour :
-				null;
-
-			return stats;
-		},
-
 		meta() {
 			return this.$instance;
 		},
@@ -219,49 +179,15 @@ export default defineComponent({
 				isSuspended: this.isSuspended
 			});
 		},
-
-		chartSrc() {
-			this.renderChart();
-		},
-
-		chartSpan() {
-			this.renderChart();
-		}
-	},
-
-	async created() {
-		this.now = new Date();
-
-		const [perHour, perDay] = await Promise.all([
-			os.api('charts/instance', { host: this.instance.host, limit: chartLimit, span: 'hour' }),
-			os.api('charts/instance', { host: this.instance.host, limit: chartLimit, span: 'day' }),
-		]);
-
-		const chart = {
-			perHour: perHour,
-			perDay: perDay
-		};
-
-		this.chart = chart;
-
-		this.renderChart();
 	},
 
 	methods: {
-		setChart(el) {
-			this.canvas = el;
-		},
-
 		changeBlock(e) {
 			os.api('admin/update-meta', {
 				blockedHosts: this.isBlocked ? this.meta.blockedHosts.concat([this.instance.host]) : this.meta.blockedHosts.filter(x => x !== this.instance.host)
 			});
 		},
 
-		setSrc(src) {
-			this.chartSrc = src;
-		},
-
 		removeAllFollowing() {
 			os.apiWithDialog('admin/federation/remove-all-following', {
 				host: this.instance.host
@@ -274,170 +200,6 @@ export default defineComponent({
 			});
 		},
 
-		renderChart() {
-			if (this.chartInstance) {
-				this.chartInstance.destroy();
-			}
-
-			Chart.defaults.global.defaultFontColor = getComputedStyle(document.documentElement).getPropertyValue('--fg');
-			this.chartInstance = markRaw(new Chart(this.canvas, {
-				type: 'line',
-				data: {
-					labels: new Array(chartLimit).fill(0).map((_, i) => this.getDate(i).toLocaleString()).slice().reverse(),
-					datasets: this.data.series.map(x => ({
-						label: x.name,
-						data: x.data.slice().reverse(),
-						pointRadius: 0,
-						lineTension: 0,
-						borderWidth: 2,
-						borderColor: x.color,
-						backgroundColor: alpha(x.color),
-					}))
-				},
-				options: {
-					aspectRatio: 2.5,
-					layout: {
-						padding: {
-							left: 16,
-							right: 16,
-							top: 16,
-							bottom: 0
-						}
-					},
-					legend: {
-						position: 'bottom',
-						labels: {
-							boxWidth: 16,
-						}
-					},
-					scales: {
-						xAxes: [{
-							gridLines: {
-								display: false
-							},
-							ticks: {
-								display: false
-							}
-						}],
-						yAxes: [{
-							position: 'right',
-							ticks: {
-								display: false
-							}
-						}]
-					},
-					tooltips: {
-						intersect: false,
-						mode: 'index',
-					}
-				}
-			}));
-		},
-
-		getDate(ago: number) {
-			const y = this.now.getFullYear();
-			const m = this.now.getMonth();
-			const d = this.now.getDate();
-			const h = this.now.getHours();
-
-			return this.chartSpan == 'day' ? new Date(y, m, d - ago) : new Date(y, m, d, h - ago);
-		},
-
-		format(arr) {
-			return arr;
-		},
-
-		requestsChart(): any {
-			return {
-				series: [{
-					name: 'In',
-					color: '#008FFB',
-					data: this.format(this.stats.requests.received)
-				}, {
-					name: 'Out (succ)',
-					color: '#00E396',
-					data: this.format(this.stats.requests.succeeded)
-				}, {
-					name: 'Out (fail)',
-					color: '#FEB019',
-					data: this.format(this.stats.requests.failed)
-				}]
-			};
-		},
-
-		usersChart(total: boolean): any {
-			return {
-				series: [{
-					name: 'Users',
-					color: '#008FFB',
-					data: this.format(total
-						? this.stats.users.total
-						: sum(this.stats.users.inc, negate(this.stats.users.dec))
-					)
-				}]
-			};
-		},
-
-		notesChart(total: boolean): any {
-			return {
-				series: [{
-					name: 'Notes',
-					color: '#008FFB',
-					data: this.format(total
-						? this.stats.notes.total
-						: sum(this.stats.notes.inc, negate(this.stats.notes.dec))
-					)
-				}]
-			};
-		},
-
-		ffChart(total: boolean): any {
-			return {
-				series: [{
-					name: 'Following',
-					color: '#008FFB',
-					data: this.format(total
-						? this.stats.following.total
-						: sum(this.stats.following.inc, negate(this.stats.following.dec))
-					)
-				}, {
-					name: 'Followers',
-					color: '#00E396',
-					data: this.format(total
-						? this.stats.followers.total
-						: sum(this.stats.followers.inc, negate(this.stats.followers.dec))
-					)
-				}]
-			};
-		},
-
-		driveUsageChart(total: boolean): any {
-			return {
-				bytes: true,
-				series: [{
-					name: 'Drive usage',
-					color: '#008FFB',
-					data: this.format(total
-						? this.stats.drive.totalUsage
-						: sum(this.stats.drive.incUsage, negate(this.stats.drive.decUsage))
-					)
-				}]
-			};
-		},
-
-		driveFilesChart(total: boolean): any {
-			return {
-				series: [{
-					name: 'Drive files',
-					color: '#008FFB',
-					data: this.format(total
-						? this.stats.drive.totalFiles
-						: sum(this.stats.drive.incFiles, negate(this.stats.drive.decFiles))
-					)
-				}]
-			};
-		},
-
 		showFollowing() {
 			os.modal(MkUsersDialog, {
 				title: this.$ts.instanceFollowing,
-- 
cgit v1.2.3-freya

