1
1
import * as React from "react" ;
2
- import { useCallback , useState } from "react" ;
2
+ import { useCallback , useMemo , useState } from "react" ;
3
3
import { Method } from "../../model-editor/method" ;
4
4
import { ModeledMethod } from "../../model-editor/modeled-method" ;
5
5
import { styled } from "styled-components" ;
@@ -10,7 +10,7 @@ import { Codicon } from "../common";
10
10
export type MultipleModeledMethodsPanelProps = {
11
11
method : Method ;
12
12
modeledMethods : ModeledMethod [ ] ;
13
- onChange : ( modeledMethod : ModeledMethod ) => void ;
13
+ onChange : ( modeledMethods : ModeledMethod [ ] ) => void ;
14
14
} ;
15
15
16
16
const Container = styled . div `
@@ -25,6 +25,7 @@ const Container = styled.div`
25
25
const Footer = styled . div `
26
26
display: flex;
27
27
flex-direction: row;
28
+ justify-content: space-between;
28
29
` ;
29
30
30
31
const PaginationActions = styled . div `
@@ -33,6 +34,12 @@ const PaginationActions = styled.div`
33
34
gap: 0.5rem;
34
35
` ;
35
36
37
+ const ModificationActions = styled . div `
38
+ display: flex;
39
+ flex-direction: row;
40
+ gap: 0.5rem;
41
+ ` ;
42
+
36
43
export const MultipleModeledMethodsPanel = ( {
37
44
method,
38
45
modeledMethods,
@@ -47,19 +54,73 @@ export const MultipleModeledMethodsPanel = ({
47
54
setSelectedIndex ( ( previousIndex ) => previousIndex + 1 ) ;
48
55
} , [ ] ) ;
49
56
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
+
50
111
return (
51
112
< Container >
52
113
{ modeledMethods . length > 0 ? (
53
114
< MethodModelingInputs
54
115
method = { method }
55
116
modeledMethod = { modeledMethods [ selectedIndex ] }
56
- onChange = { onChange }
117
+ onChange = { handleChange }
57
118
/>
58
119
) : (
59
120
< MethodModelingInputs
60
121
method = { method }
61
122
modeledMethod = { undefined }
62
- onChange = { onChange }
123
+ onChange = { handleChange }
63
124
/>
64
125
) }
65
126
< Footer >
@@ -89,6 +150,24 @@ export const MultipleModeledMethodsPanel = ({
89
150
< Codicon name = "chevron-right" />
90
151
</ VSCodeButton >
91
152
</ 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 >
92
171
</ Footer >
93
172
</ Container >
94
173
) ;
0 commit comments