Migrate all Vue components from Options API to <script setup>

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-03-06 17:10:06 +08:00
parent a619be7881
commit 3b7b6ae859
61 changed files with 10835 additions and 11750 deletions

View File

@@ -146,128 +146,126 @@
</div>
</Sidebar>
</template>
<script>
<script setup>
import { ref, onMounted } from 'vue';
import { useRoute } from 'vue-router';
import { useCompareStore } from '@/stores/compare';
import { getTimeLabel } from '@/module/timeLabel.js';
import getMoment from 'moment';
export default {
setup() {
const compareStore = useCompareStore();
const props = defineProps({
sidebarState: {
type: Boolean,
require: false,
},
});
return { compareStore };
},
props:{
sidebarState: {
type: Boolean,
require: false,
const route = useRoute();
const compareStore = useCompareStore();
const primaryValueCases = ref(0);
const primaryValueTraces = ref(0);
const primaryValueTaskInstances = ref(0);
const primaryValueTasks = ref(0);
const secondaryValueCases = ref(0);
const secondaryValueTraces = ref(0);
const secondaryValueTaskInstances = ref(0);
const secondaryValueTasks = ref(0);
const primaryStatData = ref(null);
const secondaryStatData = ref(null);
/**
* Number to percentage
* @param {number} val 原始數字
* @returns {string} 轉換完成的百分比字串
*/
const 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
*/
const getStatData = (data, fileName) => {
return {
name: fileName,
cases: {
count: data.cases.count.toLocaleString('en-US'),
total: data.cases.total.toLocaleString('en-US'),
ratio: getPercentLabel(data.cases.ratio)
},
},
data() {
return {
primaryValueCases: 0,
primaryValueTraces: 0,
primaryValueTaskInstances: 0,
primaryValueTasks: 0,
secondaryValueCases: 0,
secondaryValueTraces: 0,
secondaryValueTaskInstances: 0,
secondaryValueTasks: 0,
primaryStatData: null,
secondaryStatData: null,
traces: {
count: data.traces.count.toLocaleString('en-US'),
total: data.traces.total.toLocaleString('en-US'),
ratio: getPercentLabel(data.traces.ratio)
},
task_instances: {
count: data.task_instances.count.toLocaleString('en-US'),
total: data.task_instances.total.toLocaleString('en-US'),
ratio: getPercentLabel(data.task_instances.ratio)
},
tasks: {
count: data.tasks.count.toLocaleString('en-US'),
total: data.tasks.total.toLocaleString('en-US'),
ratio: 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),
}
},
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);
}
}
};
/**
* Behavior when show
*/
const show = () => {
primaryValueCases.value = primaryStatData.value.cases.ratio;
primaryValueTraces.value = primaryStatData.value.traces.ratio;
primaryValueTaskInstances.value = primaryStatData.value.task_instances.ratio;
primaryValueTasks.value = primaryStatData.value.tasks.ratio;
secondaryValueCases.value = secondaryStatData.value.cases.ratio;
secondaryValueTraces.value = secondaryStatData.value.traces.ratio;
secondaryValueTaskInstances.value = secondaryStatData.value.task_instances.ratio;
secondaryValueTasks.value = secondaryStatData.value.tasks.ratio;
};
/**
* Behavior when hidden
*/
const hide = () => {
primaryValueCases.value = 0;
primaryValueTraces.value = 0;
primaryValueTaskInstances.value = 0;
primaryValueTasks.value = 0;
secondaryValueCases.value = 0;
secondaryValueTraces.value = 0;
secondaryValueTaskInstances.value = 0;
secondaryValueTasks.value = 0;
};
onMounted(async () => {
const routeParams = route.params;
const primaryType = routeParams.primaryType;
const secondaryType = routeParams.secondaryType;
const primaryId = routeParams.primaryId;
const secondaryId = routeParams.secondaryId;
const primaryData = await compareStore.getStateData(primaryType, primaryId);
const secondaryData = await compareStore.getStateData(secondaryType, secondaryId);
const primaryFileName = await compareStore.getFileName(primaryId)
const secondaryFileName = await compareStore.getFileName(secondaryId)
primaryStatData.value = await getStatData(primaryData, primaryFileName);
secondaryStatData.value = await getStatData(secondaryData, secondaryFileName);
});
</script>
<style scoped>
:deep(.p-progressbar .p-progressbar-value) {