283 lines
13 KiB
Vue
283 lines
13 KiB
Vue
<template>
|
||
<Sidebar :visible="sidebarState" :closeIcon="'pi pi-angle-right'" :modal="false" position="right" :dismissable="false" class="!w-[440px]" @hide="hide" @show="show">
|
||
<template #header>
|
||
<p class="pl-2 text-base font-bold text-neutral-900">Summary</p>
|
||
</template>
|
||
<!-- header: summary -->
|
||
<div class="flex justify-start items-start">
|
||
<!-- 001 -->
|
||
<section class="w-[204px] box-border pr-4">
|
||
<div class="mb-4">
|
||
<p class="h2">File Name</p>
|
||
<p class="text-sm leading-normal whitespace-nowrap break-keep overflow-hidden text-ellipsis" :title="primaryStatData.name">{{ primaryStatData.name }}</p>
|
||
</div>
|
||
<!-- Stats -->
|
||
<ul class="pb-4 border-b border-neutral-300">
|
||
<li>
|
||
<p class="h2">Cases</p>
|
||
<div class="flex justify-between items-center">
|
||
<div class="w-full mr-4">
|
||
<span class="block text-sm">{{ primaryStatData.cases.count }} / {{ primaryStatData.cases.total }}</span>
|
||
<ProgressBar :value="primaryValueCases" :showValue="false" class="!h-2 !rounded-full my-2 !bg-neutral-300 progressbar-primary"></ProgressBar>
|
||
</div>
|
||
<span class="block text-primary text-2xl text-right font-medium basis-28">{{ primaryStatData.cases.ratio }}%</span>
|
||
</div>
|
||
</li>
|
||
<li>
|
||
<p class="h2">Traces</p>
|
||
<div class="flex justify-between items-center">
|
||
<div class="w-full mr-4">
|
||
<span class="block text-sm">{{ primaryStatData.traces.count }} / {{ primaryStatData.traces.total }}</span>
|
||
<ProgressBar :value="primaryValueTraces" :showValue="false" class="!h-2 !rounded-full my-2 !bg-neutral-300 progressbar-primary"></ProgressBar>
|
||
</div>
|
||
<span class="block text-primary text-2xl text-right font-medium basis-28">{{ primaryStatData.traces.ratio }}%</span>
|
||
</div>
|
||
</li>
|
||
<li>
|
||
<p class="h2">Activity Instances</p>
|
||
<div class="flex justify-between items-center">
|
||
<div class="w-full mr-4">
|
||
<span class="block text-sm">{{ primaryStatData.task_instances.count }} / {{ primaryStatData.task_instances.total }}</span>
|
||
<ProgressBar :value="primaryValueTaskInstances" :showValue="false" class="!h-2 !rounded-full my-2 !bg-neutral-300 progressbar-primary"></ProgressBar>
|
||
</div>
|
||
<span class="block text-primary text-2xl text-right font-medium basis-28">{{ primaryStatData.task_instances.ratio }}%</span>
|
||
</div>
|
||
</li>
|
||
<li>
|
||
<p class="h2">Activities</p>
|
||
<div class="flex justify-between items-center">
|
||
<div class="w-full mr-4">
|
||
<span class="block text-sm">{{ primaryStatData.tasks.count }} / {{ primaryStatData.tasks.total }}</span>
|
||
<ProgressBar :value="primaryValueTasks" :showValue="false" class="!h-2 !rounded-full my-2 !bg-neutral-300 progressbar-primary"></ProgressBar>
|
||
</div>
|
||
<span class="block text-primary text-2xl text-right font-medium basis-28">{{ primaryStatData.tasks.ratio }}%</span>
|
||
</div>
|
||
</li>
|
||
</ul>
|
||
<!-- Log Timeframe -->
|
||
<div class="pt-1 pb-4 border-b border-neutral-300">
|
||
<p class="h2">Log Timeframe</p>
|
||
<div class="space-y-2 text-sm text-center">
|
||
<span class="block">{{ primaryStatData.started_at }} </span>
|
||
<span class="block">~</span>
|
||
<span class="block"> {{ primaryStatData.completed_at }}</span>
|
||
</div>
|
||
</div>
|
||
<!-- Case Duration -->
|
||
<div class="pt-1 pb-4">
|
||
<p class="h2">Case Duration</p>
|
||
<ul class="space-y-1 text-sm">
|
||
<li><Tag value="MIN" class="!text-neutral-900 !bg-neutral-200 mr-2 !w-10"></Tag>{{ primaryStatData.case_duration.min }}</li>
|
||
<li><Tag value="AVG" class="!text-neutral-900 !bg-neutral-200 mr-2 !w-10"></Tag>{{ primaryStatData.case_duration.average }}</li>
|
||
<li><Tag value="MED" class="!text-neutral-900 !bg-neutral-200 mr-2 !w-10"></Tag>{{ primaryStatData.case_duration.median }}</li>
|
||
<li><Tag value="MAX" class="!text-neutral-900 !bg-neutral-200 mr-2 !w-10"></Tag>{{ primaryStatData.case_duration.max }}</li>
|
||
</ul>
|
||
</div>
|
||
</section>
|
||
<!-- 002 -->
|
||
<section class="w-[204px] box-border pl-4">
|
||
<div class="mb-4">
|
||
<p class="h2">File Name</p>
|
||
<p class="text-sm leading-normal whitespace-nowrap break-keep overflow-hidden text-ellipsis" :title="secondaryStatData.name">{{ secondaryStatData.name }}</p>
|
||
</div>
|
||
<!-- Stats -->
|
||
<ul class="pb-4 border-b border-neutral-300">
|
||
<li>
|
||
<p class="h2">Cases</p>
|
||
<div class="flex justify-between items-center">
|
||
<div class="w-full mr-4">
|
||
<span class="block text-sm">{{ secondaryStatData.cases.count }} / {{ secondaryStatData.cases.total }}</span>
|
||
<ProgressBar :value="secondaryValueTraces" :showValue="false" class="!h-2 !rounded-full my-2 !bg-neutral-300 progressbar-secondary"></ProgressBar>
|
||
</div>
|
||
<span class="block text-secondary text-2xl text-right font-medium basis-28">{{ secondaryStatData.cases.ratio }}%</span>
|
||
</div>
|
||
</li>
|
||
<li>
|
||
<p class="h2">Traces</p>
|
||
<div class="flex justify-between items-center">
|
||
<div class="w-full mr-4">
|
||
<span class="block text-sm">{{ secondaryStatData.traces.count }} / {{ secondaryStatData.traces.total }}</span>
|
||
<ProgressBar :value="secondaryValueTraces" :showValue="false" class="!h-2 !rounded-full my-2 !bg-neutral-300 progressbar-secondary"></ProgressBar>
|
||
</div>
|
||
<span class="block text-secondary text-2xl text-right font-medium basis-28">{{ secondaryStatData.traces.ratio }}%</span>
|
||
</div>
|
||
</li>
|
||
<li>
|
||
<p class="h2">Activity Instances</p>
|
||
<div class="flex justify-between items-center">
|
||
<div class="w-full mr-4">
|
||
<span class="block text-sm">{{ secondaryStatData.task_instances.count }} / {{ secondaryStatData.task_instances.total }}</span>
|
||
<ProgressBar :value="secondaryValueTaskInstances" :showValue="false" class="!h-2 !rounded-full my-2 !bg-neutral-300 progressbar-secondary"></ProgressBar>
|
||
</div>
|
||
<span class="block text-secondary text-2xl text-right font-medium basis-28">{{ secondaryStatData.task_instances.ratio }}%</span>
|
||
</div>
|
||
</li>
|
||
<li>
|
||
<p class="h2">Activities</p>
|
||
<div class="flex justify-between items-center">
|
||
<div class="w-full mr-4">
|
||
<span class="block text-sm">{{ secondaryStatData.tasks.count }} / {{ secondaryStatData.tasks.total }}</span>
|
||
<ProgressBar :value="secondaryValueTasks" :showValue="false" class="!h-2 !rounded-full my-2 !bg-neutral-300 progressbar-secondary"></ProgressBar>
|
||
</div>
|
||
<span class="block text-secondary text-2xl text-right font-medium basis-28">{{ secondaryStatData.tasks.ratio }}%</span>
|
||
</div>
|
||
</li>
|
||
</ul>
|
||
<!-- Log Timeframe -->
|
||
<div class="pt-1 pb-4 border-b border-neutral-300">
|
||
<p class="h2">Log Timeframe</p>
|
||
<div class="space-y-2 text-sm text-center">
|
||
<span class="block">{{ secondaryStatData.started_at }} </span>
|
||
<span class="block">~</span>
|
||
<span class="block"> {{ secondaryStatData.completed_at }}</span>
|
||
</div>
|
||
</div>
|
||
<!-- Case Duration -->
|
||
<div class="pt-1 pb-4">
|
||
<p class="h2">Case Duration</p>
|
||
<ul class="space-y-1 text-sm">
|
||
<li><Tag value="MIN" class="!text-neutral-900 !bg-neutral-200 mr-2 !w-10"></Tag>{{ secondaryStatData.case_duration.min }}</li>
|
||
<li><Tag value="AVG" class="!text-neutral-900 !bg-neutral-200 mr-2 !w-10"></Tag>{{ secondaryStatData.case_duration.average }}</li>
|
||
<li><Tag value="MED" class="!text-neutral-900 !bg-neutral-200 mr-2 !w-10"></Tag>{{ secondaryStatData.case_duration.median }}</li>
|
||
<li><Tag value="MAX" class="!text-neutral-900 !bg-neutral-200 mr-2 !w-10"></Tag>{{ secondaryStatData.case_duration.max }}</li>
|
||
</ul>
|
||
</div>
|
||
</section>
|
||
</div>
|
||
</Sidebar>
|
||
</template>
|
||
<script>
|
||
import CompareStore from '@/stores/compare.js';
|
||
import { getTimeLabel } from '@/module/timeLabel.js';
|
||
import getMoment from 'moment';
|
||
|
||
export default {
|
||
setup() {
|
||
const compareStore = CompareStore();
|
||
|
||
return { compareStore };
|
||
},
|
||
props:{
|
||
sidebarState: {
|
||
type: Boolean,
|
||
require: false,
|
||
},
|
||
},
|
||
data() {
|
||
return {
|
||
primaryValueCases: 0,
|
||
primaryValueTraces: 0,
|
||
primaryValueTaskInstances: 0,
|
||
primaryValueTasks: 0,
|
||
secondaryValueCases: 0,
|
||
secondaryValueTraces: 0,
|
||
secondaryValueTaskInstances: 0,
|
||
secondaryValueTasks: 0,
|
||
primaryStatData: null,
|
||
secondaryStatData: null,
|
||
}
|
||
},
|
||
methods: {
|
||
/**
|
||
* Number to percentage
|
||
* @param {number} val 原始數字
|
||
* @returns {string} 轉換完成的百分比字串
|
||
*/
|
||
getPercentLabel(val){
|
||
if((val * 100).toFixed(1) >= 100) return 100;
|
||
else return parseFloat((val * 100).toFixed(1));
|
||
},
|
||
/**
|
||
* setting stats data
|
||
* @param { object } data fetch API stats data
|
||
* @param { string } fileName file Name
|
||
* @returns { object } primaryStatData | secondaryStatData,回傳 primaryStatData 或 secondaryStatData
|
||
*/
|
||
getStatData(data, fileName) {
|
||
return {
|
||
name: fileName,
|
||
cases: {
|
||
count: data.cases.count.toLocaleString('en-US'),
|
||
total: data.cases.total.toLocaleString('en-US'),
|
||
ratio: this.getPercentLabel(data.cases.ratio)
|
||
},
|
||
traces: {
|
||
count: data.traces.count.toLocaleString('en-US'),
|
||
total: data.traces.total.toLocaleString('en-US'),
|
||
ratio: this.getPercentLabel(data.traces.ratio)
|
||
},
|
||
task_instances: {
|
||
count: data.task_instances.count.toLocaleString('en-US'),
|
||
total: data.task_instances.total.toLocaleString('en-US'),
|
||
ratio: this.getPercentLabel(data.task_instances.ratio)
|
||
},
|
||
tasks: {
|
||
count: data.tasks.count.toLocaleString('en-US'),
|
||
total: data.tasks.total.toLocaleString('en-US'),
|
||
ratio: this.getPercentLabel(data.tasks.ratio)
|
||
},
|
||
started_at: getMoment(data.started_at).format('YYYY.MM.DD HH:mm'),
|
||
completed_at: getMoment(data.completed_at).format('YYYY.MM.DD HH:mm'),
|
||
case_duration: {
|
||
min: getTimeLabel(data.case_duration.min, 2),
|
||
max: getTimeLabel(data.case_duration.max, 2),
|
||
average: getTimeLabel(data.case_duration.average, 2),
|
||
median: getTimeLabel(data.case_duration.median, 2),
|
||
}
|
||
}
|
||
},
|
||
/**
|
||
* Behavior when show
|
||
*/
|
||
show(){
|
||
this.primaryValueCases = this.primaryStatData.cases.ratio;
|
||
this.primaryValueTraces= this.primaryStatData.traces.ratio;
|
||
this.primaryValueTaskInstances = this.primaryStatData.task_instances.ratio;
|
||
this.primaryValueTasks = this.primaryStatData.tasks.ratio;
|
||
this.secondaryValueCases = this.secondaryStatData.cases.ratio;
|
||
this.secondaryValueTraces= this.secondaryStatData.traces.ratio;
|
||
this.secondaryValueTaskInstances = this.secondaryStatData.task_instances.ratio;
|
||
this.secondaryValueTasks = this.secondaryStatData.tasks.ratio;
|
||
},
|
||
/**
|
||
* Behavior when hidden
|
||
*/
|
||
hide(){
|
||
this.primaryValueCases = 0;
|
||
this.primaryValueTraces= 0;
|
||
this.primaryValueTaskInstances = 0;
|
||
this.primaryValueTasks = 0;
|
||
this.secondaryValueCases = 0;
|
||
this.secondaryValueTraces= 0;
|
||
this.secondaryValueTaskInstances = 0;
|
||
this.secondaryValueTasks = 0;
|
||
},
|
||
},
|
||
async mounted() {
|
||
const routeParams = this.$route.params;
|
||
const primaryType = routeParams.primaryType;
|
||
const secondaryType = routeParams.secondaryType;
|
||
const primaryId = routeParams.primaryId;
|
||
const secondaryId = routeParams.secondaryId;
|
||
const primaryData = await this.compareStore.getStateData(primaryType, primaryId);
|
||
const secondaryData = await this.compareStore.getStateData(secondaryType, secondaryId);
|
||
|
||
const primaryFileName = await this.compareStore.getFileName(primaryId)
|
||
const secondaryFileName = await this.compareStore.getFileName(secondaryId)
|
||
this.primaryStatData = await this.getStatData(primaryData, primaryFileName);
|
||
this.secondaryStatData = await this.getStatData(secondaryData, secondaryFileName);
|
||
}
|
||
}
|
||
</script>
|
||
<style scoped>
|
||
:deep(.p-progressbar .p-progressbar-value) {
|
||
background-color: var(--bg-color);
|
||
}
|
||
.progressbar-primary {
|
||
--bg-color: #0099FF;
|
||
}
|
||
.progressbar-secondary {
|
||
--bg-color: #FFAA44;
|
||
}
|
||
</style>
|