@@ -45,10 +45,10 @@ const MicroscopyImageMetadataFormPage = () => {
45
45
imageHasRequiredMetadata,
46
46
copyImageMetadata,
47
47
imageMetadataCopyFilterValue,
48
- setImageMetadataCopyFilterValue,
49
48
} = useGlobalStore ( ) ;
50
49
51
50
const [ selectedCopyToImages , setSelectedCopyToImages ] = useState ( [ ] ) ;
51
+ const [ selectedCopyToFolders , setSelectedCopyToFolders ] = useState ( [ ] ) ;
52
52
const [ openFolders , setOpenFolders ] = useState ( { } ) ;
53
53
54
54
const naturalSort = ( a , b ) =>
@@ -72,29 +72,26 @@ const MicroscopyImageMetadataFormPage = () => {
72
72
}
73
73
} ) ;
74
74
75
+ console . log ( "imageObject" , imageObject ) ;
75
76
return imageObject ;
76
77
} ;
77
78
78
79
const microscopyImageFileNamesWithoutSelectedImage = confirmedMicroscopyImages . filter (
79
80
( imageObj ) => imageObj . filePath !== selectedImageFileObj ?. filePath
80
81
) ;
81
82
82
- const filteredCopyToImages = microscopyImageFileNamesWithoutSelectedImage . filter ( ( imageObj ) =>
83
- imageObj . filePath . toLowerCase ( ) . includes ( imageMetadataCopyFilterValue . toLowerCase ( ) )
84
- ) ;
85
-
86
- const allFilteredImagesSelected = filteredCopyToImages . length === selectedCopyToImages . length ;
87
-
88
- const handleToggleAllImages = ( ) => {
89
- setSelectedCopyToImages ( allFilteredImagesSelected ? [ ] : filteredCopyToImages ) ;
90
- } ;
91
-
92
- const handleImageSelection = ( imageObj , isSelectedToBeCopiedTo ) => {
93
- setSelectedCopyToImages ( ( prevSelected ) =>
94
- isSelectedToBeCopiedTo
95
- ? prevSelected . filter ( ( image ) => image . filePath !== imageObj . filePath )
96
- : [ ...prevSelected , imageObj ]
83
+ const handleCopyToFileClick = ( imageObj ) => {
84
+ const imageIsSelectedToBeCopiedTo = selectedCopyToImages . some (
85
+ ( image ) => image . filePath === imageObj . filePath
97
86
) ;
87
+
88
+ if ( imageIsSelectedToBeCopiedTo ) {
89
+ setSelectedCopyToImages ( ( prevSelected ) =>
90
+ prevSelected . filter ( ( image ) => image . filePath !== imageObj . filePath )
91
+ ) ;
92
+ } else {
93
+ setSelectedCopyToImages ( ( prevSelected ) => [ ...prevSelected , imageObj ] ) ;
94
+ }
98
95
} ;
99
96
100
97
const handleCopyMetadataFromImageButtonClick = ( ) => {
@@ -121,6 +118,38 @@ const MicroscopyImageMetadataFormPage = () => {
121
118
} ) ) ;
122
119
} ;
123
120
121
+ const handleSelectCopyToFolderClick = ( event , folderName ) => {
122
+ event . stopPropagation ( ) ;
123
+
124
+ const folderNameWasSelected = selectedCopyToFolders . includes ( folderName ) ;
125
+ const imagesInFolder = microscopyImageObject [ folderName ] ;
126
+
127
+ if ( folderNameWasSelected ) {
128
+ // Unselect the folder and all its files
129
+ setSelectedCopyToFolders ( ( prevSelected ) =>
130
+ prevSelected . filter ( ( folder ) => folder !== folderName )
131
+ ) ;
132
+ setSelectedCopyToImages ( ( prevSelected ) =>
133
+ prevSelected . filter (
134
+ ( image ) =>
135
+ ! imagesInFolder . some ( ( imageInFolder ) => imageInFolder . filePath === image . filePath )
136
+ )
137
+ ) ;
138
+ } else {
139
+ // Select the folder and all its files
140
+ setSelectedCopyToFolders ( ( prevSelected ) => [ ...prevSelected , folderName ] ) ;
141
+ setSelectedCopyToImages ( ( prevSelected ) => [
142
+ ...prevSelected ,
143
+ ...imagesInFolder . filter (
144
+ ( imageInFolder ) =>
145
+ ! prevSelected . some ( ( image ) => image . filePath === imageInFolder . filePath )
146
+ ) ,
147
+ ] ) ;
148
+ }
149
+ } ;
150
+
151
+ const folderIsSelectedToBeCopiedTo = ( folderName ) => selectedCopyToFolders . includes ( folderName ) ;
152
+
124
153
const microscopyImageObject = createMicroscopyImageObject ( ) ;
125
154
126
155
return (
@@ -135,32 +164,97 @@ const MicroscopyImageMetadataFormPage = () => {
135
164
< GuidedModeSection bordered >
136
165
{ copyImageMetadataModeActive ? (
137
166
< Stack >
138
- < NavigationButton
139
- buttonText = "Cancel metadata copy"
140
- navIcon = "left-arrow"
141
- buttonOnClick = { handleCancelCopyImageMetadataButtonClick }
142
- />
167
+ < Flex justify = "center" align = "center" gap = "md" >
168
+ < NavigationButton
169
+ buttonText = "Cancel metadata copy"
170
+ navIcon = "left-arrow"
171
+ buttonOnClick = { handleCancelCopyImageMetadataButtonClick }
172
+ />
173
+ < Button color = "cyan" onClick = { handleCopyImageMetadataButtonClick } style = { { flex : 1 } } >
174
+ Copy metadata to selected images
175
+ </ Button >
176
+ </ Flex >
143
177
< Center mt = "md" >
144
178
< Title order = { 2 } >
145
179
Select images to copy metadata from "{ selectedImageFileObj ?. fileName } " to
146
180
</ Title >
147
181
</ Center >
148
- < Flex align = "flex-end" gap = "md" >
149
- < Button className = { styles . toggleButton } onClick = { handleToggleAllImages } >
150
- { allFilteredImagesSelected
151
- ? `Deselect ${ imageMetadataCopyFilterValue === "" ? "all" : "filtered" } `
152
- : `Select ${ imageMetadataCopyFilterValue === "" ? "all" : "filtered" } ` }
153
- </ Button >
154
- < TextInput
155
- placeholder = "Filter images using a file name or file path"
156
- value = { imageMetadataCopyFilterValue }
157
- style = { { flexGrow : 1 } }
158
- onChange = { ( event ) => setImageMetadataCopyFilterValue ( event . target . value ) }
159
- rightSection = { < IconSearch size = { 20 } /> }
160
- />
161
- </ Flex >
182
+
162
183
< ScrollArea h = { 300 } type = "always" >
163
- < Table miw = { 800 } verticalSpacing = "sm" withTableBorder highlightOnHover >
184
+ < Stack gap = "xs" >
185
+ { Object . keys ( microscopyImageObject ) . map ( ( folderKey ) => (
186
+ < Stack gap = "2px" key = { folderKey } >
187
+ < Group
188
+ m = "0px"
189
+ onClick = { ( ) => handleToggleFolder ( folderKey ) }
190
+ style = { { cursor : "pointer" } }
191
+ >
192
+ < Checkbox
193
+ checked = { folderIsSelectedToBeCopiedTo ( folderKey ) }
194
+ onClick = { ( e ) => handleSelectCopyToFolderClick ( e , folderKey ) }
195
+ readOnly
196
+ />
197
+ { openFolders [ folderKey ] ? (
198
+ < IconFolderOpen size = { 24 } />
199
+ ) : (
200
+ < IconFolder size = { 24 } />
201
+ ) }
202
+ < Text size = "sm" > { folderKey } </ Text >
203
+ { openFolders [ folderKey ] ? (
204
+ < IconChevronDown size = { 24 } />
205
+ ) : (
206
+ < IconChevronRight size = { 24 } />
207
+ ) }
208
+ </ Group >
209
+ { openFolders [ folderKey ] &&
210
+ microscopyImageObject [ folderKey ] . map ( ( fileObj ) => {
211
+ const isSelectedToBeCopiedTo = selectedCopyToImages . some (
212
+ ( image ) => image . filePath === fileObj . filePath
213
+ ) ;
214
+ return (
215
+ < Tooltip
216
+ openDelay = { 500 }
217
+ key = { fileObj . filePath }
218
+ label = {
219
+ < Stack gap = "xs" >
220
+ < Text size = "sm" mb = "0px" >
221
+ Local file path:
222
+ </ Text >
223
+ < Text size = "xs" mt = "-8px" >
224
+ { fileObj . filePath }
225
+ </ Text >
226
+ < Text size = "sm" mb = "-7px" mt = "4px" >
227
+ Location in dataset:
228
+ </ Text >
229
+ { fileObj . relativeDatasetStructurePaths . map ( ( path ) => (
230
+ < Text key = { path } size = "xs" >
231
+ { path }
232
+ </ Text >
233
+ ) ) }
234
+ </ Stack >
235
+ }
236
+ >
237
+ < Button
238
+ variant = "subtle"
239
+ justify = "flex-start"
240
+ size = "compact-sm"
241
+ className = {
242
+ fileObj . filePath === selectedImageFileObj ?. filePath
243
+ ? styles . selectedImageInSidebar
244
+ : ""
245
+ }
246
+ leftSection = { < Checkbox checked = { isSelectedToBeCopiedTo } readOnly /> }
247
+ onClick = { ( ) => handleCopyToFileClick ( fileObj ) }
248
+ >
249
+ < Text size = "sm" > { fileObj . fileName } </ Text >
250
+ </ Button >
251
+ </ Tooltip >
252
+ ) ;
253
+ } ) }
254
+ </ Stack >
255
+ ) ) }
256
+ </ Stack >
257
+ { /*<Table miw={800} verticalSpacing="sm" withTableBorder highlightOnHover>
164
258
<Table.Thead>
165
259
<Table.Tr>
166
260
<Table.Th></Table.Th>
@@ -176,7 +270,7 @@ const MicroscopyImageMetadataFormPage = () => {
176
270
return (
177
271
<Table.Tr
178
272
key={imageObj.filePath}
179
- onClick = { ( ) => handleImageSelection ( imageObj , isSelectedToBeCopiedTo ) }
273
+ onClick={() => handleCopyToFileClick (imageObj, isSelectedToBeCopiedTo)}
180
274
>
181
275
<Table.Td>
182
276
<Checkbox checked={isSelectedToBeCopiedTo} readOnly />
@@ -187,11 +281,8 @@ const MicroscopyImageMetadataFormPage = () => {
187
281
);
188
282
}) }
189
283
</Table.Tbody>
190
- </ Table >
284
+ </Table>*/ }
191
285
</ ScrollArea >
192
- < Button color = "cyan" onClick = { handleCopyImageMetadataButtonClick } >
193
- Copy metadata to selected images
194
- </ Button >
195
286
</ Stack >
196
287
) : (
197
288
< Grid gutter = "xl" >
0 commit comments