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/>
 | 
								<XHeatmap/>
 | 
				
			||||||
		</MkFolder>
 | 
							</MkFolder>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							<MkFolder class="item">
 | 
				
			||||||
 | 
								<template #header>Retention rate</template>
 | 
				
			||||||
 | 
								<XRetention/>
 | 
				
			||||||
 | 
							</MkFolder>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		<MkFolder class="item">
 | 
							<MkFolder class="item">
 | 
				
			||||||
			<template #header>Moderators</template>
 | 
								<template #header>Moderators</template>
 | 
				
			||||||
			<XModerators/>
 | 
								<XModerators/>
 | 
				
			||||||
| 
						 | 
					@ -63,6 +68,7 @@ import XApRequests from './overview.ap-requests.vue';
 | 
				
			||||||
import XUsers from './overview.users.vue';
 | 
					import XUsers from './overview.users.vue';
 | 
				
			||||||
import XActiveUsers from './overview.active-users.vue';
 | 
					import XActiveUsers from './overview.active-users.vue';
 | 
				
			||||||
import XStats from './overview.stats.vue';
 | 
					import XStats from './overview.stats.vue';
 | 
				
			||||||
 | 
					import XRetention from './overview.retention.vue';
 | 
				
			||||||
import XModerators from './overview.moderators.vue';
 | 
					import XModerators from './overview.moderators.vue';
 | 
				
			||||||
import XHeatmap from './overview.heatmap.vue';
 | 
					import XHeatmap from './overview.heatmap.vue';
 | 
				
			||||||
import MkTagCloud from '@/components/MkTagCloud.vue';
 | 
					import MkTagCloud from '@/components/MkTagCloud.vue';
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue