@@ -8,28 +8,28 @@ import RootIcon from '../icons/root.svg';
88
99
1010function FolderEntry ( props ) {
11- const { folder, toggleOpen, setCurrentFolder, isCurrent} = props ;
11+ const { folder, toggleOpen, setCurrentFolder, openRecursive , isCurrent, isListed } = props ;
1212
1313 if ( folder . is_root ) {
14- return ( < span onClick = { ( ) => setCurrentFolder ( folder . id ) } > < RootIcon /> </ span > ) ;
14+ return ( < i onClick = { ( ) => setCurrentFolder ( folder . id ) } > < RootIcon /> </ i > ) ;
1515 }
1616
17- return ( < >
18- < i onClick = { toggleOpen } > {
19- folder . has_subfolders ? folder . is_open ? < ArrowDownIcon /> : < ArrowRightIcon /> : < EmptyIcon />
20- } </ i >
21- { isCurrent ?
22- < strong > < FolderOpenIcon /> { folder . name } </ strong > :
23- < span onClick = { ( ) => setCurrentFolder ( folder . id ) } role = "button" >
24- < FolderIcon /> { folder . name }
25- </ span >
17+ return ( < > {
18+ folder . has_subfolders ? < i onClick = { toggleOpen } > {
19+ folder . is_open ? < ArrowDownIcon /> : < ArrowRightIcon />
20+ } </ i > : < i > < EmptyIcon /> </ i > }
21+ < i onClick = { openRecursive } role = "button" > { isListed || isCurrent ? < FolderOpenIcon /> : < FolderIcon /> } </ i >
22+ { isCurrent
23+ ? < strong > { folder . name } </ strong >
24+ : < span onClick = { ( ) => setCurrentFolder ( folder . id ) } role = "button" > { folder . name } </ span >
2625 }
2726 </ > ) ;
2827}
2928
3029
3130export default function FolderStructure ( props ) {
32- const { baseUrl, folder, lastFolderId, setCurrentFolder, refreshStructure} = props ;
31+ const { baseUrl, folder, lastFolderId, setCurrentFolder, toggleRecursive, refreshStructure} = props ;
32+ const isListed = props . isListed === false ? lastFolderId === folder . id : props . isListed ;
3333
3434 async function fetchChildren ( ) {
3535 const response = await fetch ( `${ baseUrl } ${ folder . id } /fetch` ) ;
@@ -44,28 +44,47 @@ export default function FolderStructure(props) {
4444 }
4545
4646 async function toggleOpen ( ) {
47- folder . is_open = ! folder . is_open ;
4847 if ( folder . is_open ) {
48+ folder . is_open = false ;
49+ await fetch ( `${ baseUrl } ${ folder . id } /close` ) ;
50+ } else {
51+ folder . is_open = true ;
4952 if ( folder . children === null ) {
5053 await fetchChildren ( ) ;
5154 } else {
5255 await fetch ( `${ baseUrl } ${ folder . id } /open` ) ;
5356 }
54- } else {
55- await fetch ( `${ baseUrl } ${ folder . id } /close` ) ;
5657 }
5758 refreshStructure ( ) ;
5859 }
5960
61+ async function openRecursive ( ) {
62+ if ( lastFolderId === folder . id ) {
63+ if ( folder . is_open === false ) {
64+ folder . is_open = true ;
65+ if ( folder . children === null ) {
66+ await fetchChildren ( ) ;
67+ } else {
68+ await fetch ( `${ baseUrl } ${ folder . id } /open` ) ;
69+ }
70+ }
71+ toggleRecursive ( folder . id ) ;
72+ } else {
73+ setCurrentFolder ( folder . id ) ;
74+ }
75+ }
76+
6077 return folder ? (
6178 < li >
6279 < FolderEntry
6380 folder = { folder }
6481 toggleOpen = { toggleOpen }
6582 setCurrentFolder = { setCurrentFolder }
83+ openRecursive = { openRecursive }
6684 isCurrent = { lastFolderId === folder . id }
85+ isListed = { isListed }
6786 />
68- { folder . is_open && (
87+ { folder . is_open && folder . children && (
6988 < ul >
7089 { folder . children . map ( child => (
7190 < FolderStructure
@@ -74,7 +93,9 @@ export default function FolderStructure(props) {
7493 folder = { child }
7594 lastFolderId = { lastFolderId }
7695 setCurrentFolder = { setCurrentFolder }
96+ toggleRecursive = { toggleRecursive }
7797 refreshStructure = { refreshStructure }
98+ isListed = { isListed }
7899 />
79100 ) ) }
80101 </ ul > ) }
0 commit comments