8000 Navigating, selecting multiple files and file management · arduino/lab-micropython-editor@8dc5027 · GitHub
[go: up one dir, main page]

Skip to content

Commit 8dc5027

Browse files
committed
Navigating, selecting multiple files and file management
1 parent 4a706c6 commit 8dc5027

12 files changed

+353
-195
lines changed

preload.js

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -47,9 +47,8 @@ const Serial = {
4747
onData: (fn) => {
4848
board.serial.on('data', fn)
4949
},
50-
listFiles: async () => {
51-
const output = await board.fs_ls()
52-
return output
50+
listFiles: async (folder) => {
51+
return await board.fs_ls(folder)
5352
},
5453
loadFile: async (file) => {
5554
const output = await board.fs_cat(file)
@@ -61,14 +60,14 @@ const Serial = {
6160
saveFileContent: async (filename, content) => {
6261
return board.fs_save(content || ' ', filename)
6362
},
64-
uploadFile: async (folder, filename) => {
65-
let src = `${folder}/${filename}`
66-
let dest = filename
63+
uploadFile: async (diskPath, serialPath, filename) => {
64+
let src = `${diskPath}/${filename}`
65+
let dest = `${serialPath}/${filename}`
6766
return board.fs_put(src, dest)
6867
},
69-
downloadFile: async (folder, filename) => {
70-
let contents = await Serial.loadFile(filename)
71-
return ipcRenderer.invoke('save-file', folder, filename, contents)
68+
downloadFile: async (serialPath, diskPath, filename) => {
69+
let contents = await Serial.loadFile(serialPath + '/' + filename)
70+
return ipcRenderer.invoke('save-file', diskPath, filename, contents)
7271
},
7372
renameFile: async (oldName, newName) => {
7473
return board.fs_rename(oldName, newName)

ui/ftp/components/files/diskFiles.tsx

Lines changed: 21 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,30 @@
11
import React from 'react'
22
import DiskFilesType from './diskFiles.type.ts'
33
import Button from '../shared/button.tsx'
4+
import { Device } from '../../main.type'
45

5-
const DiskFiles: React.FC = ({ diskFilesLogic }) => {
6-
const { diskFiles = [], navigate }: DiskFilesType = diskFilesLogic()
7-
const onClick = (folder) => () => {
8-
navigate(folder)
9-
}
6+
const DiskFiles: React.FC = ({ diskFilesLogic }) => {
7+
const {
8+
diskPath,
9+
selectedFiles = [],
10+
diskFiles = [],
11+
navigate,
12+
selectFile
13+
} : DiskFilesType = diskFilesLogic()
14+
const onNavigate = (folder) => () => navigate([diskPath,folder].join('/'))
15+
const onSelect = (folder) => () => selectFile([diskPath,folder].join('/'))
1016
const files = diskFiles.map((folder, i) => {
11-
return <li key={i}><Button onClick={onClick(folder)}>{folder}</Button></li>
17+
const checked = selectedFiles
18+
.filter(f => f.device === Device.disk)
19+
.find(f => f.path === [diskPath,folder].join('/'))
20+
return (
21+
<li key={i}>
22+
<Button onClick={onSelect(folder)}>[{checked?`x`:' '}]</Button>
23+
<Button onClick={onNavigate(folder)}>{folder}</Button>
24+
</li>
25+
)
1226
})
1327
return <ul>{files}</ul>
1428
}
1529

16-
export default DiskFiles
30+
export default DiskFiles
Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
11
type DiskFilesType = () => {
2-
diskFiles: String[]
3-
// selectedFile: File
4-
navigate: (folder : String) => void
5-
selectFile: (path: String) => void
2+
diskPath: string,
3+
diskFiles: string[]
4+
selectedFiles: File[]
5+
navigate: (folder : string) => void
6+
selectFile: (path: string) => void
67
}
78

8-
export default DiskFilesType
9+
export default DiskFilesType
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
import React from 'react'
2+
import FileManagementType from './fileManagement.type'
3+
import Button from '../shared/button.tsx'
4+
5+
const FileManagement: React.FC = ({ fileManagementLogic }) => {
6+
const { upload, download, remove }: FileManagementType = fileManagementLogic()
7+
return (
8+
<ul>
9+
<li><Button onClick={upload}>{`<-`}</Button></li>
10+
<li><Button onClick={download}>{`->`}</Button></li>
11+
<li><Button onClick={remove}>{`x`}</Button></li>
12+
</ul>
13+
)
14+
}
15+
16+
export default FileManagement
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
type FileManagementType = () => {
2+
upload: () => void
3+
download: () => void
4+
remove: () => void
5+
}
6+
7+
export default FileManagementType

ui/ftp/components/files/management.type.ts

Lines changed: 0 additions & 7 deletions
This file was deleted.
Lines changed: 24 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,30 @@
11
import React from 'react'
22
import SerialFilesType from './serialFiles.type.ts'
33
import Button from '../shared/button.tsx'
4+
import { Device } from '../../main.type'
45

5-
const SerialFiles: React.FC = ({ serialFilesLogic }) => {
6-
const { serialFiles = [], navigate }: SerialFilesType = serialFilesLogic()
7-
const onClick = (folder) => () => {
8-
navigate(folder)
9-
}
10-
const files = serialFiles.map((folder, i) => {
11-
return <li key={i}><Button onClick={onClick(folder)}>{folder}</Button></li>
12-
})
13-
return <ul>{files}</ul>
6+
const SerialFiles: React.FC = ({ serialFilesLogic }) => {
7+
const {
8+
serialPath,
9+
selectedFiles = [],
10+
serialFiles = [],
11+
navigate,
12+
selectFile
13+
} : SerialFilesType = serialFilesLogic()
14+
const onNavigate = (folder) => () => navigate([serialPath,folder].join('/'))
15+
const onSelect = (folder) => () => selectFile([serialPath,folder].join('/'))
16+
const files = serialFiles.map((folder, i) => {
17+
const checked = selectedFiles
18+
.filter(f => f.device === Device.serial)
19+
.find(f => f.path === [serialPath,folder].join('/'))
20+
return (
21+
<li key={i}>
22+
<Button onClick={onSelect(folder)}>[{checked?`x`:' '}]</Button>
23+
<Button onClick={onNavigate(folder)}>{folder}</Button>
24+
</li>
25+
)
26+
})
27+
return <ul>{files}</ul>
1428
}
1529

16-
export default SerialFiles
30+
export default SerialFiles
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
type SerialFilesType = () => {
22
serialFiles: String[]
3-
selectedFile: File
3+
selectedFiles: File[]
44
navigate: (folder : String) => void
55
selectFile: (path: String) => void
66
}
77

8-
export default SerialFilesType
8+
export default SerialFilesType

ui/ftp/components/shared/breadcrumbs.tsx

Lines changed: 21 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -3,19 +3,27 @@ import Button from './button.tsx'
33
import styles from './breadcrumbs.module.scss'
44

55
const BreadCrumbs: React.FC = ({ path, navigate }) => {
6-
if (!path) return <></>
7-
const pathArray = path.split('/')
8-
const onClick = (folder) => () => {
9-
navigate(folder)
10-
}
11-
const items = pathArray.map(
12-
(folder, i) => (
13-
<span key={i}>
14-
<Button onClick={onClick(folder)}>{folder}</Button>/
15-
</span>
16-
)
6+
if (!path) return <></>
7+
const pathArray = path.split('/')
8+
const crumbs = pathArray.filter(crumb => crumb != '')
9+
10+
const onClick = (i) => () => {
11+
const newPath = '/' + crumbs.slice(0, i+1).join('/')
12+
navigate(newPath)
13+
}
14+
const items = crumbs.map(
15+
(folder, i) => (
16+
<span key={i}>
17+
<Button onClick={onClick(i)}>{folder||'/'}</Button>
18+
</span>
1719
)
18-
return <div className={styles.body}>{items}</div>
20+
)
21+
return (
22+
<div className={styles.body}>
23+
<span><Button onClick={() => navigate('/')}>/</Button></span>
24+
{items}
25+
</div>
26+
)
1927
}
2028

21-
export default BreadCrumbs
29+
export default BreadCrumbs

0 commit comments

Comments
 (0)
0