6
6
*/
7
7
8
8
import type { UUID } from 'crypto' ;
9
- import { type Dispatch , type SetStateAction , useCallback , useEffect , useState } from 'react' ;
9
+ import {
10
+ type Dispatch ,
11
+ ForwardedRef ,
12
+ forwardRef ,
13
+ type SetStateAction ,
14
+ useCallback ,
15
+ useImperativeHandle ,
16
+ useState ,
17
+ } from 'react' ;
10
18
import {
11
19
DescriptionModificationDialog ,
12
20
type ElementAttributes ,
@@ -32,9 +40,11 @@ import { useParameterState } from './dialogs/use-parameters-dialog';
32
40
import { PARAM_LANGUAGE } from '../utils/config-params' ;
33
41
import type { useDirectoryContent } from '../hooks/useDirectoryContent' ;
34
42
43
+ export type DirectoryContentDialogApi = {
44
+ handleClick : ( event : CellClickedEvent ) => void ;
45
+ } ;
46
+
35
47
export type DirectoryContentDialogProps = {
36
- cellClicked ?: CellClickedEvent ;
37
- setCellClicked : Dispatch < SetStateAction < CellClickedEvent | undefined > > ;
38
48
broadcastChannel : BroadcastChannel ;
39
49
setOpenDialog : Dispatch < SetStateAction < string > > ;
40
50
activeElement ?: ElementAttributes ;
@@ -43,16 +53,17 @@ export type DirectoryContentDialogProps = {
43
53
childrenMetadata : ReturnType < typeof useDirectoryContent > [ 1 ] ;
44
54
} ;
45
55
46
- export default function DirectoryContentDialog ( {
47
- cellClicked : event ,
48
- setCellClicked : setEvent ,
49
- setOpenDialog,
50
- activeElement,
51
- setActiveElement,
52
- broadcastChannel,
53
- selectedDirectoryElementUuid,
54
- childrenMetadata,
55
- } : Readonly < DirectoryContentDialogProps > ) {
56
+ function DirectoryContentDialog (
57
+ {
58
+ setOpenDialog,
59
+ activeElement,
60
+ setActiveElement,
61
+ broadcastChannel,
62
+ selectedDirectoryElementUuid,
63
+ childrenMetadata,
64
+ } : Readonly < DirectoryContentDialogProps > ,
65
+ refApi : ForwardedRef < DirectoryContentDialogApi >
66
+ ) {
56
67
const intl = useIntl ( ) ;
57
68
const dispatch = useDispatch ( ) ;
58
69
const { snackError } = useSnackMessage ( ) ;
@@ -137,73 +148,77 @@ export default function DirectoryContentDialog({
137
148
setElementName ( '' ) ;
138
149
} , [ setActiveElement , setOpenDialog ] ) ;
139
150
140
- useEffect ( ( ) => {
141
- if ( event !== undefined ) {
142
- if ( event . colDef . field === 'description' ) {
143
- setActiveElement ( event . data ) ;
144
- setOpenDescModificationDialog ( true ) ;
145
- } else if ( childrenMetadata [ event . data . elementUuid ] !== undefined ) {
146
- setElementName ( childrenMetadata [ event . data . elementUuid ] . elementName ) ;
147
- const subtype = childrenMetadata [ event . data . elementUuid ] . specificMetadata . type as unknown as string ;
148
- /** set active directory on the store because it will be used while editing the contingency name */
149
- dispatch ( setActiveDirectory ( selectedDirectoryElementUuid ) ) ;
150
- switch ( event . data . type ) {
151
- case ElementType . STUDY : {
152
- const url = getStudyUrl ( event . data . elementUuid ) ;
153
- if ( url ) {
154
- window . open ( url , '_blank' ) ;
155
- } else {
156
- snackError ( {
157
- messageTxt : intl . formatMessage ( { id : 'getAppLinkError' } , { type : event . data . type } ) ,
158
- } ) ;
151
+ useImperativeHandle (
152
+ refApi ,
153
+ ( ) => ( {
154
+ handleClick : ( event : CellClickedEvent ) => {
155
+ if ( event . colDef . field === 'description' ) {
156
+ setActiveElement ( event . data ) ;
157
+ setOpenDescModificationDialog ( true ) ;
158
+ } else if ( childrenMetadata [ event . data . elementUuid ] !== undefined ) {
159
+ setElementName ( childrenMetadata [ event . data . elementUuid ] . elementName ) ;
160
+ const subtype = childrenMetadata [ event . data . elementUuid ] . specificMetadata . type as unknown as string ;
161
+ /** set active directory on the store because it will be used while editing the contingency name */
162
+ dispatch ( setActiveDirectory ( selectedDirectoryElementUuid ) ) ;
163
+ switch ( event . data . type ) {
164
+ case ElementType . STUDY : {
165
+ const url = getStudyUrl ( event . data . elementUuid ) ;
166
+ if ( url ) {
167
+ window . open ( url , '_blank' ) ;
168
+ } else {
169
+ snackError ( {
170
+ messageTxt : intl . formatMessage (
171
+ { id : 'getAppLinkError' } ,
172
+ { type : event . data . type }
173
+ ) ,
174
+ } ) ;
175
+ }
176
+ break ;
159
177
}
160
- break ;
178
+ case ElementType . CONTINGENCY_LIST :
179
+ if ( subtype === ContingencyListType . CRITERIA_BASED . id ) {
180
+ setCurrentFiltersContingencyListId ( event . data . elementUuid ) ;
181
+ setOpenDialog ( subtype ) ;
182
+ } else if ( subtype === ContingencyListType . SCRIPT . id ) {
183
+ setCurrentScriptContingencyListId ( event . data . elementUuid ) ;
184
+ setOpenDialog ( subtype ) ;
185
+ } else if ( subtype === ContingencyListType . EXPLICIT_NAMING . id ) {
186
+ setCurrentExplicitNamingContingencyListId ( event . data . elementUuid ) ;
187
+ setOpenDialog ( subtype ) ;
188
+ }
189
+ break ;
190
+ case ElementType . FILTER :
191
+ if ( subtype === FilterType . EXPLICIT_NAMING . id ) {
192
+ setCurrentExplicitNamingFilterId ( event . data . elementUuid ) ;
193
+ setOpenDialog ( subtype ) ;
194
+ } else if ( subtype === FilterType . EXPERT . id ) {
195
+ setCurrentExpertFilterId ( event . data . elementUuid ) ;
196
+ setOpenDialog ( subtype ) ;
197
+ }
198
+ break ;
199
+ case ElementType . MODIFICATION :
200
+ if ( subtype === NetworkModificationType . COMPOSITE . id ) {
201
+ setCurrentNetworkModificationId ( event . data . elementUuid ) ;
202
+ setOpenDialog ( subtype ) ;
203
+ }
204
+ break ;
205
+ default :
206
+ break ;
161
207
}
162
- case ElementType . CONTINGENCY_LIST :
163
- if ( subtype === ContingencyListType . CRITERIA_BASED . id ) {
164
- setCurrentFiltersContingencyListId ( event . data . elementUuid ) ;
165
- setOpenDialog ( subtype ) ;
166
- } else if ( subtype === ContingencyListType . SCRIPT . id ) {
167
- setCurrentScriptContingencyListId ( event . data . elementUuid ) ;
168
- setOpenDialog ( subtype ) ;
169
- } else if ( subtype === ContingencyListType . EXPLICIT_NAMING . id ) {
170
- setCurrentExplicitNamingContingencyListId ( event . data . elementUuid ) ;
171
- setOpenDialog ( subtype ) ;
172
- }
173
- break ;
174
- case ElementType . FILTER :
175
- if ( subtype === FilterType . EXPLICIT_NAMING . id ) {
176
- setCurrentExplicitNamingFilterId ( event . data . elementUuid ) ;
177
- setOpenDialog ( subtype ) ;
178
- } else if ( subtype === FilterType . EXPERT . id ) {
179
- setCurrentExpertFilterId ( event . data . elementUuid ) ;
180
- setOpenDialog ( subtype ) ;
181
- }
182
- break ;
183
- case ElementType . MODIFICATION :
184
- if ( subtype === NetworkModificationType . COMPOSITE . id ) {
185
- setCurrentNetworkModificationId ( event . data . elementUuid ) ;
186
- setOpenDialog ( subtype ) ;
187
- }
188
- break ;
189
- default :
190
- break ;
191
208
}
192
- }
193
- setEvent ( undefined ) ; // acknowledge parent event
194
- }
195
- } , [
196
- childrenMetadata ,
197
- dispatch ,
198
- event ,
199
- getStudyUrl ,
200
- intl ,
201
- selectedDirectoryElementUuid ,
202
- setActiveElement ,
203
- setEvent ,
204
- setOpenDialog ,
205
- snackError ,
206
- ] ) ;
209
+ } ,
210
+ } ) ,
211
+ [
212
+ childrenMetadata ,
213
+ dispatch ,
214
+ getStudyUrl ,
215
+ intl ,
216
+ selectedDirectoryElementUuid ,
217
+ setActiveElement ,
218
+ setOpenDialog ,
219
+ snackError ,
220
+ ]
221
+ ) ;
207
222
208
223
if ( openDescModificationDialog && activeElement ) {
209
224
return (
@@ -305,3 +320,5 @@ export default function DirectoryContentDialog({
305
320
) ;
306
321
}
307
322
}
323
+
324
+ export default forwardRef ( DirectoryContentDialog ) ;
0 commit comments