22<!-- Copyright © 2025 André Santos -->
33
44<script setup lang="ts">
5+ // Arc diagram might be a better view for this type of information
6+ // https://observablehq.com/@d3/arc-diagram
7+
58// Imports ---------------------------------------------------------------------
69
710import { computed , ref , watch } from ' vue'
@@ -27,7 +30,7 @@ const loading = ref<boolean>(false)
2730const launchFile = ref <LaunchFile | null >(null )
2831const error = ref <string | null >(null )
2932
30- const selectedAction = ref <LaunchActionId >( ' ' )
33+ const selectedAction = ref <LaunchAction | null >( null )
3134const currentDependencies = computed <Set <LaunchActionId >>(getDependencies )
3235const dependencyGraph = ref <NodeLinkGraph >(getDependencyGraph ())
3336
@@ -44,7 +47,7 @@ async function fetchData(id: LaunchId | LaunchId[]): Promise<void> {
4447 id = id [0 ]
4548 }
4649 error .value = launchFile .value = null
47- selectedAction .value = ' '
50+ selectedAction .value = null
4851 loading .value = true
4952
5053 try {
@@ -59,11 +62,11 @@ async function fetchData(id: LaunchId | LaunchId[]): Promise<void> {
5962 }
6063}
6164
62- function onSelectAction(id : LaunchActionId ): void {
63- if (selectedAction .value === id ) {
64- selectedAction .value = ' '
65+ function onSelectAction(action : LaunchAction ): void {
66+ if (selectedAction .value != null && selectedAction . value . id === action . id ) {
67+ selectedAction .value = null
6568 } else {
66- selectedAction .value = id
69+ selectedAction .value = action
6770 }
6871 dependencyGraph .value = getDependencyGraph ()
6972}
@@ -74,17 +77,18 @@ function getDependencyGraph(): NodeLinkGraph {
7477 const nodes: GraphNodeDatum [] = []
7578 const links: GraphLinkDatum [] = []
7679 if (launchFile .value != null ) {
77- if (selectedAction .value !== ' ' ) {
80+ if (selectedAction .value != null ) {
7881 const actions: Record <LaunchActionId , LaunchAction > = {}
7982 for (const action of launchFile .value .actions ) {
8083 actions [action .id ] = action
8184 }
82- let action = actions [ selectedAction .value ]
85+ let action = selectedAction .value
8386 nodes .push ({
8487 id: action .id ,
8588 name: action .name ,
8689 group: action .type ,
87- focus: true ,
90+ level: 2 ,
91+ dark: action .dependencies .length > 0 ,
8892 condition: ' ' ,
8993 })
9094 for (const target of action .dependencies ) {
@@ -94,15 +98,27 @@ function getDependencyGraph(): NodeLinkGraph {
9498 const deps: LaunchActionId [] = action .dependencies .slice ()
9599 while (deps .length > 0 ) {
96100 action = actions [deps .pop ()! ]
97- nodes .push ({ id: action .id , name: action .name , group: action .type , condition: ' ' })
101+ nodes .push ({
102+ id: action .id ,
103+ name: action .name ,
104+ group: action .type ,
105+ dark: action .dependencies .length > 0 ,
106+ condition: ' ' ,
107+ })
98108 for (const target of action .dependencies ) {
99109 links .push ({ source: action .id , target , value: 2 })
100110 deps .push (target )
101111 }
102112 }
103113 } else {
104114 for (const action of launchFile .value .actions ) {
105- nodes .push ({ id: action .id , name: action .name , group: action .type , condition: ' ' })
115+ nodes .push ({
116+ id: action .id ,
117+ name: action .name ,
118+ group: action .type ,
119+ dark: action .dependencies .length > 0 ,
120+ condition: ' ' ,
121+ })
106122 for (const target of action .dependencies ) {
107123 links .push ({ source: action .id , target , value: 2 })
108124 }
@@ -113,8 +129,8 @@ function getDependencyGraph(): NodeLinkGraph {
113129}
114130
115131function getDependencies(): Set <LaunchActionId > {
116- const id = selectedAction .value
117- if ( id !== ' ' && launchFile .value != null ) {
132+ if ( launchFile . value != null && selectedAction .value != null ) {
133+ const id = selectedAction .value . id
118134 for (const action of launchFile .value .actions ) {
119135 if (action .id === id ) {
120136 return new Set (action .dependencies )
@@ -141,11 +157,25 @@ function getDependencies(): Set<LaunchActionId> {
141157 <LaunchActionList
142158 v-if =" launchFile.actions.length > 0"
143159 :actions =" launchFile.actions"
144- :selected-action =" selectedAction"
160+ :selected-action =" selectedAction?.id "
145161 :current-dependencies =" currentDependencies"
146162 @select =" onSelectAction"
147163 />
148164 <p v-else >There are no launch actions.</p >
165+
166+ <div v-if =" selectedAction != null" class =" panel details" >
167+ <h4 >
168+ <code class =" tag" >{{ selectedAction.type }}</code >
169+ {{ selectedAction.name }}
170+ </h4 >
171+ <p v-if =" selectedAction.dependencies.length > 0" >
172+ Depends on:
173+ <template v-for =" (dep , i ) in selectedAction .dependencies " :key =" dep " >
174+ <template v-if =" i > 0 " >, </template >
175+ <code >{{ dep }}</code >
176+ </template >
177+ </p >
178+ </div >
149179 </div >
150180
151181 <div class =" right-side" >
@@ -178,6 +208,12 @@ function getDependencies(): Set<LaunchActionId> {
178208 vertical-align : middle ;
179209}
180210
211+ .launch-view > .left-side > .details {
212+ flex : 0 0 auto ;
213+ padding : 0 0.5rem ;
214+ max-height : 4rem ;
215+ }
216+
181217.launch-view > .right-side {
182218 height : 100% ;
183219 flex : 2 0 0 ;
0 commit comments