🎨
This commit is contained in:
		
							parent
							
								
									49ab2eb07f
								
							
						
					
					
						commit
						8539c7b20f
					
				
					 6 changed files with 126 additions and 46 deletions
				
			
		|  | @ -8,7 +8,8 @@ | ||||||
| 			<template v-else><i class="ti ti-chevron-down"></i></template> | 			<template v-else><i class="ti ti-chevron-down"></i></template> | ||||||
| 		</button> | 		</button> | ||||||
| 	</header> | 	</header> | ||||||
| 	<transition :name="$store.state.animation ? 'folder-toggle' : ''" | 	<transition | ||||||
|  | 		:name="$store.state.animation ? 'folder-toggle' : ''" | ||||||
| 		@enter="enter" | 		@enter="enter" | ||||||
| 		@after-enter="afterEnter" | 		@after-enter="afterEnter" | ||||||
| 		@leave="leave" | 		@leave="leave" | ||||||
|  | @ -121,6 +122,8 @@ export default defineComponent({ | ||||||
| 		backdrop-filter: var(--blur, blur(20px)); | 		backdrop-filter: var(--blur, blur(20px)); | ||||||
| 
 | 
 | ||||||
| 		> .title { | 		> .title { | ||||||
|  | 			display: grid; | ||||||
|  | 			place-content: center; | ||||||
| 			margin: 0; | 			margin: 0; | ||||||
| 			padding: 12px 16px 12px 0; | 			padding: 12px 16px 12px 0; | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -2,8 +2,13 @@ | ||||||
| <div> | <div> | ||||||
| 	<MkLoading v-if="fetching"/> | 	<MkLoading v-if="fetching"/> | ||||||
| 	<div v-show="!fetching" :class="$style.root"> | 	<div v-show="!fetching" :class="$style.root"> | ||||||
| 		<div class="chart _panel"> | 		<div class="charts _panel"> | ||||||
| 			<canvas ref="chartEl"></canvas> | 			<div class="chart"> | ||||||
|  | 				<canvas ref="chartEl2"></canvas> | ||||||
|  | 			</div> | ||||||
|  | 			<div class="chart"> | ||||||
|  | 				<canvas ref="chartEl"></canvas> | ||||||
|  | 			</div> | ||||||
| 		</div> | 		</div> | ||||||
| 	</div> | 	</div> | ||||||
| </div> | </div> | ||||||
|  | @ -58,20 +63,14 @@ Chart.register( | ||||||
| 	gradient, | 	gradient, | ||||||
| ); | ); | ||||||
| 
 | 
 | ||||||
| const alpha = (hex, a) => { |  | ||||||
| 	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}, ${a})`; |  | ||||||
| }; |  | ||||||
| 	 |  | ||||||
| const chartLimit = 50; | const chartLimit = 50; | ||||||
| const chartEl = $ref<HTMLCanvasElement>(); | const chartEl = $ref<HTMLCanvasElement>(); | ||||||
|  | const chartEl2 = $ref<HTMLCanvasElement>(); | ||||||
| let fetching = $ref(true); | let fetching = $ref(true); | ||||||
| 
 | 
 | ||||||
| const { handler: externalTooltipHandler } = useChartTooltip(); | const { handler: externalTooltipHandler } = useChartTooltip(); | ||||||
| 	 | const { handler: externalTooltipHandler2 } = useChartTooltip(); | ||||||
|  | 
 | ||||||
| onMounted(async () => { | onMounted(async () => { | ||||||
| 	const now = new Date(); | 	const now = new Date(); | ||||||
| 
 | 
 | ||||||
|  | @ -101,8 +100,8 @@ onMounted(async () => { | ||||||
| 
 | 
 | ||||||
| 	const gridColor = defaultStore.state.darkMode ? 'rgba(255, 255, 255, 0.1)' : 'rgba(0, 0, 0, 0.1)'; | 	const gridColor = defaultStore.state.darkMode ? 'rgba(255, 255, 255, 0.1)' : 'rgba(0, 0, 0, 0.1)'; | ||||||
| 	const vLineColor = defaultStore.state.darkMode ? 'rgba(255, 255, 255, 0.2)' : 'rgba(0, 0, 0, 0.2)'; | 	const vLineColor = defaultStore.state.darkMode ? 'rgba(255, 255, 255, 0.2)' : 'rgba(0, 0, 0, 0.2)'; | ||||||
| 	const succColor = tinycolor(getComputedStyle(document.documentElement).getPropertyValue('--success')).toHexString(); | 	const succColor = '#4fd60c'; | ||||||
| 	const failColor = tinycolor(getComputedStyle(document.documentElement).getPropertyValue('--error')).toHexString(); | 	const failColor = '#e8681e'; | ||||||
| 
 | 
 | ||||||
| 	const succMax = Math.max(...raw.deliverSucceeded); | 	const succMax = Math.max(...raw.deliverSucceeded); | ||||||
| 	const failMax = Math.max(...raw.deliverFailed); | 	const failMax = Math.max(...raw.deliverFailed); | ||||||
|  | @ -113,27 +112,17 @@ onMounted(async () => { | ||||||
| 	new Chart(chartEl, { | 	new Chart(chartEl, { | ||||||
| 		type: 'bar', | 		type: 'bar', | ||||||
| 		data: { | 		data: { | ||||||
| 			//labels: new Array(props.limit).fill(0).map((_, i) => getDate(i).toLocaleString()).slice().reverse(), |  | ||||||
| 			datasets: [{ | 			datasets: [{ | ||||||
| 				stack: 'a', | 				stack: 'a', | ||||||
| 				parsing: false, | 				parsing: false, | ||||||
| 				label: 'Succ', | 				label: 'Out: Succ', | ||||||
| 				data: format(raw.deliverSucceeded).slice().reverse(), | 				data: format(raw.deliverSucceeded).slice().reverse(), | ||||||
| 				tension: 0.3, | 				tension: 0.3, | ||||||
| 				pointRadius: 0, | 				pointRadius: 0, | ||||||
| 				borderWidth: 0, | 				borderWidth: 0, | ||||||
| 				borderJoinStyle: 'round', | 				borderJoinStyle: 'round', | ||||||
| 				borderRadius: 4, | 				borderRadius: 4, | ||||||
| 				//backgroundColor: alpha(color, 0.1), | 				backgroundColor: succColor, | ||||||
| 				gradient: { |  | ||||||
| 					backgroundColor: { |  | ||||||
| 						axis: 'y', |  | ||||||
| 						colors: { |  | ||||||
| 							0: alpha(succColor, 0.3), |  | ||||||
| 							[succMax]: alpha(succColor, 1), |  | ||||||
| 						}, |  | ||||||
| 					}, |  | ||||||
| 				}, |  | ||||||
| 				barPercentage: 0.9, | 				barPercentage: 0.9, | ||||||
| 				categoryPercentage: 0.9, | 				categoryPercentage: 0.9, | ||||||
| 				fill: true, | 				fill: true, | ||||||
|  | @ -141,23 +130,14 @@ onMounted(async () => { | ||||||
| 			}, { | 			}, { | ||||||
| 				stack: 'a', | 				stack: 'a', | ||||||
| 				parsing: false, | 				parsing: false, | ||||||
| 				label: 'Fail', | 				label: 'Out: Fail', | ||||||
| 				data: formatMinus(raw.deliverFailed).slice().reverse(), | 				data: formatMinus(raw.deliverFailed).slice().reverse(), | ||||||
| 				tension: 0.3, | 				tension: 0.3, | ||||||
| 				pointRadius: 0, | 				pointRadius: 0, | ||||||
| 				borderWidth: 0, | 				borderWidth: 0, | ||||||
| 				borderJoinStyle: 'round', | 				borderJoinStyle: 'round', | ||||||
| 				borderRadius: 4, | 				borderRadius: 4, | ||||||
| 				//backgroundColor: alpha(color, 0.1), | 				backgroundColor: failColor, | ||||||
| 				gradient: { |  | ||||||
| 					backgroundColor: { |  | ||||||
| 						axis: 'y', |  | ||||||
| 						colors: { |  | ||||||
| 							0: alpha(failColor, 0.3), |  | ||||||
| 							[-failMax]: alpha(failColor, 1), |  | ||||||
| 						}, |  | ||||||
| 					}, |  | ||||||
| 				}, |  | ||||||
| 				barPercentage: 0.9, | 				barPercentage: 0.9, | ||||||
| 				categoryPercentage: 0.9, | 				categoryPercentage: 0.9, | ||||||
| 				fill: true, | 				fill: true, | ||||||
|  | @ -244,6 +224,99 @@ onMounted(async () => { | ||||||
| 		}, | 		}, | ||||||
| 		plugins: [chartVLine(vLineColor)], | 		plugins: [chartVLine(vLineColor)], | ||||||
| 	}); | 	}); | ||||||
|  | 
 | ||||||
|  | 	new Chart(chartEl2, { | ||||||
|  | 		type: 'bar', | ||||||
|  | 		data: { | ||||||
|  | 			datasets: [{ | ||||||
|  | 				parsing: false, | ||||||
|  | 				label: 'In', | ||||||
|  | 				data: format(raw.inboxReceived).slice().reverse(), | ||||||
|  | 				tension: 0.3, | ||||||
|  | 				pointRadius: 0, | ||||||
|  | 				borderWidth: 0, | ||||||
|  | 				borderJoinStyle: 'round', | ||||||
|  | 				borderRadius: 4, | ||||||
|  | 				backgroundColor: '#0cc2d6', | ||||||
|  | 				barPercentage: 0.9, | ||||||
|  | 				categoryPercentage: 0.9, | ||||||
|  | 				fill: true, | ||||||
|  | 				clip: 8, | ||||||
|  | 			}], | ||||||
|  | 		}, | ||||||
|  | 		options: { | ||||||
|  | 			aspectRatio: 5, | ||||||
|  | 			layout: { | ||||||
|  | 				padding: { | ||||||
|  | 					left: 0, | ||||||
|  | 					right: 8, | ||||||
|  | 					top: 0, | ||||||
|  | 					bottom: 0, | ||||||
|  | 				}, | ||||||
|  | 			}, | ||||||
|  | 			scales: { | ||||||
|  | 				x: { | ||||||
|  | 					type: 'time', | ||||||
|  | 					offset: false, | ||||||
|  | 					time: { | ||||||
|  | 						stepSize: 1, | ||||||
|  | 						unit: 'day', | ||||||
|  | 					}, | ||||||
|  | 					grid: { | ||||||
|  | 						display: false, | ||||||
|  | 						color: gridColor, | ||||||
|  | 						borderColor: 'rgb(0, 0, 0, 0)', | ||||||
|  | 					}, | ||||||
|  | 					ticks: { | ||||||
|  | 						display: false, | ||||||
|  | 						maxRotation: 0, | ||||||
|  | 						autoSkipPadding: 16, | ||||||
|  | 					}, | ||||||
|  | 					adapters: { | ||||||
|  | 						date: { | ||||||
|  | 							locale: enUS, | ||||||
|  | 						}, | ||||||
|  | 					}, | ||||||
|  | 					min: getDate(chartLimit).getTime(), | ||||||
|  | 				}, | ||||||
|  | 				y: { | ||||||
|  | 					position: 'left', | ||||||
|  | 					suggestedMax: 10, | ||||||
|  | 					grid: { | ||||||
|  | 						display: false, | ||||||
|  | 						color: gridColor, | ||||||
|  | 						borderColor: 'rgb(0, 0, 0, 0)', | ||||||
|  | 					}, | ||||||
|  | 				}, | ||||||
|  | 			}, | ||||||
|  | 			interaction: { | ||||||
|  | 				intersect: false, | ||||||
|  | 				mode: 'index', | ||||||
|  | 			}, | ||||||
|  | 			elements: { | ||||||
|  | 				point: { | ||||||
|  | 					hoverRadius: 5, | ||||||
|  | 					hoverBorderWidth: 2, | ||||||
|  | 				}, | ||||||
|  | 			}, | ||||||
|  | 			animation: true, | ||||||
|  | 			plugins: { | ||||||
|  | 				legend: { | ||||||
|  | 					display: false, | ||||||
|  | 				}, | ||||||
|  | 				tooltip: { | ||||||
|  | 					enabled: false, | ||||||
|  | 					mode: 'index', | ||||||
|  | 					animation: { | ||||||
|  | 						duration: 0, | ||||||
|  | 					}, | ||||||
|  | 					external: externalTooltipHandler2, | ||||||
|  | 				}, | ||||||
|  | 				gradient, | ||||||
|  | 			}, | ||||||
|  | 		}, | ||||||
|  | 		plugins: [chartVLine(vLineColor)], | ||||||
|  | 	}); | ||||||
| 	 | 	 | ||||||
| 	fetching = false; | 	fetching = false; | ||||||
| }); | }); | ||||||
|  | @ -251,11 +324,15 @@ onMounted(async () => { | ||||||
| 
 | 
 | ||||||
| <style lang="scss" module> | <style lang="scss" module> | ||||||
| .root { | .root { | ||||||
| 
 |  | ||||||
| 	&:global { | 	&:global { | ||||||
| 		> .chart { | 		> .charts { | ||||||
| 			padding: 16px; | 			> .chart { | ||||||
| 			margin-bottom: 16px; | 				padding: 16px; | ||||||
|  | 
 | ||||||
|  | 				&:first-child { | ||||||
|  | 					border-bottom: solid 0.5px var(--divider); | ||||||
|  | 				} | ||||||
|  | 			} | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -96,7 +96,7 @@ onMounted(async () => { | ||||||
| 	&:global { | 	&:global { | ||||||
| 		> .pies { | 		> .pies { | ||||||
| 			display: grid; | 			display: grid; | ||||||
| 			grid-template-columns: repeat(auto-fill, minmax(230px, 1fr)); | 			grid-template-columns: repeat(auto-fill, minmax(200px, 1fr)); | ||||||
| 			grid-gap: 16px; | 			grid-gap: 16px; | ||||||
| 			margin-bottom: 16px; | 			margin-bottom: 16px; | ||||||
| 
 | 
 | ||||||
|  | @ -126,7 +126,7 @@ onMounted(async () => { | ||||||
| 
 | 
 | ||||||
| 		> .items { | 		> .items { | ||||||
| 			display: grid; | 			display: grid; | ||||||
| 			grid-template-columns: repeat(auto-fill, minmax(230px, 1fr)); | 			grid-template-columns: repeat(auto-fill, minmax(200px, 1fr)); | ||||||
| 			grid-gap: 16px; | 			grid-gap: 16px; | ||||||
| 
 | 
 | ||||||
| 			> .item { | 			> .item { | ||||||
|  |  | ||||||
|  | @ -81,7 +81,7 @@ onMounted(async () => { | ||||||
| <style lang="scss" module> | <style lang="scss" module> | ||||||
| .root { | .root { | ||||||
| 	display: grid; | 	display: grid; | ||||||
| 	grid-template-columns: repeat(auto-fill, minmax(230px, 1fr)); | 	grid-template-columns: repeat(auto-fill, minmax(200px, 1fr)); | ||||||
| 	grid-gap: 16px; | 	grid-gap: 16px; | ||||||
| 
 | 
 | ||||||
| 	&:global { | 	&:global { | ||||||
|  |  | ||||||
|  | @ -43,7 +43,7 @@ useInterval(fetch, 1000 * 60, { | ||||||
| 			} | 			} | ||||||
| 
 | 
 | ||||||
| 			display: grid; | 			display: grid; | ||||||
| 			grid-template-columns: repeat(auto-fill, minmax(230px, 1fr)); | 			grid-template-columns: repeat(auto-fill, minmax(200px, 1fr)); | ||||||
| 			grid-gap: 12px; | 			grid-gap: 12px; | ||||||
| 
 | 
 | ||||||
| 			> .user:hover { | 			> .user:hover { | ||||||
|  |  | ||||||
|  | @ -41,7 +41,7 @@ export function useChartTooltip() { | ||||||
| 
 | 
 | ||||||
| 		tooltipShowing.value = true; | 		tooltipShowing.value = true; | ||||||
| 		tooltipX.value = rect.left + window.pageXOffset + context.tooltip.caretX; | 		tooltipX.value = rect.left + window.pageXOffset + context.tooltip.caretX; | ||||||
| 		tooltipY.value = rect.top + window.pageYOffset + context.tooltip.caretY; | 		tooltipY.value = rect.top + window.pageYOffset; | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	return { | 	return { | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue