Skip to content

Commit 58e6358

Browse files
#276 Improve File Tree Tab
- add checkboxes to all files and folders to activate and deactivate a file or folder
1 parent bbae333 commit 58e6358

File tree

4 files changed

+50
-16
lines changed

4 files changed

+50
-16
lines changed

binocular-frontend-new/package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
"scripts": {
77
"dev": "vite",
88
"build": "vite build",
9-
"build-pouchdb": "PRE_CONFIGURE_DB=pouchdb NODE_OPTIONS=--max-old-space-size=32768 vite build",
9+
"build:offline": "PRE_CONFIGURE_DB=pouchdb NODE_OPTIONS=--max-old-space-size=32768 vite build",
1010
"lint": "eslint binocular --ext ts,tsx --report-unused-disable-directives --max-warnings 0",
1111
"preview": "vite preview"
1212
},

binocular-frontend-new/src/components/tabs/fileTree/fileList/fileList.tsx

+1-1
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ function FileList(props: { orientation?: string }) {
6262
}>
6363
<div>
6464
{fileList ? (
65-
<FileListFolder folder={fileList} name={'/'} foldedOut={true}></FileListFolder>
65+
<FileListFolder folder={fileList} name={'/'} foldedOut={true} checked={true}></FileListFolder>
6666
) : (
6767
<span className="loading loading-spinner loading-xs text-accent"></span>
6868
)}

binocular-frontend-new/src/components/tabs/fileTree/fileList/fileListElements/fileListFile.tsx

+17-4
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,26 @@
11
import fileListElementsStyles from './fileListElements.module.scss';
22
import { FileListElementType } from '../../../../../types/data/fileListType.ts';
33
import FileIcon from '../../../../../assets/file_gray.svg';
4+
import { useEffect, useState } from 'react';
45

5-
function FileListFile(props: { file: FileListElementType }) {
6+
function FileListFile(props: { file: FileListElementType; checked: boolean }) {
7+
const [checked, setChecked] = useState(props.checked);
8+
useEffect(() => {
9+
setChecked(props.checked);
10+
}, [props.checked]);
611
return (
712
<>
8-
<div className={fileListElementsStyles.element}>
9-
<img src={FileIcon} alt={`folder ${props.file.name}`} />
10-
<span>{props.file.name}</span>
13+
<div className={'flex items-center'}>
14+
<input
15+
type={'checkbox'}
16+
className={'checkbox checkbox-accent checkbox-xs'}
17+
checked={checked}
18+
onChange={(e) => setChecked(e.target.checked)}
19+
/>
20+
<div className={fileListElementsStyles.element}>
21+
<img src={FileIcon} alt={`folder ${props.file.name}`} />
22+
<span>{props.file.name}</span>
23+
</div>
1124
</div>
1225
</>
1326
);

binocular-frontend-new/src/components/tabs/fileTree/fileList/fileListElements/fileListFolder.tsx

+31-10
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,31 @@
11
import fileListElementsStyles from './fileListElements.module.scss';
22
import { FileListElementType, FileListElementTypeType } from '../../../../../types/data/fileListType.ts';
3-
import { useState } from 'react';
3+
import { useEffect, useState } from 'react';
44
import FolderIcon from '../../../../../assets/folder_gray.svg';
55
import FolderOpenIcon from '../../../../../assets/folder_open_gray.svg';
66
import FileListFile from './fileListFile.tsx';
77

8-
function FileListFolder(props: { folder: FileListElementType[]; name: string; foldedOut: boolean }) {
8+
function FileListFolder(props: { folder: FileListElementType[]; name: string; foldedOut: boolean; checked: boolean }) {
99
const [foldedOut, setFoldedOut] = useState(props.foldedOut);
10+
const [checked, setChecked] = useState(props.checked);
11+
useEffect(() => {
12+
setChecked(props.checked);
13+
}, [props.checked]);
1014
return (
1115
<>
1216
{foldedOut ? (
1317
<>
14-
<div className={fileListElementsStyles.element} onClick={() => setFoldedOut(false)}>
15-
<img src={FolderOpenIcon} alt={`folder open ${props.name}`} />
16-
<span>{props.name}</span>
18+
<div className={'flex items-center'}>
19+
<input
20+
type={'checkbox'}
21+
className={'checkbox checkbox-accent checkbox-xs'}
22+
checked={checked}
23+
onChange={(e) => setChecked(e.target.checked)}
24+
/>
25+
<div className={fileListElementsStyles.element} onClick={() => setFoldedOut(false)}>
26+
<img src={FolderOpenIcon} alt={`folder open ${props.name}`} />
27+
<span>{props.name}</span>
28+
</div>
1729
</div>
1830
<div className={fileListElementsStyles.inset}>
1931
{props.folder
@@ -25,18 +37,27 @@ function FileListFolder(props: { folder: FileListElementType[]; name: string; fo
2537
key={`fileListElement${i}`}
2638
folder={element.children}
2739
name={element.name}
28-
foldedOut={false}></FileListFolder>
40+
foldedOut={false}
41+
checked={checked}></FileListFolder>
2942
);
3043
} else {
31-
return <FileListFile key={`fileListElement${i}`} file={element}></FileListFile>;
44+
return <FileListFile key={`fileListElement${i}`} file={element} checked={checked}></FileListFile>;
3245
}
3346
})}
3447
</div>
3548
</>
3649
) : (
37-
<div onClick={() => setFoldedOut(true)} className={fileListElementsStyles.element}>
38-
<img src={FolderIcon} alt={`folder ${props.name}`} />
39-
<span>{props.name}</span>
50+
<div className={'flex items-center'}>
51+
<input
52+
type={'checkbox'}
53+
className={'checkbox checkbox-accent checkbox-xs'}
54+
checked={checked}
55+
onChange={(e) => setChecked(e.target.checked)}
56+
/>
57+
<div onClick={() => setFoldedOut(true)} className={fileListElementsStyles.element}>
58+
<img src={FolderIcon} alt={`folder ${props.name}`} />
59+
<span>{props.name}</span>
60+
</div>
4061
</div>
4162
)}
4263
</>

0 commit comments

Comments
 (0)