Skip to content

Commit d12a073

Browse files
committed
Merge remote-tracking branch 'upstream/master' into graph-group-collapse
2 parents ba4398a + a246580 commit d12a073

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

56 files changed

+2369
-1452
lines changed

.mailmap

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,3 +25,5 @@ Jamie Allen <[email protected]> JAllen42
2525
Jamie Allen <[email protected]>
2626
Christopher Bennett <[email protected]> ChrisPaulBennett
2727
Mark Dawson <[email protected]> Mark Dawson <[email protected]>
28+
Harleen Kaur <[email protected]> harleenkaur2003 <[email protected]>
29+

CONTRIBUTING.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,7 @@ below.
6161
- Christopher Bennett
6262
- Mark Dawson
6363
- Min RK
64+
- Harleen Kaur
6465
<!-- end-shortlog -->
6566

6667
(All contributors are identifiable with email addresses in the git version

changes.d/2176.feat.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Workspace tab layout is now remembered beyond the current browser session.

changes.d/2222.feat.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
The Edit Runtime form now supports multi-line environment variables.

package.json

Lines changed: 19 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -25,49 +25,49 @@
2525
},
2626
"dependencies": {
2727
"@apollo/client": "3.13.8",
28-
"@hpcc-js/wasm": "2.23.0",
28+
"@hpcc-js/wasm": "2.24.3",
2929
"@lumino/default-theme": "2.1.10",
3030
"@lumino/widgets": "2.7.1",
3131
"@mdi/js": "7.4.47",
32-
"@vueuse/core": "13.3.0",
32+
"@vueuse/core": "13.5.0",
3333
"apexcharts": "3.54.1",
34-
"axios": "1.9.0",
34+
"axios": "1.10.0",
3535
"dedent": "1.6.0",
3636
"enumify": "2.0.0",
37-
"graphiql": "4.1.1",
37+
"graphiql": "4.1.2",
3838
"graphql": "16.11.0",
3939
"graphql-tag": "2.12.6",
4040
"lodash-es": "4.17.21",
4141
"markdown-it": "14.1.0",
4242
"mitt": "3.0.1",
4343
"nprogress": "1.0.0-1",
44-
"preact": "10.26.8",
45-
"simple-icons": "15.1.0",
44+
"preact": "10.26.9",
45+
"simple-icons": "15.2.0",
4646
"subscriptions-transport-ws": "0.11.0",
4747
"svg-pan-zoom": "3.6.2",
48-
"vue": "3.5.16",
49-
"vue-i18n": "11.1.3",
48+
"vue": "3.5.17",
49+
"vue-i18n": "11.1.5",
5050
"vue-router": "4.5.1",
5151
"vue-the-mask": "0.11.1",
5252
"vue3-apexcharts": "1.8.0",
53-
"vuetify": "3.8.8",
53+
"vuetify": "3.9.0",
5454
"vuex": "4.1.0"
5555
},
5656
"devDependencies": {
57-
"@cypress/code-coverage": "3.14.4",
58-
"@vitejs/plugin-react": "4.5.1",
57+
"@cypress/code-coverage": "3.14.5",
58+
"@vitejs/plugin-react": "4.6.0",
5959
"@vitejs/plugin-vue": "5.2.4",
60-
"@vitest/coverage-istanbul": "3.2.2",
60+
"@vitest/coverage-istanbul": "3.2.4",
6161
"@vue/test-utils": "2.4.6",
62-
"concurrently": "9.1.2",
62+
"concurrently": "9.2.0",
6363
"cross-fetch": "4.1.0",
64-
"cypress": "14.4.1",
64+
"cypress": "14.5.1",
6565
"cypress-vite": "1.6.0",
6666
"eslint": "8.57.1",
6767
"eslint-config-standard": "17.1.0",
6868
"eslint-plugin-compat": "4.2.0",
6969
"eslint-plugin-cypress": "2.15.2",
70-
"eslint-plugin-import": "2.31.0",
70+
"eslint-plugin-import": "2.32.0",
7171
"eslint-plugin-n": "16.6.2",
7272
"eslint-plugin-no-only-tests": "3.3.0",
7373
"eslint-plugin-promise": "6.6.0",
@@ -80,14 +80,14 @@
8080
"json-server": "0.17.4",
8181
"nodemon": "3.1.10",
8282
"nyc": "17.1.0",
83-
"sass-embedded": "1.89.0",
84-
"sinon": "20.0.0",
83+
"sass-embedded": "1.89.2",
84+
"sinon": "21.0.0",
8585
"standard": "17.1.2",
8686
"vite": "6.3.5",
8787
"vite-plugin-eslint": "1.8.1",
88-
"vite-plugin-istanbul": "7.0.0",
88+
"vite-plugin-istanbul": "7.1.0",
8989
"vite-plugin-vuetify": "2.1.1",
90-
"vitest": "3.2.2"
90+
"vitest": "3.2.4"
9191
},
9292
"peerDependenciesMeta": {
9393
"react": {

src/components/cylc/Drawer.vue

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,7 @@ import Header from '@/components/cylc/Header.vue'
8787
import Workflows from '@/views/Workflows.vue'
8888
import { mdiHome, mdiInformationOutline } from '@mdi/js'
8989
import pkg from '@/../package.json'
90-
import { when } from '@/utils'
90+
import { when } from '@/utils/reactivity'
9191
import { useDrawer } from '@/utils/toolbar'
9292
9393
export const initialWidth = 260

src/components/cylc/EventChip.vue

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
<!--
2+
Copyright (C) NIWA & British Crown (Met Office) & Contributors.
3+
4+
This program is free software: you can redistribute it and/or modify
5+
it under the terms of the GNU General Public License as published by
6+
the Free Software Foundation, either version 3 of the License, or
7+
(at your option) any later version.
8+
9+
This program is distributed in the hope that it will be useful,
10+
but WITHOUT ANY WARRANTY; without even the implied warranty of
11+
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12+
GNU General Public License for more details.
13+
14+
You should have received a copy of the GNU General Public License
15+
along with this program. If not, see <http://www.gnu.org/licenses/>.
16+
-->
17+
18+
<template>
19+
<v-chip size="x-small" v-bind="props">{{ level }}</v-chip>
20+
</template>
21+
22+
<script>
23+
export default {
24+
name: 'LogLevelChip',
25+
26+
props: {
27+
level: {
28+
type: String,
29+
required: true,
30+
},
31+
},
32+
33+
computed: {
34+
props () {
35+
if (this.level === 'CRITICAL') {
36+
return { color: 'red', variant: 'flat' }
37+
}
38+
if (this.level === 'ERROR') {
39+
return { color: 'red-darken-4', variant: 'flat' }
40+
}
41+
if (this.level === 'WARNING') {
42+
return { color: 'amber-darken-4', variant: 'flat' }
43+
}
44+
if (this.level === 'INFO') {
45+
return { color: 'grey', variant: 'flat' }
46+
}
47+
return { color: 'grey', variant: 'outlined' }
48+
}
49+
}
50+
}
51+
</script>

src/components/cylc/Info.vue

Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,42 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
8484
</v-expansion-panel-text>
8585
</v-expansion-panel>
8686

87+
<v-expansion-panel class="run-mode-panel">
88+
<v-expansion-panel-title color="blue-grey-lighten-2">
89+
Run Mode
90+
</v-expansion-panel-title>
91+
<v-expansion-panel-text>
92+
<v-icon>{{ runModeIcon }}</v-icon> {{ runMode }}
93+
</v-expansion-panel-text>
94+
</v-expansion-panel>
95+
96+
<v-expansion-panel
97+
v-if="xtriggers.length"
98+
class="xtriggers-panel"
99+
>
100+
<v-expansion-panel-title color="blue-grey-lighten-1">
101+
Xtriggers
102+
</v-expansion-panel-title>
103+
<v-expansion-panel-text>
104+
<v-table density="compact">
105+
<thead>
106+
<tr>
107+
<th>Label</th>
108+
<th>ID</th>
109+
<th>Is satisfied</th>
110+
</tr>
111+
</thead>
112+
<tbody>
113+
<tr v-for="xt in xtriggers" :key="xt.id">
114+
<td>{{ xt.label }}</td>
115+
<td>{{ xt.id }}</td>
116+
<td><v-icon>{{ xt.satisfactionIcon }}</v-icon></td>
117+
</tr>
118+
</tbody>
119+
</v-table>
120+
</v-expansion-panel-text>
121+
</v-expansion-panel>
122+
87123
<!-- The prereqs -->
88124
<v-expansion-panel class="prerequisites-panel">
89125
<v-expansion-panel-title color="blue-grey-lighten-2">
@@ -169,6 +205,16 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
169205
import { useJobTheme } from '@/composables/localStorage'
170206
import GraphNode from '@/components/cylc/GraphNode.vue'
171207
import { formatCompletion } from '@/utils/outputs'
208+
import {
209+
mdiSkipForward,
210+
mdiChatQuestion,
211+
mdiGhostOutline,
212+
mdiPlay,
213+
mdiDramaMasks,
214+
mdiCheckboxOutline,
215+
mdiCheckboxBlankOutline
216+
} from '@mdi/js'
217+
import { cloneDeep } from 'lodash-es'
172218
173219
export default {
174220
name: 'InfoComponent',
@@ -226,6 +272,47 @@ export default {
226272
completion () {
227273
// Task output completion expression stuff.
228274
return this.task?.node?.runtime.completion
275+
},
276+
277+
runModeIcon () {
278+
// Task Run Mode:
279+
if (this.task?.node?.runtime.runMode === 'Skip') {
280+
return mdiSkipForward
281+
} else if (this.task?.node?.runtime.runMode === 'Live') {
282+
return mdiPlay
283+
} else if (this.task?.node?.runtime.runMode === 'Simulation') {
284+
return mdiGhostOutline
285+
} else if (this.task?.node?.runtime.runMode === 'Dummy') {
286+
return mdiDramaMasks
287+
}
288+
return mdiChatQuestion
289+
},
290+
291+
runMode () {
292+
// Task Run Mode:
293+
return this.task?.node?.runtime.runMode
294+
},
295+
296+
xtriggers () {
297+
const xtriggers = this.task?.node?.xtriggers?.map((item) => {
298+
const xtrigger = cloneDeep(item)
299+
xtrigger.satisfactionIcon = xtrigger.satisfied ? mdiCheckboxOutline : mdiCheckboxBlankOutline
300+
// Extract the trigger time from the ID
301+
// Since we've created this date from a Unix timestamp, we can safely assume it is in UTC:
302+
xtrigger.id = xtrigger.id.replace(
303+
/trigger_time=(?<unixTime>[0-9.]+)/,
304+
(match, p1) => `trigger_time=${new Date(p1 * 1000).toISOString().slice(0, -5)}Z`
305+
)
306+
return xtrigger
307+
})
308+
// Sort the xtriggers by label, then by ID:
309+
xtriggers.sort(function (a, b) {
310+
if (a.label === b.label) {
311+
return a.id > b.id ? 1 : -1
312+
}
313+
return a.label > b.label ? 1 : -1
314+
})
315+
return xtriggers
229316
}
230317
231318
},

src/components/cylc/WarningIcon.vue

Lines changed: 47 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -17,39 +17,67 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
1717

1818
<!--
1919
WarningIcon - A dismiss-able warning icon
20+
21+
states:
22+
* no warnings: grey + translucent
23+
* new warnings: yellow
24+
* warnings dismissed: grey
2025
-->
2126

2227
<template>
2328
<span
2429
class="c-warn"
25-
style="display:inline-block; vertical-align:middle"
30+
:class="{'active': workflow.node.warningActive}"
31+
style="display: inline-block;"
2632
>
2733
<v-tooltip
2834
:activator="null"
2935
location="bottom"
30-
:disabled="!message"
36+
:disabled="!workflow.node.logRecords?.length"
3137
>
3238
<template
3339
v-slot:activator="{ props }"
3440
>
41+
<!-- NOTE: the click.prevent suppresses router navigation -->
3542
<svg
3643
viewBox="0 0 100 100"
3744
v-bind="props"
3845
@click="deactivate"
46+
@click.prevent
47+
style="
48+
vertical-align: middle;
49+
cursor: pointer;
50+
"
51+
:style="[workflow.node.logRecords?.length ? {opacity: 1} : {opacity: 0.3}]"
3952
>
4053
<path
41-
:d="path()"
42-
:stroke-width="strokeWidth()"
43-
v-bind:class="{'active': active}"
54+
:d="$options.path"
55+
:stroke-width="$options.strokeWidth"
56+
v-bind:class="{'active': workflow.node.warningActive}"
4457
/>
4558
</svg>
4659
</template>
47-
<span>{{ message }}</span>
60+
Recent warnings (click to dismiss):
61+
<table>
62+
<tr
63+
v-for="(event, index) in (workflow.node.logRecords || []).slice().reverse()"
64+
:key="index"
65+
>
66+
<td style="padding-right: 0.5em; vertical-align: top;">
67+
<EventChip :level="event.level" />
68+
</td><td>
69+
<span>{{ event.message }}</span>
70+
</td>
71+
</tr>
72+
</table>
4873
</v-tooltip>
4974
</span>
5075
</template>
5176

5277
<script>
78+
import EventChip from '@/components/cylc/EventChip.vue'
79+
import { store } from '@/store/index'
80+
5381
/* stuff we want to do once, when the component is loaded, rather than
5482
* every time it is used. */
5583
// stroke
@@ -85,34 +113,25 @@ function pathJoin (list) {
85113
}
86114
87115
export default {
88-
name: 'Warning',
89-
data: function () {
90-
return {
91-
active: this.startActive
92-
}
116+
name: 'WarningIcon',
117+
118+
components: {
119+
EventChip,
93120
},
121+
94122
props: {
95-
message: {
96-
type: String,
97-
required: false
98-
},
99-
startActive: {
100-
type: Boolean,
101-
required: false
123+
workflow: {
124+
required: true,
102125
}
103126
},
104-
methods: {
105-
path () {
106-
return PATH
107-
},
108127
109-
strokeWidth () {
110-
return sw
128+
methods: {
129+
deactivate () {
130+
store.commit('workflows/UPDATE', { id: this.workflow.id, warningActive: false })
111131
},
132+
},
112133
113-
deactivate () {
114-
this.active = false
115-
}
116-
}
134+
strokeWidth: sw,
135+
path: PATH,
117136
}
118137
</script>

0 commit comments

Comments
 (0)