1- import { ProgramRunner } from "../../programs" ;
1+ import { ProgramRunner , RunningProgram } from "../../programs" ;
22import { Device } from "../../types/devices" ;
33import { DeviceType } from "../../types/devices/device" ;
44import { ViewGraph } from "../../types/graphs/viewgraph" ;
55import { RemoveDeviceMove } from "../../types/undo-redo" ;
6- import { urManager } from "../../types/viewportManager" ;
6+ import { refreshElement , urManager } from "../../types/viewportManager" ;
77import {
88 createDropdown ,
9- createToggleTable ,
109 createRightBarButton ,
10+ createTable ,
11+ createRoutingTable ,
1112} from "../right_bar" ;
1213import { ProgramInfo } from "./program_info" ;
1314import { StyledInfo } from "./styled_info" ;
@@ -58,7 +59,7 @@ export class DeviceInfo extends StyledInfo {
5859 }
5960
6061 // First argument is to avoid a circular dependency
61- addProgramList ( runner : ProgramRunner , programs : ProgramInfo [ ] ) {
62+ addProgramRunner ( runner : ProgramRunner , programs : ProgramInfo [ ] ) {
6263 const programOptions = programs . map ( ( { name } , i ) => {
6364 return { value : i . toString ( ) , text : name } ;
6465 } ) ;
@@ -78,10 +79,22 @@ export class DeviceInfo extends StyledInfo {
7879 console . log ( "Started program: " , name ) ;
7980 const inputs = selectedProgram . getInputValues ( ) ;
8081 runner . addRunningProgram ( name , inputs ) ;
82+ refreshElement ( ) ;
8183 } ) ,
8284 ) ;
8385 }
8486
87+ addRunningProgramsList (
88+ runner : ProgramRunner ,
89+ runningPrograms : RunningProgram [ ] ,
90+ ) {
91+ if ( runningPrograms . length === 0 ) {
92+ return ;
93+ }
94+ const table = createProgramsTable ( runner , runningPrograms ) ;
95+ this . inputFields . push ( table ) ;
96+ }
97+
8598 addRoutingTable ( viewgraph : ViewGraph , deviceId : number ) {
8699 const entries = viewgraph . getRoutingTable ( deviceId ) ;
87100
@@ -91,7 +104,7 @@ export class DeviceInfo extends StyledInfo {
91104 `eth${ entry . iface } ` ,
92105 ] ) ;
93106
94- const dynamicTable = createToggleTable (
107+ const dynamicTable = createRoutingTable (
95108 "Routing Table" ,
96109 [ "IP" , "Mask" , "Interface" ] ,
97110 rows ,
@@ -121,3 +134,26 @@ function getTypeName(device: Device): string {
121134 return "Switch" ;
122135 }
123136}
137+
138+ function createProgramsTable (
139+ runner : ProgramRunner ,
140+ runningPrograms : RunningProgram [ ] ,
141+ ) {
142+ const onDelete = ( row : number ) => {
143+ const { pid } = runningPrograms [ row ] ;
144+ runner . removeRunningProgram ( pid ) ;
145+ refreshElement ( ) ;
146+ return true ;
147+ } ;
148+ const rows = runningPrograms . map ( ( program ) => [
149+ program . pid . toString ( ) ,
150+ program . name ,
151+ JSON . stringify ( program . inputs ) ,
152+ ] ) ;
153+ const headers = [ "PID" , "Name" , "Inputs" ] ;
154+ // TODO: make table editable?
155+ const table = createTable ( headers , rows , { onDelete } ) ;
156+ table . id = "running-programs-table" ;
157+ table . classList . add ( "right-bar-table" ) ;
158+ return table ;
159+ }
0 commit comments