mirror of
				https://github.com/NodeBB/NodeBB.git
				synced 2025-10-30 18:46:01 +01:00 
			
		
		
		
	feat: upgrade chartjs to 4.x
This commit is contained in:
		| @@ -45,7 +45,7 @@ | |||||||
|         "bootstrap": "5.3.2", |         "bootstrap": "5.3.2", | ||||||
|         "bootswatch": "5.3.2", |         "bootswatch": "5.3.2", | ||||||
|         "chalk": "4.1.2", |         "chalk": "4.1.2", | ||||||
|         "chart.js": "2.9.4", |         "chart.js": "4.4.0", | ||||||
|         "cli-graph": "3.2.2", |         "cli-graph": "3.2.2", | ||||||
|         "clipboard": "2.0.11", |         "clipboard": "2.0.11", | ||||||
|         "colors": "1.4.0", |         "colors": "1.4.0", | ||||||
|   | |||||||
| @@ -1,6 +1,4 @@ | |||||||
| .dashboard { | .dashboard { | ||||||
| 	max-width: 1680px; |  | ||||||
|  |  | ||||||
| 	.card { | 	.card { | ||||||
| 		max-width: 100% !important; | 		max-width: 100% !important; | ||||||
| 	} | 	} | ||||||
| @@ -9,77 +7,34 @@ | |||||||
| 		position: relative; | 		position: relative; | ||||||
| 		background: var(--bg-body-bg); | 		background: var(--bg-body-bg); | ||||||
|  |  | ||||||
|  | 		&.pie-chart { | ||||||
|  | 			max-height: 180px; | ||||||
|  | 		} | ||||||
|  |  | ||||||
| 		&.fullscreen { | 		&.fullscreen { | ||||||
| 			width: 100%; | 			width: 100%; | ||||||
| 			padding: 40px; | 			padding: 40px; | ||||||
|  |  | ||||||
| 			.graph-legend { |  | ||||||
| 				top: 7rem; |  | ||||||
| 				left: 12rem; |  | ||||||
| 			} |  | ||||||
| 		} |  | ||||||
|  |  | ||||||
| 		&.pie-chart { |  | ||||||
| 			padding-right: 0px; |  | ||||||
| 			padding-left: 50px; |  | ||||||
| 			min-height: 180px; |  | ||||||
|  |  | ||||||
| 			.graph-legend { |  | ||||||
| 				top: -10px; |  | ||||||
| 				left: 0px; |  | ||||||
| 			} |  | ||||||
|  |  | ||||||
| 			&.compact { |  | ||||||
| 				padding-left: 0px; |  | ||||||
| 				padding-top: 60px; |  | ||||||
| 			} |  | ||||||
|  |  | ||||||
| 			&.legend-down { |  | ||||||
| 				padding-left: 0px; |  | ||||||
| 				padding-top: 0px; |  | ||||||
|  |  | ||||||
| 				canvas { |  | ||||||
| 					margin-bottom: 25px; |  | ||||||
| 				} |  | ||||||
|  |  | ||||||
| 				.graph-legend { |  | ||||||
| 					position: relative; |  | ||||||
|  |  | ||||||
| 					li { |  | ||||||
| 						float: left; |  | ||||||
| 						width: 100%; |  | ||||||
| 						white-space: nowrap; |  | ||||||
| 						overflow: hidden; |  | ||||||
| 						text-overflow: ellipsis; |  | ||||||
|  |  | ||||||
| 						&:nth-child(odd) { |  | ||||||
| 							margin-right: 2%; |  | ||||||
| 						} |  | ||||||
| 					} |  | ||||||
| 				} |  | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	.graph-legend { | 	.graph-legend { | ||||||
| 		@include box-header-font; | 		@include box-header-font; | ||||||
| 			display: inline-block; |  | ||||||
| 			max-width: 100%; |  | ||||||
| 			position: absolute; |  | ||||||
| 			top: 2rem; |  | ||||||
| 			left: 7rem; |  | ||||||
| 			list-style-type: none; |  | ||||||
| 			padding: 0.5rem 1rem; |  | ||||||
| 		margin: 0; | 		margin: 0; | ||||||
|  |  | ||||||
| 		li { | 		li { | ||||||
|  | 			display: flex; | ||||||
|  | 			word-wrap: break-word; | ||||||
|  | 			word-break: break-word; | ||||||
|  | 			gap: 0.5rem; | ||||||
|  | 			span { | ||||||
|  | 				flex: 1; | ||||||
|  | 			} | ||||||
| 			div { | 			div { | ||||||
| 				border: 1px solid; | 				border: 1px solid; | ||||||
|  | 				margin-top: 2px; | ||||||
| 				width: 12px; | 				width: 12px; | ||||||
|  | 				min-width: 12px; | ||||||
| 				height: 12px; | 				height: 12px; | ||||||
| 					vertical-align: -41%; |  | ||||||
| 					margin-bottom: 5px; |  | ||||||
| 					display: inline-block; |  | ||||||
| 					margin-right: 5px; |  | ||||||
|  |  | ||||||
| 				&.page-views { | 				&.page-views { | ||||||
| 					border-color: rgba(220,220,220,1); | 					border-color: rgba(220,220,220,1); | ||||||
| @@ -120,7 +75,6 @@ | |||||||
| 			} | 			} | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	.version-check { | 	.version-check { | ||||||
| 		-webkit-transition: background, color 500ms ease-in; | 		-webkit-transition: background, color 500ms ease-in; | ||||||
|   | |||||||
| @@ -1,7 +1,9 @@ | |||||||
| 'use strict'; | 'use strict'; | ||||||
|  |  | ||||||
|  |  | ||||||
| define('admin/advanced/errors', ['bootbox', 'alerts', 'Chart'], function (bootbox, alerts, Chart) { | define('admin/advanced/errors', [ | ||||||
|  | 	'bootbox', 'alerts', 'chart.js/auto', | ||||||
|  | ], function (bootbox, alerts, { Chart }) { | ||||||
| 	const Errors = {}; | 	const Errors = {}; | ||||||
|  |  | ||||||
| 	Errors.init = function () { | 	Errors.init = function () { | ||||||
| @@ -33,7 +35,7 @@ define('admin/advanced/errors', ['bootbox', 'alerts', 'Chart'], function (bootbo | |||||||
| 		dailyLabels = dailyLabels.slice(-7); | 		dailyLabels = dailyLabels.slice(-7); | ||||||
|  |  | ||||||
| 		if (utils.isMobile()) { | 		if (utils.isMobile()) { | ||||||
| 			Chart.defaults.global.tooltips.enabled = false; | 			Chart.defaults.plugins.tooltip.enabled = false; | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
| 		const data = { | 		const data = { | ||||||
| @@ -42,6 +44,8 @@ define('admin/advanced/errors', ['bootbox', 'alerts', 'Chart'], function (bootbo | |||||||
| 				datasets: [ | 				datasets: [ | ||||||
| 					{ | 					{ | ||||||
| 						label: '', | 						label: '', | ||||||
|  | 						fill: 'origin', | ||||||
|  | 						tension: 0.25, | ||||||
| 						backgroundColor: 'rgba(186,139,175,0.2)', | 						backgroundColor: 'rgba(186,139,175,0.2)', | ||||||
| 						borderColor: 'rgba(186,139,175,1)', | 						borderColor: 'rgba(186,139,175,1)', | ||||||
| 						pointBackgroundColor: 'rgba(186,139,175,1)', | 						pointBackgroundColor: 'rgba(186,139,175,1)', | ||||||
| @@ -57,6 +61,8 @@ define('admin/advanced/errors', ['bootbox', 'alerts', 'Chart'], function (bootbo | |||||||
| 				datasets: [ | 				datasets: [ | ||||||
| 					{ | 					{ | ||||||
| 						label: '', | 						label: '', | ||||||
|  | 						fill: 'origin', | ||||||
|  | 						tension: 0.25, | ||||||
| 						backgroundColor: 'rgba(151,187,205,0.2)', | 						backgroundColor: 'rgba(151,187,205,0.2)', | ||||||
| 						borderColor: 'rgba(151,187,205,1)', | 						borderColor: 'rgba(151,187,205,1)', | ||||||
| 						pointBackgroundColor: 'rgba(151,187,205,1)', | 						pointBackgroundColor: 'rgba(151,187,205,1)', | ||||||
| @@ -69,23 +75,20 @@ define('admin/advanced/errors', ['bootbox', 'alerts', 'Chart'], function (bootbo | |||||||
| 			}, | 			}, | ||||||
| 		}; | 		}; | ||||||
|  |  | ||||||
| 		notFoundCanvas.width = $(notFoundCanvas).parent().width(); |  | ||||||
| 		tooBusyCanvas.width = $(tooBusyCanvas).parent().width(); |  | ||||||
|  |  | ||||||
| 		new Chart(notFoundCanvas.getContext('2d'), { | 		new Chart(notFoundCanvas.getContext('2d'), { | ||||||
| 			type: 'line', | 			type: 'line', | ||||||
| 			data: data['not-found'], | 			data: data['not-found'], | ||||||
| 			options: { | 			options: { | ||||||
| 				responsive: true, | 				responsive: true, | ||||||
|  | 				plugins: { | ||||||
| 					legend: { | 					legend: { | ||||||
| 						display: false, | 						display: false, | ||||||
| 					}, | 					}, | ||||||
|  | 				}, | ||||||
| 				scales: { | 				scales: { | ||||||
| 					yAxes: [{ | 					y: { | ||||||
| 						ticks: { |  | ||||||
| 						beginAtZero: true, | 						beginAtZero: true, | ||||||
| 					}, | 					}, | ||||||
| 					}], |  | ||||||
| 				}, | 				}, | ||||||
| 			}, | 			}, | ||||||
| 		}); | 		}); | ||||||
| @@ -95,15 +98,15 @@ define('admin/advanced/errors', ['bootbox', 'alerts', 'Chart'], function (bootbo | |||||||
| 			data: data.toobusy, | 			data: data.toobusy, | ||||||
| 			options: { | 			options: { | ||||||
| 				responsive: true, | 				responsive: true, | ||||||
|  | 				plugins: { | ||||||
| 					legend: { | 					legend: { | ||||||
| 						display: false, | 						display: false, | ||||||
| 					}, | 					}, | ||||||
|  | 				}, | ||||||
| 				scales: { | 				scales: { | ||||||
| 					yAxes: [{ | 					y: { | ||||||
| 						ticks: { |  | ||||||
| 						beginAtZero: true, | 						beginAtZero: true, | ||||||
| 					}, | 					}, | ||||||
| 					}], |  | ||||||
| 				}, | 				}, | ||||||
| 			}, | 			}, | ||||||
| 		}); | 		}); | ||||||
|   | |||||||
| @@ -2,8 +2,8 @@ | |||||||
|  |  | ||||||
|  |  | ||||||
| define('admin/dashboard', [ | define('admin/dashboard', [ | ||||||
| 	'Chart', 'translator', 'benchpress', 'bootbox', 'alerts', 'helpers', | 	'chart.js/auto', 'translator', 'benchpress', 'bootbox', 'alerts', 'helpers', | ||||||
| ], function (Chart, translator, Benchpress, bootbox, alerts, helpers) { | ], function ({ Chart }, translator, Benchpress, bootbox, alerts, helpers) { | ||||||
| 	const Admin = {}; | 	const Admin = {}; | ||||||
| 	const intervals = { | 	const intervals = { | ||||||
| 		rooms: false, | 		rooms: false, | ||||||
| @@ -63,19 +63,19 @@ define('admin/dashboard', [ | |||||||
|  |  | ||||||
| 		graphData.rooms = data; | 		graphData.rooms = data; | ||||||
|  |  | ||||||
| 		const html = '<div class="text-center float-start">' + | 		const html = '<div class="text-center">' + | ||||||
| 						'<span class="fs-5">' + helpers.formattedNumber(data.onlineRegisteredCount) + '</span>' + | 						'<span class="fs-5">' + helpers.formattedNumber(data.onlineRegisteredCount) + '</span>' + | ||||||
| 						'<div class="stat text-nowrap text-uppercase fw-semibold text-xs text-muted">[[admin/dashboard:active-users.users]]</div>' + | 						'<div class="stat text-nowrap text-uppercase fw-semibold text-xs text-muted">[[admin/dashboard:active-users.users]]</div>' + | ||||||
| 					'</div>' + | 					'</div>' + | ||||||
| 					'<div class="text-center float-start">' + | 					'<div class="text-center">' + | ||||||
| 						'<span class="fs-5">' + helpers.formattedNumber(data.onlineGuestCount) + '</span>' + | 						'<span class="fs-5">' + helpers.formattedNumber(data.onlineGuestCount) + '</span>' + | ||||||
| 						'<div class="stat text-nowrap text-uppercase fw-semibold text-xs text-muted">[[admin/dashboard:active-users.guests]]</div>' + | 						'<div class="stat text-nowrap text-uppercase fw-semibold text-xs text-muted">[[admin/dashboard:active-users.guests]]</div>' + | ||||||
| 					'</div>' + | 					'</div>' + | ||||||
| 					'<div class="text-center float-start">' + | 					'<div class="text-center">' + | ||||||
| 						'<span class="fs-5">' + helpers.formattedNumber(data.onlineRegisteredCount + data.onlineGuestCount) + '</span>' + | 						'<span class="fs-5">' + helpers.formattedNumber(data.onlineRegisteredCount + data.onlineGuestCount) + '</span>' + | ||||||
| 						'<div class="stat text-nowrap text-uppercase fw-semibold text-xs text-muted">[[admin/dashboard:active-users.total]]</div>' + | 						'<div class="stat text-nowrap text-uppercase fw-semibold text-xs text-muted">[[admin/dashboard:active-users.total]]</div>' + | ||||||
| 					'</div>' + | 					'</div>' + | ||||||
| 					'<div class="text-center float-start">' + | 					'<div class="text-center">' + | ||||||
| 						'<span class="fs-5">' + helpers.formattedNumber(data.socketCount) + '</span>' + | 						'<span class="fs-5">' + helpers.formattedNumber(data.socketCount) + '</span>' + | ||||||
| 						'<div class="stat text-nowrap text-uppercase fw-semibold text-xs text-muted">[[admin/dashboard:active-users.connections]]</div>' + | 						'<div class="stat text-nowrap text-uppercase fw-semibold text-xs text-muted">[[admin/dashboard:active-users.connections]]</div>' + | ||||||
| 					'</div>'; | 					'</div>'; | ||||||
| @@ -140,7 +140,7 @@ define('admin/dashboard', [ | |||||||
| 		const trafficLabels = utils.getHoursArray(); | 		const trafficLabels = utils.getHoursArray(); | ||||||
|  |  | ||||||
| 		if (isMobile) { | 		if (isMobile) { | ||||||
| 			Chart.defaults.global.tooltips.enabled = false; | 			Chart.defaults.plugins.tooltip.enabled = false; | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
| 		const t = translator.Translator.create(); | 		const t = translator.Translator.create(); | ||||||
| @@ -158,11 +158,14 @@ define('admin/dashboard', [ | |||||||
| 			t.translateKey('admin/dashboard:recent', []), | 			t.translateKey('admin/dashboard:recent', []), | ||||||
| 			t.translateKey('admin/dashboard:unread', []), | 			t.translateKey('admin/dashboard:unread', []), | ||||||
| 		]).then(function (translations) { | 		]).then(function (translations) { | ||||||
|  | 			const tension = 0.25; | ||||||
| 			const data = { | 			const data = { | ||||||
| 				labels: trafficLabels, | 				labels: trafficLabels, | ||||||
| 				datasets: [ | 				datasets: [ | ||||||
| 					{ | 					{ | ||||||
| 						label: translations[0], | 						label: translations[0], | ||||||
|  | 						fill: 'origin', | ||||||
|  | 						tension: tension, | ||||||
| 						backgroundColor: 'rgba(220,220,220,0.2)', | 						backgroundColor: 'rgba(220,220,220,0.2)', | ||||||
| 						borderColor: 'rgba(220,220,220,1)', | 						borderColor: 'rgba(220,220,220,1)', | ||||||
| 						pointBackgroundColor: 'rgba(220,220,220,1)', | 						pointBackgroundColor: 'rgba(220,220,220,1)', | ||||||
| @@ -173,6 +176,8 @@ define('admin/dashboard', [ | |||||||
| 					}, | 					}, | ||||||
| 					{ | 					{ | ||||||
| 						label: translations[1], | 						label: translations[1], | ||||||
|  | 						fill: 'origin', | ||||||
|  | 						tension: tension, | ||||||
| 						backgroundColor: '#ab464233', | 						backgroundColor: '#ab464233', | ||||||
| 						borderColor: '#ab4642', | 						borderColor: '#ab4642', | ||||||
| 						pointBackgroundColor: '#ab4642', | 						pointBackgroundColor: '#ab4642', | ||||||
| @@ -183,6 +188,8 @@ define('admin/dashboard', [ | |||||||
| 					}, | 					}, | ||||||
| 					{ | 					{ | ||||||
| 						label: translations[2], | 						label: translations[2], | ||||||
|  | 						fill: 'origin', | ||||||
|  | 						tension: tension, | ||||||
| 						backgroundColor: '#ba8baf33', | 						backgroundColor: '#ba8baf33', | ||||||
| 						borderColor: '#ba8baf', | 						borderColor: '#ba8baf', | ||||||
| 						pointBackgroundColor: '#ba8baf', | 						pointBackgroundColor: '#ba8baf', | ||||||
| @@ -193,6 +200,8 @@ define('admin/dashboard', [ | |||||||
| 					}, | 					}, | ||||||
| 					{ | 					{ | ||||||
| 						label: translations[3], | 						label: translations[3], | ||||||
|  | 						fill: 'origin', | ||||||
|  | 						tension: tension, | ||||||
| 						backgroundColor: '#f7ca8833', | 						backgroundColor: '#f7ca8833', | ||||||
| 						borderColor: '#f7ca88', | 						borderColor: '#f7ca88', | ||||||
| 						pointBackgroundColor: '#f7ca88', | 						pointBackgroundColor: '#f7ca88', | ||||||
| @@ -203,6 +212,8 @@ define('admin/dashboard', [ | |||||||
| 					}, | 					}, | ||||||
| 					{ | 					{ | ||||||
| 						label: translations[4], | 						label: translations[4], | ||||||
|  | 						fill: 'origin', | ||||||
|  | 						tension: tension, | ||||||
| 						backgroundColor: 'rgba(151,187,205,0.2)', | 						backgroundColor: 'rgba(151,187,205,0.2)', | ||||||
| 						borderColor: 'rgba(151,187,205,1)', | 						borderColor: 'rgba(151,187,205,1)', | ||||||
| 						pointBackgroundColor: 'rgba(151,187,205,1)', | 						pointBackgroundColor: 'rgba(151,187,205,1)', | ||||||
| @@ -227,43 +238,42 @@ define('admin/dashboard', [ | |||||||
| 				data: data, | 				data: data, | ||||||
| 				options: { | 				options: { | ||||||
| 					responsive: true, | 					responsive: true, | ||||||
| 					legend: { |  | ||||||
| 						display: true, |  | ||||||
| 					}, |  | ||||||
| 					scales: { | 					scales: { | ||||||
| 						yAxes: [{ | 						'left-y-axis': { | ||||||
| 							id: 'left-y-axis', |  | ||||||
| 							ticks: { |  | ||||||
| 								beginAtZero: true, |  | ||||||
| 								precision: 0, |  | ||||||
| 							}, |  | ||||||
| 							type: 'linear', |  | ||||||
| 							position: 'left', | 							position: 'left', | ||||||
| 							scaleLabel: { |  | ||||||
| 								display: true, |  | ||||||
| 								labelString: translations[0], |  | ||||||
| 							}, |  | ||||||
| 						}, { |  | ||||||
| 							id: 'right-y-axis', |  | ||||||
| 							ticks: { |  | ||||||
| 								beginAtZero: true, |  | ||||||
| 								suggestedMax: 10, |  | ||||||
| 								precision: 0, |  | ||||||
| 							}, |  | ||||||
| 							type: 'linear', | 							type: 'linear', | ||||||
| 							position: 'right', | 							title: { | ||||||
| 							scaleLabel: { |  | ||||||
| 								display: true, | 								display: true, | ||||||
| 								labelString: translations[4], | 								text: translations[0], | ||||||
| 							}, | 							}, | ||||||
| 						}], | 							beginAtZero: true, | ||||||
| 						}, | 						}, | ||||||
| 					tooltips: { | 						'right-y-axis': { | ||||||
| 						mode: 'x', | 							position: 'right', | ||||||
|  | 							type: 'linear', | ||||||
|  | 							title: { | ||||||
|  | 								display: true, | ||||||
|  | 								text: translations[4], | ||||||
|  | 							}, | ||||||
|  | 							beginAtZero: true, | ||||||
|  | 						}, | ||||||
|  | 					}, | ||||||
|  | 					interaction: { | ||||||
|  | 						intersect: false, | ||||||
|  | 						mode: 'index', | ||||||
| 					}, | 					}, | ||||||
| 				}, | 				}, | ||||||
| 			}); | 			}); | ||||||
|  |  | ||||||
|  | 			const doughnutOpts = { | ||||||
|  | 				responsive: true, | ||||||
|  | 				maintainAspectRatio: true, | ||||||
|  | 				plugins: { | ||||||
|  | 					legend: { | ||||||
|  | 						display: false, | ||||||
|  | 					}, | ||||||
|  | 				}, | ||||||
|  | 			}; | ||||||
| 			graphs.registered = new Chart(registeredCtx, { | 			graphs.registered = new Chart(registeredCtx, { | ||||||
| 				type: 'doughnut', | 				type: 'doughnut', | ||||||
| 				data: { | 				data: { | ||||||
| @@ -274,12 +284,7 @@ define('admin/dashboard', [ | |||||||
| 						hoverBackgroundColor: ['#FF5A5E', '#5AD3D1'], | 						hoverBackgroundColor: ['#FF5A5E', '#5AD3D1'], | ||||||
| 					}], | 					}], | ||||||
| 				}, | 				}, | ||||||
| 				options: { | 				options: doughnutOpts, | ||||||
| 					responsive: true, |  | ||||||
| 					legend: { |  | ||||||
| 						display: false, |  | ||||||
| 					}, |  | ||||||
| 				}, |  | ||||||
| 			}); | 			}); | ||||||
|  |  | ||||||
| 			graphs.presence = new Chart(presenceCtx, { | 			graphs.presence = new Chart(presenceCtx, { | ||||||
| @@ -292,12 +297,7 @@ define('admin/dashboard', [ | |||||||
| 						hoverBackgroundColor: ['#FF5A5E', '#5AD3D1', '#FFC870', '#A8B3C5', '#A8B3C5'], | 						hoverBackgroundColor: ['#FF5A5E', '#5AD3D1', '#FFC870', '#A8B3C5', '#A8B3C5'], | ||||||
| 					}], | 					}], | ||||||
| 				}, | 				}, | ||||||
| 				options: { | 				options: doughnutOpts, | ||||||
| 					responsive: true, |  | ||||||
| 					legend: { |  | ||||||
| 						display: false, |  | ||||||
| 					}, |  | ||||||
| 				}, |  | ||||||
| 			}); | 			}); | ||||||
|  |  | ||||||
| 			graphs.topics = new Chart(topicsCtx, { | 			graphs.topics = new Chart(topicsCtx, { | ||||||
| @@ -310,19 +310,11 @@ define('admin/dashboard', [ | |||||||
| 						hoverBackgroundColor: [], | 						hoverBackgroundColor: [], | ||||||
| 					}], | 					}], | ||||||
| 				}, | 				}, | ||||||
| 				options: { | 				options: doughnutOpts, | ||||||
| 					responsive: true, |  | ||||||
| 					legend: { |  | ||||||
| 						display: false, |  | ||||||
| 					}, |  | ||||||
| 				}, |  | ||||||
| 			}); | 			}); | ||||||
|  |  | ||||||
| 			updateTrafficGraph(); | 			updateTrafficGraph(); | ||||||
|  |  | ||||||
| 			$(window).on('resize', adjustPieCharts); |  | ||||||
| 			adjustPieCharts(); |  | ||||||
|  |  | ||||||
| 			$('[data-action="updateGraph"]:not([data-units="custom"])').on('click', function () { | 			$('[data-action="updateGraph"]:not([data-units="custom"])').on('click', function () { | ||||||
| 				let until = new Date(); | 				let until = new Date(); | ||||||
| 				const amount = $(this).attr('data-amount'); | 				const amount = $(this).attr('data-amount'); | ||||||
| @@ -398,18 +390,6 @@ define('admin/dashboard', [ | |||||||
| 		}); | 		}); | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	function adjustPieCharts() { |  | ||||||
| 		$('.pie-chart.legend-up').each(function () { |  | ||||||
| 			const $this = $(this); |  | ||||||
|  |  | ||||||
| 			if ($this.width() < 320) { |  | ||||||
| 				$this.addClass('compact'); |  | ||||||
| 			} else { |  | ||||||
| 				$this.removeClass('compact'); |  | ||||||
| 			} |  | ||||||
| 		}); |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	function updateTrafficGraph(units, until, amount) { | 	function updateTrafficGraph(units, until, amount) { | ||||||
| 		// until and amount are optional | 		// until and amount are optional | ||||||
|  |  | ||||||
|   | |||||||
| @@ -2,8 +2,8 @@ | |||||||
|  |  | ||||||
|  |  | ||||||
| define('admin/manage/category-analytics', [ | define('admin/manage/category-analytics', [ | ||||||
| 	'Chart', 'categorySelector', | 	'chart.js/auto', 'categorySelector', | ||||||
| ], function (Chart, categorySelector) { | ], function ({ Chart }, categorySelector) { | ||||||
| 	const CategoryAnalytics = {}; | 	const CategoryAnalytics = {}; | ||||||
|  |  | ||||||
| 	CategoryAnalytics.init = function () { | 	CategoryAnalytics.init = function () { | ||||||
| @@ -27,20 +27,26 @@ define('admin/manage/category-analytics', [ | |||||||
| 		}); | 		}); | ||||||
|  |  | ||||||
| 		if (utils.isMobile()) { | 		if (utils.isMobile()) { | ||||||
| 			Chart.defaults.global.tooltips.enabled = false; | 			Chart.defaults.plugins.tooltip.enabled = false; | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
|  | 		const commonDataSetOpts = { | ||||||
|  | 			label: '', | ||||||
|  | 			fill: true, | ||||||
|  | 			tension: 0.25, | ||||||
|  | 			pointHoverBackgroundColor: '#fff', | ||||||
|  | 			pointBorderColor: '#fff', | ||||||
|  | 		}; | ||||||
|  |  | ||||||
| 		const data = { | 		const data = { | ||||||
| 			'pageviews:hourly': { | 			'pageviews:hourly': { | ||||||
| 				labels: hourlyLabels, | 				labels: hourlyLabels, | ||||||
| 				datasets: [ | 				datasets: [ | ||||||
| 					{ | 					{ | ||||||
| 						label: '', | 						...commonDataSetOpts, | ||||||
| 						backgroundColor: 'rgba(186,139,175,0.2)', | 						backgroundColor: 'rgba(186,139,175,0.2)', | ||||||
| 						borderColor: 'rgba(186,139,175,1)', | 						borderColor: 'rgba(186,139,175,1)', | ||||||
| 						pointBackgroundColor: 'rgba(186,139,175,1)', | 						pointBackgroundColor: 'rgba(186,139,175,1)', | ||||||
| 						pointHoverBackgroundColor: '#fff', |  | ||||||
| 						pointBorderColor: '#fff', |  | ||||||
| 						pointHoverBorderColor: 'rgba(186,139,175,1)', | 						pointHoverBorderColor: 'rgba(186,139,175,1)', | ||||||
| 						data: ajaxify.data.analytics['pageviews:hourly'], | 						data: ajaxify.data.analytics['pageviews:hourly'], | ||||||
| 					}, | 					}, | ||||||
| @@ -50,12 +56,10 @@ define('admin/manage/category-analytics', [ | |||||||
| 				labels: dailyLabels, | 				labels: dailyLabels, | ||||||
| 				datasets: [ | 				datasets: [ | ||||||
| 					{ | 					{ | ||||||
| 						label: '', | 						...commonDataSetOpts, | ||||||
| 						backgroundColor: 'rgba(151,187,205,0.2)', | 						backgroundColor: 'rgba(151,187,205,0.2)', | ||||||
| 						borderColor: 'rgba(151,187,205,1)', | 						borderColor: 'rgba(151,187,205,1)', | ||||||
| 						pointBackgroundColor: 'rgba(151,187,205,1)', | 						pointBackgroundColor: 'rgba(151,187,205,1)', | ||||||
| 						pointHoverBackgroundColor: '#fff', |  | ||||||
| 						pointBorderColor: '#fff', |  | ||||||
| 						pointHoverBorderColor: 'rgba(151,187,205,1)', | 						pointHoverBorderColor: 'rgba(151,187,205,1)', | ||||||
| 						data: ajaxify.data.analytics['pageviews:daily'], | 						data: ajaxify.data.analytics['pageviews:daily'], | ||||||
| 					}, | 					}, | ||||||
| @@ -65,12 +69,10 @@ define('admin/manage/category-analytics', [ | |||||||
| 				labels: dailyLabels.slice(-7), | 				labels: dailyLabels.slice(-7), | ||||||
| 				datasets: [ | 				datasets: [ | ||||||
| 					{ | 					{ | ||||||
| 						label: '', | 						...commonDataSetOpts, | ||||||
| 						backgroundColor: 'rgba(171,70,66,0.2)', | 						backgroundColor: 'rgba(171,70,66,0.2)', | ||||||
| 						borderColor: 'rgba(171,70,66,1)', | 						borderColor: 'rgba(171,70,66,1)', | ||||||
| 						pointBackgroundColor: 'rgba(171,70,66,1)', | 						pointBackgroundColor: 'rgba(171,70,66,1)', | ||||||
| 						pointHoverBackgroundColor: '#fff', |  | ||||||
| 						pointBorderColor: '#fff', |  | ||||||
| 						pointHoverBorderColor: 'rgba(171,70,66,1)', | 						pointHoverBorderColor: 'rgba(171,70,66,1)', | ||||||
| 						data: ajaxify.data.analytics['topics:daily'], | 						data: ajaxify.data.analytics['topics:daily'], | ||||||
| 					}, | 					}, | ||||||
| @@ -80,12 +82,10 @@ define('admin/manage/category-analytics', [ | |||||||
| 				labels: dailyLabels.slice(-7), | 				labels: dailyLabels.slice(-7), | ||||||
| 				datasets: [ | 				datasets: [ | ||||||
| 					{ | 					{ | ||||||
| 						label: '', | 						...commonDataSetOpts, | ||||||
| 						backgroundColor: 'rgba(161,181,108,0.2)', | 						backgroundColor: 'rgba(161,181,108,0.2)', | ||||||
| 						borderColor: 'rgba(161,181,108,1)', | 						borderColor: 'rgba(161,181,108,1)', | ||||||
| 						pointBackgroundColor: 'rgba(161,181,108,1)', | 						pointBackgroundColor: 'rgba(161,181,108,1)', | ||||||
| 						pointHoverBackgroundColor: '#fff', |  | ||||||
| 						pointBorderColor: '#fff', |  | ||||||
| 						pointHoverBorderColor: 'rgba(161,181,108,1)', | 						pointHoverBorderColor: 'rgba(161,181,108,1)', | ||||||
| 						data: ajaxify.data.analytics['posts:daily'], | 						data: ajaxify.data.analytics['posts:daily'], | ||||||
| 					}, | 					}, | ||||||
| @@ -98,84 +98,43 @@ define('admin/manage/category-analytics', [ | |||||||
| 		topicsCanvas.width = $(topicsCanvas).parent().width(); | 		topicsCanvas.width = $(topicsCanvas).parent().width(); | ||||||
| 		postsCanvas.width = $(postsCanvas).parent().width(); | 		postsCanvas.width = $(postsCanvas).parent().width(); | ||||||
|  |  | ||||||
| 		new Chart(hourlyCanvas.getContext('2d'), { | 		const chartOpts = { | ||||||
| 			type: 'line', |  | ||||||
| 			data: data['pageviews:hourly'], |  | ||||||
| 			options: { |  | ||||||
| 			responsive: true, | 			responsive: true, | ||||||
| 			animation: false, | 			animation: false, | ||||||
|  | 			plugins: { | ||||||
| 				legend: { | 				legend: { | ||||||
| 					display: false, | 					display: false, | ||||||
| 				}, | 				}, | ||||||
|  | 			}, | ||||||
| 			scales: { | 			scales: { | ||||||
| 					yAxes: [{ | 				y: { | ||||||
| 						ticks: { |  | ||||||
| 					beginAtZero: true, | 					beginAtZero: true, | ||||||
| 							precision: 0, |  | ||||||
| 						}, |  | ||||||
| 					}], |  | ||||||
| 				}, | 				}, | ||||||
| 			}, | 			}, | ||||||
|  | 		}; | ||||||
|  |  | ||||||
|  | 		new Chart(hourlyCanvas.getContext('2d'), { | ||||||
|  | 			type: 'line', | ||||||
|  | 			data: data['pageviews:hourly'], | ||||||
|  | 			options: chartOpts, | ||||||
| 		}); | 		}); | ||||||
|  |  | ||||||
| 		new Chart(dailyCanvas.getContext('2d'), { | 		new Chart(dailyCanvas.getContext('2d'), { | ||||||
| 			type: 'line', | 			type: 'line', | ||||||
| 			data: data['pageviews:daily'], | 			data: data['pageviews:daily'], | ||||||
| 			options: { | 			options: chartOpts, | ||||||
| 				responsive: true, |  | ||||||
| 				animation: false, |  | ||||||
| 				legend: { |  | ||||||
| 					display: false, |  | ||||||
| 				}, |  | ||||||
| 				scales: { |  | ||||||
| 					yAxes: [{ |  | ||||||
| 						ticks: { |  | ||||||
| 							beginAtZero: true, |  | ||||||
| 							precision: 0, |  | ||||||
| 						}, |  | ||||||
| 					}], |  | ||||||
| 				}, |  | ||||||
| 			}, |  | ||||||
| 		}); | 		}); | ||||||
|  |  | ||||||
| 		new Chart(topicsCanvas.getContext('2d'), { | 		new Chart(topicsCanvas.getContext('2d'), { | ||||||
| 			type: 'line', | 			type: 'line', | ||||||
| 			data: data['topics:daily'], | 			data: data['topics:daily'], | ||||||
| 			options: { | 			options: chartOpts, | ||||||
| 				responsive: true, |  | ||||||
| 				animation: false, |  | ||||||
| 				legend: { |  | ||||||
| 					display: false, |  | ||||||
| 				}, |  | ||||||
| 				scales: { |  | ||||||
| 					yAxes: [{ |  | ||||||
| 						ticks: { |  | ||||||
| 							beginAtZero: true, |  | ||||||
| 							precision: 0, |  | ||||||
| 						}, |  | ||||||
| 					}], |  | ||||||
| 				}, |  | ||||||
| 			}, |  | ||||||
| 		}); | 		}); | ||||||
|  |  | ||||||
| 		new Chart(postsCanvas.getContext('2d'), { | 		new Chart(postsCanvas.getContext('2d'), { | ||||||
| 			type: 'line', | 			type: 'line', | ||||||
| 			data: data['posts:daily'], | 			data: data['posts:daily'], | ||||||
| 			options: { | 			options: chartOpts, | ||||||
| 				responsive: true, |  | ||||||
| 				animation: false, |  | ||||||
| 				legend: { |  | ||||||
| 					display: false, |  | ||||||
| 				}, |  | ||||||
| 				scales: { |  | ||||||
| 					yAxes: [{ |  | ||||||
| 						ticks: { |  | ||||||
| 							beginAtZero: true, |  | ||||||
| 							precision: 0, |  | ||||||
| 						}, |  | ||||||
| 					}], |  | ||||||
| 				}, |  | ||||||
| 			}, |  | ||||||
| 		}); | 		}); | ||||||
| 	}; | 	}; | ||||||
|  |  | ||||||
|   | |||||||
| @@ -1,6 +1,8 @@ | |||||||
| 'use strict'; | 'use strict'; | ||||||
|  |  | ||||||
| define('admin/modules/dashboard-line-graph', ['Chart', 'translator', 'benchpress', 'api', 'hooks', 'bootbox'], function (Chart, translator, Benchpress, api, hooks, bootbox) { | define('admin/modules/dashboard-line-graph', [ | ||||||
|  | 	'chart.js/auto', 'translator', 'benchpress', 'api', 'hooks', 'bootbox', | ||||||
|  | ], function ({ Chart }, translator, Benchpress, api, hooks, bootbox) { | ||||||
| 	const Graph = { | 	const Graph = { | ||||||
| 		_current: null, | 		_current: null, | ||||||
| 	}; | 	}; | ||||||
| @@ -13,7 +15,7 @@ define('admin/modules/dashboard-line-graph', ['Chart', 'translator', 'benchpress | |||||||
|  |  | ||||||
| 		isMobile = /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent); | 		isMobile = /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent); | ||||||
| 		if (isMobile) { | 		if (isMobile) { | ||||||
| 			Chart.defaults.global.tooltips.enabled = false; | 			Chart.defaults.plugins.tooltip.enabled = false; | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
| 		Graph.handleUpdateControls({ set }); | 		Graph.handleUpdateControls({ set }); | ||||||
| @@ -26,6 +28,8 @@ define('admin/modules/dashboard-line-graph', ['Chart', 'translator', 'benchpress | |||||||
| 					datasets: [ | 					datasets: [ | ||||||
| 						{ | 						{ | ||||||
| 							label: key, | 							label: key, | ||||||
|  | 							fill: true, | ||||||
|  | 							tension: 0.25, | ||||||
| 							backgroundColor: 'rgba(151,187,205,0.2)', | 							backgroundColor: 'rgba(151,187,205,0.2)', | ||||||
| 							borderColor: 'rgba(151,187,205,1)', | 							borderColor: 'rgba(151,187,205,1)', | ||||||
| 							pointBackgroundColor: 'rgba(151,187,205,1)', | 							pointBackgroundColor: 'rgba(151,187,205,1)', | ||||||
| @@ -46,26 +50,20 @@ define('admin/modules/dashboard-line-graph', ['Chart', 'translator', 'benchpress | |||||||
| 					data: data, | 					data: data, | ||||||
| 					options: { | 					options: { | ||||||
| 						responsive: true, | 						responsive: true, | ||||||
| 						legend: { |  | ||||||
| 							display: true, |  | ||||||
| 						}, |  | ||||||
| 						scales: { | 						scales: { | ||||||
| 							yAxes: [{ | 							'left-y-axis': { | ||||||
| 								id: 'left-y-axis', |  | ||||||
| 								ticks: { |  | ||||||
| 									beginAtZero: true, |  | ||||||
| 									precision: 0, |  | ||||||
| 								}, |  | ||||||
| 								type: 'linear', | 								type: 'linear', | ||||||
| 								position: 'left', | 								position: 'left', | ||||||
| 								scaleLabel: { | 								beginAtZero: true, | ||||||
|  | 								title: { | ||||||
| 									display: true, | 									display: true, | ||||||
| 									labelString: key, | 									text: key, | ||||||
| 								}, | 								}, | ||||||
| 							}], |  | ||||||
| 							}, | 							}, | ||||||
| 						tooltips: { | 						}, | ||||||
| 							mode: 'x', | 						interaction: { | ||||||
|  | 							intersect: false, | ||||||
|  | 							mode: 'index', | ||||||
| 						}, | 						}, | ||||||
| 					}, | 					}, | ||||||
| 				}); | 				}); | ||||||
|   | |||||||
| @@ -1,11 +1,11 @@ | |||||||
| 'use strict'; | 'use strict'; | ||||||
|  |  | ||||||
| define('forum/flags/list', [ | define('forum/flags/list', [ | ||||||
| 	'components', 'Chart', 'categoryFilter', | 	'components', 'chart.js/auto', 'categoryFilter', | ||||||
| 	'autocomplete', 'api', 'alerts', | 	'autocomplete', 'api', 'alerts', | ||||||
| 	'userFilter', | 	'userFilter', | ||||||
| ], function ( | ], function ( | ||||||
| 	components, Chart, categoryFilter, | 	components, { Chart }, categoryFilter, | ||||||
| 	autocomplete, api, alerts, | 	autocomplete, api, alerts, | ||||||
| 	userFilter | 	userFilter | ||||||
| ) { | ) { | ||||||
| @@ -255,7 +255,7 @@ define('forum/flags/list', [ | |||||||
| 		}); | 		}); | ||||||
|  |  | ||||||
| 		if (utils.isMobile()) { | 		if (utils.isMobile()) { | ||||||
| 			Chart.defaults.global.tooltips.enabled = false; | 			Chart.defaults.plugins.tooltip.enabled = false; | ||||||
| 		} | 		} | ||||||
| 		const data = { | 		const data = { | ||||||
| 			'flags:daily': { | 			'flags:daily': { | ||||||
| @@ -282,16 +282,15 @@ define('forum/flags/list', [ | |||||||
| 			options: { | 			options: { | ||||||
| 				responsive: true, | 				responsive: true, | ||||||
| 				animation: false, | 				animation: false, | ||||||
|  | 				plugins: { | ||||||
| 					legend: { | 					legend: { | ||||||
| 						display: false, | 						display: false, | ||||||
| 					}, | 					}, | ||||||
| 				scales: { |  | ||||||
| 					yAxes: [{ |  | ||||||
| 						ticks: { |  | ||||||
| 							beginAtZero: true, |  | ||||||
| 							precision: 0, |  | ||||||
| 				}, | 				}, | ||||||
| 					}], | 				scales: { | ||||||
|  | 					y: { | ||||||
|  | 						beginAtZero: true, | ||||||
|  | 					}, | ||||||
| 				}, | 				}, | ||||||
| 			}, | 			}, | ||||||
| 		}); | 		}); | ||||||
|   | |||||||
| @@ -1,7 +1,8 @@ | |||||||
| 'use strict'; | 'use strict'; | ||||||
|  |  | ||||||
|  | define('forum/ip-blacklist', [ | ||||||
| define('forum/ip-blacklist', ['Chart', 'benchpress', 'bootbox', 'alerts'], function (Chart, Benchpress, bootbox, alerts) { | 	'chart.js/auto', 'benchpress', 'bootbox', 'alerts', | ||||||
|  | ], function ({ Chart }, Benchpress, bootbox, alerts) { | ||||||
| 	const Blacklist = {}; | 	const Blacklist = {}; | ||||||
|  |  | ||||||
| 	Blacklist.init = function () { | 	Blacklist.init = function () { | ||||||
| @@ -52,7 +53,7 @@ define('forum/ip-blacklist', ['Chart', 'benchpress', 'bootbox', 'alerts'], funct | |||||||
| 		}); | 		}); | ||||||
|  |  | ||||||
| 		if (utils.isMobile()) { | 		if (utils.isMobile()) { | ||||||
| 			Chart.defaults.global.tooltips.enabled = false; | 			Chart.defaults.plugins.tooltip.enabled = false; | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
| 		const data = { | 		const data = { | ||||||
| @@ -61,6 +62,8 @@ define('forum/ip-blacklist', ['Chart', 'benchpress', 'bootbox', 'alerts'], funct | |||||||
| 				datasets: [ | 				datasets: [ | ||||||
| 					{ | 					{ | ||||||
| 						label: '', | 						label: '', | ||||||
|  | 						fill: 'origin', | ||||||
|  | 						tension: 0.25, | ||||||
| 						backgroundColor: 'rgba(186,139,175,0.2)', | 						backgroundColor: 'rgba(186,139,175,0.2)', | ||||||
| 						borderColor: 'rgba(186,139,175,1)', | 						borderColor: 'rgba(186,139,175,1)', | ||||||
| 						pointBackgroundColor: 'rgba(186,139,175,1)', | 						pointBackgroundColor: 'rgba(186,139,175,1)', | ||||||
| @@ -88,45 +91,34 @@ define('forum/ip-blacklist', ['Chart', 'benchpress', 'bootbox', 'alerts'], funct | |||||||
| 			}, | 			}, | ||||||
| 		}; | 		}; | ||||||
|  |  | ||||||
| 		hourlyCanvas.width = $(hourlyCanvas).parent().width(); | 		const chartOpts = { | ||||||
| 		dailyCanvas.width = $(dailyCanvas).parent().width(); | 			responsive: true, | ||||||
|  | 			maintainAspectRatio: true, | ||||||
|  | 			plugins: { | ||||||
|  | 				legend: { | ||||||
|  | 					display: false, | ||||||
|  | 				}, | ||||||
|  | 			}, | ||||||
|  | 			scales: { | ||||||
|  | 				y: { | ||||||
|  | 					position: 'left', | ||||||
|  | 					type: 'linear', | ||||||
|  | 					beginAtZero: true, | ||||||
|  | 				}, | ||||||
|  | 			}, | ||||||
|  | 		}; | ||||||
|  |  | ||||||
|  |  | ||||||
| 		new Chart(hourlyCanvas.getContext('2d'), { | 		new Chart(hourlyCanvas.getContext('2d'), { | ||||||
| 			type: 'line', | 			type: 'line', | ||||||
| 			data: data['blacklist:hourly'], | 			data: data['blacklist:hourly'], | ||||||
| 			options: { | 			options: chartOpts, | ||||||
| 				responsive: true, |  | ||||||
| 				animation: false, |  | ||||||
| 				legend: { |  | ||||||
| 					display: false, |  | ||||||
| 				}, |  | ||||||
| 				scales: { |  | ||||||
| 					yAxes: [{ |  | ||||||
| 						ticks: { |  | ||||||
| 							beginAtZero: true, |  | ||||||
| 						}, |  | ||||||
| 					}], |  | ||||||
| 				}, |  | ||||||
| 			}, |  | ||||||
| 		}); | 		}); | ||||||
|  |  | ||||||
| 		new Chart(dailyCanvas.getContext('2d'), { | 		new Chart(dailyCanvas.getContext('2d'), { | ||||||
| 			type: 'line', | 			type: 'line', | ||||||
| 			data: data['blacklist:daily'], | 			data: data['blacklist:daily'], | ||||||
| 			options: { | 			options: chartOpts, | ||||||
| 				responsive: true, |  | ||||||
| 				animation: false, |  | ||||||
| 				legend: { |  | ||||||
| 					display: false, |  | ||||||
| 				}, |  | ||||||
| 				scales: { |  | ||||||
| 					yAxes: [{ |  | ||||||
| 						ticks: { |  | ||||||
| 							beginAtZero: true, |  | ||||||
| 						}, |  | ||||||
| 					}], |  | ||||||
| 				}, |  | ||||||
| 			}, |  | ||||||
| 		}); | 		}); | ||||||
| 	}; | 	}; | ||||||
|  |  | ||||||
|   | |||||||
| @@ -18,7 +18,9 @@ | |||||||
| 			<div class="col-sm-6 text-center"> | 			<div class="col-sm-6 text-center"> | ||||||
| 				<div class="card"> | 				<div class="card"> | ||||||
| 					<div class="card-body" > | 					<div class="card-body" > | ||||||
| 						<div><canvas id="not-found" height="250"></canvas></div> | 						<div class="position-relative" style="aspect-ratio: 2;"> | ||||||
|  | 							<canvas id="not-found"></canvas> | ||||||
|  | 						</div> | ||||||
| 					</div> | 					</div> | ||||||
| 					<div class="card-footer"><small> | 					<div class="card-footer"><small> | ||||||
| 						<strong>[[admin/advanced/errors:figure-x, 1]]</strong> – | 						<strong>[[admin/advanced/errors:figure-x, 1]]</strong> – | ||||||
| @@ -29,7 +31,9 @@ | |||||||
| 			<div class="col-sm-6 text-center"> | 			<div class="col-sm-6 text-center"> | ||||||
| 				<div class="card"> | 				<div class="card"> | ||||||
| 					<div class="card-body"> | 					<div class="card-body"> | ||||||
| 						<div><canvas id="toobusy" height="250"></canvas></div> | 						<div class="position-relative" style="aspect-ratio: 2;"> | ||||||
|  | 							<canvas id="toobusy"></canvas> | ||||||
|  | 						</div> | ||||||
| 					</div> | 					</div> | ||||||
| 					<div class="card-footer"><small> | 					<div class="card-footer"><small> | ||||||
| 						<strong>[[admin/advanced/errors:figure-x, 2]]</strong> – | 						<strong>[[admin/advanced/errors:figure-x, 2]]</strong> – | ||||||
|   | |||||||
| @@ -1,5 +1,5 @@ | |||||||
| <div class="row dashboard px-lg-4"> | <div class="row dashboard px-lg-4"> | ||||||
| 	<div class="col-lg-9"> | 	<div class="col-lg-8 col-xl-9"> | ||||||
| 		<!-- IMPORT admin/partials/dashboard/graph.tpl --> | 		<!-- IMPORT admin/partials/dashboard/graph.tpl --> | ||||||
| 		<!-- IMPORT admin/partials/dashboard/stats.tpl --> | 		<!-- IMPORT admin/partials/dashboard/stats.tpl --> | ||||||
|  |  | ||||||
| @@ -8,24 +8,25 @@ | |||||||
| 				<div class="card"> | 				<div class="card"> | ||||||
| 					<div class="card-header">[[admin/dashboard:guest-registered-users]]</div> | 					<div class="card-header">[[admin/dashboard:guest-registered-users]]</div> | ||||||
| 					<div class="card-body"> | 					<div class="card-body"> | ||||||
| 						<div class="graph-container pie-chart legend-down"> | 						<div class="graph-container pie-chart legend-down position-relative mb-3 px-3 mx-auto" style="aspect-ratio: 1;"> | ||||||
| 							<canvas id="analytics-registered"></canvas> | 							<canvas id="analytics-registered"></canvas> | ||||||
| 							<ul class="graph-legend border" id="analytics-legend"> | 						</div> | ||||||
|  | 						<ul class="graph-legend list-unstyled" id="analytics-legend"> | ||||||
| 							<li><div class="registered"></div><span>(<span class="count"></span>) [[admin/dashboard:registered]]</span></li> | 							<li><div class="registered"></div><span>(<span class="count"></span>) [[admin/dashboard:registered]]</span></li> | ||||||
| 							<li><div class="guest"></div><span>(<span class="count"></span>) [[admin/dashboard:guest]]</span></li> | 							<li><div class="guest"></div><span>(<span class="count"></span>) [[admin/dashboard:guest]]</span></li> | ||||||
| 						</ul> | 						</ul> | ||||||
| 					</div> | 					</div> | ||||||
| 				</div> | 				</div> | ||||||
| 			</div> | 			</div> | ||||||
| 			</div> |  | ||||||
|  |  | ||||||
| 			<div class="col-lg-4"> | 			<div class="col-lg-4"> | ||||||
| 				<div class="card"> | 				<div class="card"> | ||||||
| 					<div class="card-header">[[admin/dashboard:user-presence]]</div> | 					<div class="card-header">[[admin/dashboard:user-presence]]</div> | ||||||
| 					<div class="card-body"> | 					<div class="card-body"> | ||||||
| 						<div class="graph-container pie-chart legend-down"> | 						<div class="graph-container pie-chart legend-down position-relative mb-3 px-3 mx-auto" style="aspect-ratio: 1;"> | ||||||
| 							<canvas id="analytics-presence"></canvas> | 							<canvas id="analytics-presence"></canvas> | ||||||
| 							<ul class="graph-legend border" id="analytics-presence-legend"> | 						</div> | ||||||
|  | 						<ul class="graph-legend list-unstyled" id="analytics-presence-legend"> | ||||||
| 							<li><div class="reading-posts"></div><span>(<span class="count"></span>) [[admin/dashboard:reading-posts]]</span></li> | 							<li><div class="reading-posts"></div><span>(<span class="count"></span>) [[admin/dashboard:reading-posts]]</span></li> | ||||||
| 							<li><div class="on-categories"></div><span>(<span class="count"></span>) [[admin/dashboard:on-categories]]</span></li> | 							<li><div class="on-categories"></div><span>(<span class="count"></span>) [[admin/dashboard:on-categories]]</span></li> | ||||||
| 							<li><div class="browsing-topics"></div><span>(<span class="count"></span>) [[admin/dashboard:browsing-topics]]</span></li> | 							<li><div class="browsing-topics"></div><span>(<span class="count"></span>) [[admin/dashboard:browsing-topics]]</span></li> | ||||||
| @@ -35,22 +36,21 @@ | |||||||
| 					</div> | 					</div> | ||||||
| 				</div> | 				</div> | ||||||
| 			</div> | 			</div> | ||||||
| 			</div> |  | ||||||
| 			<div class="col-lg-4"> | 			<div class="col-lg-4"> | ||||||
| 				<div class="card"> | 				<div class="card"> | ||||||
| 					<div class="card-header">[[admin/dashboard:high-presence-topics]]</div> | 					<div class="card-header">[[admin/dashboard:high-presence-topics]]</div> | ||||||
| 					<div class="card-body"> | 					<div class="card-body"> | ||||||
| 						<div class="graph-container pie-chart legend-down"> | 						<div class="graph-container pie-chart legend-down position-relative mb-3 px-3 mx-auto" style="aspect-ratio: 1;"> | ||||||
| 							<canvas id="analytics-topics"></canvas> | 							<canvas id="analytics-topics"></canvas> | ||||||
| 							<ul class="graph-legend border" id="topics-legend"></ul> |  | ||||||
| 						</div> | 						</div> | ||||||
|  | 						<ul class="graph-legend list-unstyled" id="topics-legend"></ul> | ||||||
| 					</div> | 					</div> | ||||||
| 				</div> | 				</div> | ||||||
| 			</div> | 			</div> | ||||||
| 		</div> | 		</div> | ||||||
| 	</div> | 	</div> | ||||||
|  |  | ||||||
| 	<div class="col-lg-3"> | 	<div class="col-lg-4 col-xl-3"> | ||||||
| 		<div class="card mb-3"> | 		<div class="card mb-3"> | ||||||
| 			<div class="card-body"> | 			<div class="card-body"> | ||||||
| 				<div class="text-sm shadow-sm alert {{{ if lookupFailed }}}alert-danger{{{ else }}}{{{ if upgradeAvailable }}}alert-warning{{{ else }}}{{{ if currentPrerelease }}}alert-info{{{ else }}}alert-success{{{ end }}}{{{ end }}}{{{ end }}} version-check"> | 				<div class="text-sm shadow-sm alert {{{ if lookupFailed }}}alert-danger{{{ else }}}{{{ if upgradeAvailable }}}alert-warning{{{ else }}}{{{ if currentPrerelease }}}alert-info{{{ else }}}alert-success{{{ end }}}{{{ end }}}{{{ end }}} version-check"> | ||||||
| @@ -112,7 +112,7 @@ | |||||||
| 		<div class="card mb-3"> | 		<div class="card mb-3"> | ||||||
| 			<div class="card-header">[[admin/dashboard:active-users]]</div> | 			<div class="card-header">[[admin/dashboard:active-users]]</div> | ||||||
| 			<div class="card-body"> | 			<div class="card-body"> | ||||||
| 				<div id="active-users" class="stats row row-cols-2"></div> | 				<div id="active-users" class="stats row row-cols-2 row-cols-md-1 row-cols-lg-2"></div> | ||||||
| 			</div> | 			</div> | ||||||
| 		</div> | 		</div> | ||||||
|  |  | ||||||
|   | |||||||
| @@ -14,10 +14,9 @@ | |||||||
| 		<div class="col-sm-6 text-center"> | 		<div class="col-sm-6 text-center"> | ||||||
| 			<div class="card"> | 			<div class="card"> | ||||||
| 				<div class="card-body"> | 				<div class="card-body"> | ||||||
| 					<div><canvas id="pageviews:hourly" height="250"></canvas></div> | 					<div class="position-relative" style="aspect-ratio: 2;"> | ||||||
| 					<p> | 						<canvas id="pageviews:hourly"></canvas> | ||||||
|  | 					</div> | ||||||
| 					</p> |  | ||||||
| 				</div> | 				</div> | ||||||
| 				<div class="card-footer"><small>[[admin/manage/categories:analytics.pageviews-hourly]]</div> | 				<div class="card-footer"><small>[[admin/manage/categories:analytics.pageviews-hourly]]</div> | ||||||
| 			</div> | 			</div> | ||||||
| @@ -25,10 +24,9 @@ | |||||||
| 		<div class="col-sm-6 text-center"> | 		<div class="col-sm-6 text-center"> | ||||||
| 			<div class="card"> | 			<div class="card"> | ||||||
| 				<div class="card-body"> | 				<div class="card-body"> | ||||||
| 					<div><canvas id="pageviews:daily" height="250"></canvas></div> | 					<div class="position-relative" style="aspect-ratio: 2;"> | ||||||
| 					<p> | 						<canvas id="pageviews:daily" height="250"></canvas> | ||||||
|  | 					</div> | ||||||
| 					</p> |  | ||||||
| 				</div> | 				</div> | ||||||
| 				<div class="card-footer"><small>[[admin/manage/categories:analytics.pageviews-daily]]</div> | 				<div class="card-footer"><small>[[admin/manage/categories:analytics.pageviews-daily]]</div> | ||||||
| 			</div> | 			</div> | ||||||
| @@ -38,10 +36,9 @@ | |||||||
| 		<div class="col-sm-6 text-center"> | 		<div class="col-sm-6 text-center"> | ||||||
| 			<div class="card"> | 			<div class="card"> | ||||||
| 				<div class="card-body"> | 				<div class="card-body"> | ||||||
| 					<div><canvas id="topics:daily" height="250"></canvas></div> | 					<div class="position-relative" style="aspect-ratio: 2;"> | ||||||
| 					<p> | 						<canvas id="topics:daily" height="250"></canvas> | ||||||
|  | 					</div> | ||||||
| 					</p> |  | ||||||
| 				</div> | 				</div> | ||||||
| 				<div class="card-footer"><small>[[admin/manage/categories:analytics.topics-daily]]</div> | 				<div class="card-footer"><small>[[admin/manage/categories:analytics.topics-daily]]</div> | ||||||
| 			</div> | 			</div> | ||||||
| @@ -49,10 +46,9 @@ | |||||||
| 		<div class="col-sm-6 text-center"> | 		<div class="col-sm-6 text-center"> | ||||||
| 			<div class="card"> | 			<div class="card"> | ||||||
| 				<div class="card-body"> | 				<div class="card-body"> | ||||||
| 					<div><canvas id="posts:daily" height="250"></canvas></div> | 					<div class="position-relative" style="aspect-ratio: 2;"> | ||||||
| 					<p> | 						<canvas id="posts:daily" height="250"></canvas> | ||||||
|  | 					</div> | ||||||
| 					</p> |  | ||||||
| 				</div> | 				</div> | ||||||
| 				<div class="card-footer"><small>[[admin/manage/categories:analytics.posts-daily]]</div> | 				<div class="card-footer"><small>[[admin/manage/categories:analytics.posts-daily]]</div> | ||||||
| 			</div> | 			</div> | ||||||
|   | |||||||
| @@ -10,8 +10,8 @@ | |||||||
| 		</div> | 		</div> | ||||||
| 	</div> | 	</div> | ||||||
| 	<div class="card-body"> | 	<div class="card-body"> | ||||||
| 		<div class="graph-container" id="analytics-traffic-container"> | 		<div class="graph-container position-relative" id="analytics-traffic-container" style="aspect-ratio: 16/9;"> | ||||||
| 			<canvas id="analytics-traffic" width="100%" height="400"></canvas> | 			<canvas id="analytics-traffic" ></canvas> | ||||||
| 		</div> | 		</div> | ||||||
| 		<hr/> | 		<hr/> | ||||||
| 		<div class="row"> | 		<div class="row"> | ||||||
|   | |||||||
| @@ -40,14 +40,18 @@ | |||||||
| 			<div class="col-sm-6"> | 			<div class="col-sm-6"> | ||||||
| 				<div class="card mb-3"> | 				<div class="card mb-3"> | ||||||
| 					<div class="card-body"> | 					<div class="card-body"> | ||||||
| 						<div><canvas id="blacklist:hourly" height="250"></canvas></div> | 						<div class="position-relative" style="aspect-ratio: 2; max-height: initial;"> | ||||||
|  | 							<canvas id="blacklist:hourly" style="max-height: initial;"></canvas> | ||||||
|  | 						</div> | ||||||
| 					</div> | 					</div> | ||||||
| 					<div class="card-footer"><small>[[ip-blacklist:analytics.blacklist-hourly]]</small></div> | 					<div class="card-footer"><small>[[ip-blacklist:analytics.blacklist-hourly]]</small></div> | ||||||
| 				</div> | 				</div> | ||||||
|  |  | ||||||
| 				<div class="card"> | 				<div class="card"> | ||||||
| 					<div class="card-body"> | 					<div class="card-body"> | ||||||
| 						<div><canvas id="blacklist:daily" height="250"></canvas></div> | 						<div class="position-relative" style="aspect-ratio: 2; max-height: initial;"> | ||||||
|  | 							<canvas id="blacklist:daily" style="max-height: initial;"></canvas> | ||||||
|  | 						</div> | ||||||
| 					</div> | 					</div> | ||||||
| 					<div class="card-footer"><small>[[ip-blacklist:analytics.blacklist-daily]]</small></div> | 					<div class="card-footer"><small>[[ip-blacklist:analytics.blacklist-daily]]</small></div> | ||||||
| 				</div> | 				</div> | ||||||
|   | |||||||
| @@ -59,7 +59,6 @@ module.exports = { | |||||||
| 			admin: path.resolve(__dirname, 'build/public/src/admin'), | 			admin: path.resolve(__dirname, 'build/public/src/admin'), | ||||||
| 			vendor: path.resolve(__dirname, 'public/vendor'), | 			vendor: path.resolve(__dirname, 'public/vendor'), | ||||||
| 			benchpress: path.resolve(__dirname, 'node_modules/benchpressjs'), | 			benchpress: path.resolve(__dirname, 'node_modules/benchpressjs'), | ||||||
| 			Chart: path.resolve(__dirname, 'node_modules/chart.js'), |  | ||||||
| 			Sortable: path.resolve(__dirname, 'node_modules/sortablejs'), | 			Sortable: path.resolve(__dirname, 'node_modules/sortablejs'), | ||||||
| 			cropper: path.resolve(__dirname, 'node_modules/cropperjs'), | 			cropper: path.resolve(__dirname, 'node_modules/cropperjs'), | ||||||
| 			'jquery-ui/widgets': path.resolve(__dirname, 'node_modules/jquery-ui/ui/widgets'), | 			'jquery-ui/widgets': path.resolve(__dirname, 'node_modules/jquery-ui/ui/widgets'), | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user