wip: retention for dashboard
This commit is contained in:
		
							parent
							
								
									d0331eebbf
								
							
						
					
					
						commit
						db6fff6f26
					
				
					 2 changed files with 55 additions and 0 deletions
				
			
		
							
								
								
									
										49
									
								
								packages/client/src/pages/admin/overview.retention.vue
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										49
									
								
								packages/client/src/pages/admin/overview.retention.vue
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,49 @@
 | 
			
		|||
<template>
 | 
			
		||||
<div>
 | 
			
		||||
	<MkLoading v-if="fetching"/>
 | 
			
		||||
	<div v-else :class="$style.root">
 | 
			
		||||
		<div v-for="row in retention" class="row">
 | 
			
		||||
			<div v-for="value in getValues(row)" v-tooltip="value.percentage" class="cell">
 | 
			
		||||
			</div>
 | 
			
		||||
		</div>
 | 
			
		||||
	</div>
 | 
			
		||||
</div>
 | 
			
		||||
</template>
 | 
			
		||||
 | 
			
		||||
<script lang="ts" setup>
 | 
			
		||||
import { onMounted, onUnmounted, ref } from 'vue';
 | 
			
		||||
import * as os from '@/os';
 | 
			
		||||
import number from '@/filters/number';
 | 
			
		||||
import { i18n } from '@/i18n';
 | 
			
		||||
 | 
			
		||||
let retention: any = $ref(null);
 | 
			
		||||
let fetching = $ref(true);
 | 
			
		||||
 | 
			
		||||
function getValues(row) {
 | 
			
		||||
	const data = [];
 | 
			
		||||
	for (const key in row.data) {
 | 
			
		||||
		data.push({
 | 
			
		||||
			date: new Date(key),
 | 
			
		||||
			value: number(row.data[key]),
 | 
			
		||||
			percentage: `${Math.ceil(row.data[key] / row.users) * 100}%`,
 | 
			
		||||
		});
 | 
			
		||||
	}
 | 
			
		||||
	data.sort((a, b) => a.date > b.date);
 | 
			
		||||
	return data;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
onMounted(async () => {
 | 
			
		||||
	retention = await os.apiGet('retention', {});
 | 
			
		||||
 | 
			
		||||
	fetching = false;
 | 
			
		||||
});
 | 
			
		||||
</script>
 | 
			
		||||
 | 
			
		||||
<style lang="scss" module>
 | 
			
		||||
.root {
 | 
			
		||||
 | 
			
		||||
	&:global {
 | 
			
		||||
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
</style>
 | 
			
		||||
| 
						 | 
				
			
			@ -16,6 +16,11 @@
 | 
			
		|||
			<XHeatmap/>
 | 
			
		||||
		</MkFolder>
 | 
			
		||||
 | 
			
		||||
		<MkFolder class="item">
 | 
			
		||||
			<template #header>Retention rate</template>
 | 
			
		||||
			<XRetention/>
 | 
			
		||||
		</MkFolder>
 | 
			
		||||
 | 
			
		||||
		<MkFolder class="item">
 | 
			
		||||
			<template #header>Moderators</template>
 | 
			
		||||
			<XModerators/>
 | 
			
		||||
| 
						 | 
				
			
			@ -63,6 +68,7 @@ import XApRequests from './overview.ap-requests.vue';
 | 
			
		|||
import XUsers from './overview.users.vue';
 | 
			
		||||
import XActiveUsers from './overview.active-users.vue';
 | 
			
		||||
import XStats from './overview.stats.vue';
 | 
			
		||||
import XRetention from './overview.retention.vue';
 | 
			
		||||
import XModerators from './overview.moderators.vue';
 | 
			
		||||
import XHeatmap from './overview.heatmap.vue';
 | 
			
		||||
import MkTagCloud from '@/components/MkTagCloud.vue';
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue