@@ -17,7 +17,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
17
17
18
18
<template >
19
19
<v-data-table
20
- :headers =" $options. headers"
20
+ :headers =" headers"
21
21
:items =" tasks"
22
22
item-value =" task.id"
23
23
multi-sort
@@ -62,7 +62,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
62
62
}"
63
63
>
64
64
<v-icon
65
- :icon =" $options. icons.mdiChevronDown"
65
+ :icon =" icons.mdiChevronDown"
66
66
size =" large"
67
67
/>
68
68
</v-btn >
@@ -95,17 +95,21 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
95
95
</tr >
96
96
</template >
97
97
<template v-slot :bottom >
98
- <v-data-table-footer :itemsPerPageOptions =" $options. itemsPerPageOptions" />
98
+ <v-data-table-footer :itemsPerPageOptions =" itemsPerPageOptions" />
99
99
</template >
100
100
</v-data-table >
101
101
</template >
102
102
103
103
<script >
104
+ import { ref , watch } from ' vue'
104
105
import Task from ' @/components/cylc/Task.vue'
105
106
import Job from ' @/components/cylc/Job.vue'
106
107
import { mdiChevronDown } from ' @mdi/js'
107
108
import { DEFAULT_COMPARATOR } from ' @/components/cylc/common/sort'
108
- import { datetimeComparator } from ' @/components/cylc/table/sort'
109
+ import {
110
+ datetimeComparator ,
111
+ numberComparator ,
112
+ } from ' @/components/cylc/table/sort'
109
113
import { dtMean } from ' @/utils/tasks'
110
114
import { useCyclePointsOrderDesc } from ' @/composables/localStorage'
111
115
import {
@@ -150,87 +154,104 @@ export default {
150
154
151
155
const itemsPerPage = useInitialOptions (' itemsPerPage' , { props, emit }, 50 )
152
156
157
+ const headers = ref ([
158
+ {
159
+ title: ' Task' ,
160
+ key: ' task.name' ,
161
+ sortable: true ,
162
+ sortFunc: DEFAULT_COMPARATOR
163
+ },
164
+ {
165
+ title: ' Jobs' ,
166
+ key: ' data-table-expand' ,
167
+ sortable: false
168
+ },
169
+ {
170
+ title: ' Cycle Point' ,
171
+ key: ' task.tokens.cycle' ,
172
+ sortable: true ,
173
+ sortFunc: DEFAULT_COMPARATOR ,
174
+ },
175
+ {
176
+ title: ' Platform' ,
177
+ key: ' latestJob.node.platform' ,
178
+ sortable: true ,
179
+ sortFunc: DEFAULT_COMPARATOR ,
180
+ },
181
+ {
182
+ title: ' Job Runner' ,
183
+ key: ' latestJob.node.jobRunnerName' ,
184
+ sortable: true ,
185
+ sortFunc: DEFAULT_COMPARATOR ,
186
+ },
187
+ {
188
+ title: ' Job ID' ,
189
+ key: ' latestJob.node.jobId' ,
190
+ sortable: true ,
191
+ sortFunc: DEFAULT_COMPARATOR ,
192
+ },
193
+ {
194
+ title: ' Submit' ,
195
+ key: ' latestJob.node.submittedTime' ,
196
+ sortable: true ,
197
+ sortFunc: datetimeComparator,
198
+ },
199
+ {
200
+ title: ' Start' ,
201
+ key: ' latestJob.node.startedTime' ,
202
+ sortable: true ,
203
+ sortFunc: datetimeComparator,
204
+ },
205
+ {
206
+ title: ' Finish' ,
207
+ key: ' latestJob.node.finishedTime' ,
208
+ sortable: true ,
209
+ sortFunc: datetimeComparator,
210
+ },
211
+ {
212
+ title: ' Run Time' ,
213
+ key: ' task.node.task.meanElapsedTime' ,
214
+ sortable: true ,
215
+ sortFunc: numberComparator,
216
+ },
217
+ ])
218
+
219
+ // Ensure that whenever a sort order changes, empty/nullish values are
220
+ // always sorted last regardless.
221
+ watch (
222
+ sortBy,
223
+ (val ) => {
224
+ for (const { key , order } of val) {
225
+ const header = headers .value .find ((x ) => x .key === key)
226
+ header .sort = (a , b ) => {
227
+ if (! a && ! b) return 0
228
+ if (! a) return order === ' asc' ? 1 : - 1
229
+ if (! b) return order === ' asc' ? - 1 : 1
230
+ return header .sortFunc (a, b)
231
+ }
232
+ }
233
+ },
234
+ { deep: true , immediate: true }
235
+ )
236
+
153
237
return {
154
238
dtMean,
155
239
itemsPerPage,
156
240
page,
157
241
sortBy,
242
+ headers,
243
+ icons: {
244
+ mdiChevronDown
245
+ },
246
+ itemsPerPageOptions: [
247
+ { value: 10 , title: ' 10' },
248
+ { value: 20 , title: ' 20' },
249
+ { value: 50 , title: ' 50' },
250
+ { value: 100 , title: ' 100' },
251
+ { value: 200 , title: ' 200' },
252
+ { value: - 1 , title: ' All' },
253
+ ],
158
254
}
159
255
},
160
-
161
- headers: [
162
- {
163
- title: ' Task' ,
164
- key: ' task.name' ,
165
- sortable: true ,
166
- sort: DEFAULT_COMPARATOR
167
- },
168
- {
169
- title: ' Jobs' ,
170
- key: ' data-table-expand' ,
171
- sortable: false
172
- },
173
- {
174
- title: ' Cycle Point' ,
175
- key: ' task.tokens.cycle' ,
176
- sortable: true ,
177
- sort : (a , b ) => DEFAULT_COMPARATOR (String (a ?? ' ' ), String (b ?? ' ' ))
178
- },
179
- {
180
- title: ' Platform' ,
181
- key: ' latestJob.node.platform' ,
182
- sortable: true ,
183
- sort : (a , b ) => DEFAULT_COMPARATOR (a ?? ' ' , b ?? ' ' )
184
- },
185
- {
186
- title: ' Job Runner' ,
187
- key: ' latestJob.node.jobRunnerName' ,
188
- sortable: true ,
189
- sort : (a , b ) => DEFAULT_COMPARATOR (a ?? ' ' , b ?? ' ' )
190
- },
191
- {
192
- title: ' Job ID' ,
193
- key: ' latestJob.node.jobId' ,
194
- sortable: true ,
195
- sort : (a , b ) => DEFAULT_COMPARATOR (a ?? ' ' , b ?? ' ' )
196
- },
197
- {
198
- title: ' Submit' ,
199
- key: ' latestJob.node.submittedTime' ,
200
- sortable: true ,
201
- sort : (a , b ) => datetimeComparator (a ?? ' ' , b ?? ' ' )
202
- },
203
- {
204
- title: ' Start' ,
205
- key: ' latestJob.node.startedTime' ,
206
- sortable: true ,
207
- sort : (a , b ) => datetimeComparator (a ?? ' ' , b ?? ' ' )
208
- },
209
- {
210
- title: ' Finish' ,
211
- key: ' latestJob.node.finishedTime' ,
212
- sortable: true ,
213
- sort : (a , b ) => datetimeComparator (a ?? ' ' , b ?? ' ' )
214
- },
215
- {
216
- title: ' Run Time' ,
217
- key: ' task.node.task.meanElapsedTime' ,
218
- sortable: true ,
219
- sort : (a , b ) => parseInt (a ?? 0 ) - parseInt (b ?? 0 )
220
- },
221
- ],
222
-
223
- icons: {
224
- mdiChevronDown
225
- },
226
-
227
- itemsPerPageOptions: [
228
- { value: 10 , title: ' 10' },
229
- { value: 20 , title: ' 20' },
230
- { value: 50 , title: ' 50' },
231
- { value: 100 , title: ' 100' },
232
- { value: 200 , title: ' 200' },
233
- { value: - 1 , title: ' All' }
234
- ]
235
256
}
236
257
</script >
0 commit comments