11import * as React from "react" ;
2- import { useCallback , useState } from "react" ;
2+ import { useCallback , useMemo , useState } from "react" ;
33import { Method } from "../../model-editor/method" ;
44import { ModeledMethod } from "../../model-editor/modeled-method" ;
55import { styled } from "styled-components" ;
@@ -10,7 +10,7 @@ import { Codicon } from "../common";
1010export type MultipleModeledMethodsPanelProps = {
1111 method : Method ;
1212 modeledMethods : ModeledMethod [ ] ;
13- onChange : ( modeledMethod : ModeledMethod ) => void ;
13+ onChange : ( modeledMethods : ModeledMethod [ ] ) => void ;
1414} ;
1515
1616const Container = styled . div `
@@ -25,6 +25,7 @@ const Container = styled.div`
2525const Footer = styled . div `
2626 display: flex;
2727 flex-direction: row;
28+ justify-content: space-between;
2829` ;
2930
3031const PaginationActions = styled . div `
@@ -33,6 +34,12 @@ const PaginationActions = styled.div`
3334 gap: 0.5rem;
3435` ;
3536
37+ const ModificationActions = styled . div `
38+ display: flex;
39+ flex-direction: row;
40+ gap: 0.5rem;
41+ ` ;
42+
3643export const MultipleModeledMethodsPanel = ( {
3744 method,
3845 modeledMethods,
@@ -47,19 +54,73 @@ export const MultipleModeledMethodsPanel = ({
4754 setSelectedIndex ( ( previousIndex ) => previousIndex + 1 ) ;
4855 } , [ ] ) ;
4956
57+ const handleAddClick = useCallback ( ( ) => {
58+ const newModeledMethod : ModeledMethod = {
59+ type : "none" ,
60+ input : "" ,
61+ output : "" ,
62+ kind : "" ,
63+ provenance : "manual" ,
64+ signature : method . signature ,
65+ packageName : method . packageName ,
66+ typeName : method . typeName ,
67+ methodName : method . methodName ,
68+ methodParameters : method . methodParameters ,
69+ } ;
70+
71+ const newModeledMethods = [ ...modeledMethods , newModeledMethod ] ;
72+
73+ onChange ( newModeledMethods ) ;
74+ setSelectedIndex ( newModeledMethods . length - 1 ) ;
75+ } , [ onChange , modeledMethods , method ] ) ;
76+
77+ const handleRemoveClick = useCallback ( ( ) => {
78+ const newModeledMethods = modeledMethods . filter (
79+ ( _ , index ) => index !== selectedIndex ,
80+ ) ;
81+
82+ const newSelectedIndex =
83+ selectedIndex === newModeledMethods . length
84+ ? selectedIndex - 1
85+ : selectedIndex ;
86+
87+ onChange ( newModeledMethods ) ;
88+ setSelectedIndex ( newSelectedIndex ) ;
89+ } , [ onChange , modeledMethods , selectedIndex ] ) ;
90+
91+ const anyUnmodeled = useMemo (
92+ ( ) =>
93+ modeledMethods . length === 0 ||
94+ modeledMethods . some ( ( m ) => m . type === "none" ) ,
95+ [ modeledMethods ] ,
96+ ) ;
97+
98+ const handleChange = useCallback (
99+ ( modeledMethod : ModeledMethod ) => {
100+ if ( modeledMethods . length > 0 ) {
101+ const newModeledMethods = [ ...modeledMethods ] ;
102+ newModeledMethods [ selectedIndex ] = modeledMethod ;
103+ onChange ( newModeledMethods ) ;
104+ } else {
105+ onChange ( [ modeledMethod ] ) ;
106+ }
107+ } ,
108+ [ modeledMethods , selectedIndex , onChange ] ,
109+ ) ;
110+
50111 return (
51112 < Container >
52113 { modeledMethods . length > 0 ? (
53114 < MethodModelingInputs
54115 method = { method }
55116 modeledMethod = { modeledMethods [ selectedIndex ] }
56- onChange = { onChange }
117+ onChange = { handleChange }
57118 />
58119 ) : (
59120 < MethodModelingInputs
60121 method = { method }
61122 modeledMethod = { undefined }
62- onChange = { onChange }
123+ onChange = { handleChange }
63124 />
64125 ) }
65126 < Footer >
@@ -89,6 +150,24 @@ export const MultipleModeledMethodsPanel = ({
89150 < Codicon name = "chevron-right" />
90151 </ VSCodeButton >
91152 </ PaginationActions >
153+ < ModificationActions >
154+ < VSCodeButton
155+ appearance = "icon"
156+ aria-label = "Delete modeling"
157+ onClick = { handleRemoveClick }
158+ disabled = { modeledMethods . length < 2 }
159+ >
160+ < Codicon name = "trash" />
161+ </ VSCodeButton >
162+ < VSCodeButton
163+ appearance = "icon"
164+ aria-label = "Add modeling"
165+ onClick = { handleAddClick }
166+ disabled = { anyUnmodeled }
167+ >
168+ < Codicon name = "add" />
169+ </ VSCodeButton >
170+ </ ModificationActions >
92171 </ Footer >
93172 </ Container >
94173 ) ;
0 commit comments