-
Notifications
You must be signed in to change notification settings - Fork 4
/
Copy pathResultsList.vue
116 lines (106 loc) · 2.62 KB
/
ResultsList.vue
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
<template>
<div class="results">
<h2>Results</h2>
<ul>
<li v-for="result in results" :key="result" @click="loadResult(result)" :class="['result-item', { 'selected': result === selectedResult }]">
<i class="calendar-icon"></i>
{{ formatResult(result) }}
</li>
</ul>
</div>
</template>
<script>
import resultsData from '@/assets/results.json';
export default {
data() {
return {
results: resultsData.results.sort((a, b) => b.localeCompare(a)),
selectedResult: null
};
},
created() {
this.updateSelectedResult();
},
watch: {
'$route.params.result': 'updateSelectedResult'
},
methods: {
loadResult(result) {
const targetRoute = `/result/${result}`;
if (this.$route.path !== targetRoute) {
this.selectedResult = result;
this.$router.push(targetRoute).catch(err => {
if (err.name !== 'NavigationDuplicated') {
throw err;
}
});
}
},
updateSelectedResult() {
if (this.$route.params.result) {
this.selectedResult = this.$route.params.result;
} else if (this.results.length > 0) {
this.selectedResult = this.results[0];
this.$router.push(`/result/${this.selectedResult}`).catch(err => {
if (err.name !== 'NavigationDuplicated') {
throw err;
}
});
}
},
formatResult(result) {
const year = result.substring(0, 4);
const month = result.substring(4, 6);
const day = result.substring(6, 8);
const hour = result.substring(9, 11);
const minute = result.substring(11, 13);
const second = result.substring(13, 15);
return `${year}-${month}-${day} ${hour}:${minute}:${second}`;
}
}
};
</script>
<style scoped>
.results {
background-color: #f8f9fa;
}
.results h2 {
font-size: 1.5em;
margin-bottom: 10px;
margin-top: 0;
color: #343a40;
}
.results ul {
list-style-type: none;
padding: 0;
}
.results .result-item {
display: flex;
align-items: center;
padding: 10px;
margin-bottom: 10px;
background-color: #ffffff;
border-radius: 5px;
cursor: pointer;
transition: background-color 0.3s, transform 0.3s;
}
.results .result-item:hover {
background-color: #e9ecef;
transform: translateX(5px);
}
.results .result-item:active {
background-color: #dee2e6;
}
.results .result-item.selected {
background-color: #d4edda;
border-left: 5px solid #28a745;
}
.results .calendar-icon {
margin-right: 10px;
width: 16px;
height: 16px;
background-image: url('../assets/calendar.svg');
background-size: contain;
background-repeat: no-repeat;
}
</style>