Newer
Older
import React from 'react'
import { withStyles } from '@material-ui/core/styles'
vkovtun
committed
import autoBind from 'auto-bind'
import Toolbar from '@src/js/components/database/data-browser/Toolbar.jsx'
import GridView from '@src/js/components/database/data-browser/GridView.jsx'
import Grid from '@src/js/components/common/grid/Grid.jsx'
import GridFilterOptions from '@src/js/components/common/grid/GridFilterOptions.js'
import AppController from '@src/js/components/AppController.js'
import ItemIcon from '@src/js/components/database/data-browser/ItemIcon.jsx'
import InfoPanel from '@src/js/components/database/data-browser/InfoPanel.jsx'
import DataBrowserController from '@src/js/components/database/data-browser/DataBrowserController.js'
import NavigationBar from '@src/js/components/database/data-browser/NavigationBar.jsx'
import messages from '@src/js/common/messages.js'
const HTTP_SERVER_URI = '/data-store-server'
columnFlexContainer: {
flexDirection: 'column',
display: 'flex',
height: 'calc(100vh - ' + theme.spacing(12) + 'px)'
boundary: {
padding: theme.spacing(1),
borderColor: theme.palette.border.secondary,
backgroundColor: theme.palette.background.paper
'&>*': {
flex: '0 0 auto',
padding: theme.spacing(1),
borderWidth: '1px',
borderStyle: 'solid',
borderColor: theme.palette.border.secondary,
backgroundColor: theme.palette.background.paper
},
},
overflowY: 'auto',
paddingTop: 0,
paddingBottom: 0
},
content: {
flex: '1 1 100%',
},
nameCell: {
display: 'flex',
alignItems: 'center',
'&>span': {
flex: 1,
whiteSpace: 'nowrap',
overflow: 'hidden',
textOverflow: 'ellipsis'
}
},
const configuration =
[
extensions: ['wav', 'mp3', 'acc', 'ogg', 'flac', 'm4a', 'wma', 'opus',
'alac', 'aiff']
},
{
extensions: ['txt', 'rtf', 'odt', 'ods', 'odp', 'html', 'htm', 'epub',
'md', 'tex', 'pages', 'numbers', 'key', 'mobi', 'indd']
},
{
extensions: ['mp4', 'mkv', 'avi', 'mov', 'wmv', 'flv', 'mkv', 'webm',
'mpeg', 'mpg', 'vob', 'm4v']
},
{
extensions: ['tif', 'tiff', 'gif', 'jpg', 'jpeg', 'png', 'bmp', 'svg',
'webp', 'psd', 'raw', 'heif', 'heic']
},
{
icon: 'file-archive',
extensions: ['zip', 'rar', '7z', 'tar', 'gz', 'bz2', 'xz', 'iso', 'zipx',
'cab', 'arj', 'lz', 'lzma', 'z', 'tgz', 'ace', 'dmg']
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
},
{
icon: 'file-code',
extensions: ['xml', 'js', 'html', 'css', 'c', 'cpp', 'cs', 'php', 'rb',
'swift', 'go', 'rs', 'ts', 'json', 'sh', 'bat', 'sql', 'yaml', 'yml',
'jsx', 'tsx', 'pl', 'scala', 'kt']
},
// Fine-grained file formats
{
icon: 'file-pdf',
extensions: ['pdf']
},
{
icon: 'file-word',
extensions: ['doc', 'docx']
},
{
icon: 'file-excel',
extensions: ['xls', 'xlsx']
},
{
icon: 'file-powerpoint',
extensions: ['ppt', 'pptx']
},
{
icon: 'file-csv',
extensions: ['csv', 'tsv']
},
]
class DataBrowser extends React.Component {
constructor(props, context) {
super(props, context)
vkovtun
committed
autoBind(this)
const { sessionToken, controller } = this.props
this.controller = controller || new DataBrowserController()
this.datastoreServer = new DataStoreServer(
'http://localhost:8085',
HTTP_SERVER_URI
)
this.controller.setSessionToken(sessionToken)
this.state = {
viewType: props.viewType,
multiselectedFiles: new Set([]),
showInfo: false,
path: '/'
vkovtun
committed
handleViewTypeChange(viewType) {
this.setState({ viewType })
}
handleClick(file) {
// TODO: implement
}
const { directory, path } = row.data
if (directory) {
}
}
this.setState({ selectedFile: selectedRow && selectedRow.data })
handleMultiselect(selectedRow) {
this.setState({
multiselectedFiles: new Set(Object.values(selectedRow)
.map(value => value.data))
})
async onError(error) {
await AppController.getInstance().errorChange(error)
}
this.setState({ showInfo: !this.state.showInfo })
handleGridControllerRef(gridController) {
this.controller.gridController = gridController
}
async handlePathChange(path) {
await this.setPath(path)
}
if (this.state.path !== path + '/') {
this.setState({ path: path + '/' })
this.controller.setPath(path + '/')
await this.controller.gridController.load()
}
timeToString(time) {
return new Date(time).toLocaleString()
}
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
sizeToString(bytes) {
if (!bytes) {
return null
}
if (typeof bytes == "string") {
bytes = parseInt(bytes)
}
let size
let unit
const kbytes = bytes / 1024.0
const mbytes = kbytes / 1024.0
const gbytes = mbytes / 1024.0
if (gbytes > 1.0) {
size = gbytes
unit = "Gb"
} else if (mbytes > 1.0) {
size = mbytes
unit = "Mb"
} else if (kbytes > 1.0) {
size = kbytes
unit = "kb"
} else {
size = bytes
unit = "bytes"
}
return size.toFixed(1) + " " + unit;
}
const { classes, sessionToken } = this.props
const {
viewType,
files,
selectedFile,
multiselectedFiles,
showInfo,
path
} = this.state
<div className={[classes.boundary, classes.columnFlexContainer].join(' ')}>
viewType={viewType}
onViewTypeChange={this.handleViewTypeChange}
onShowInfoChange={this.handleShowInfoChange}
showInfo={showInfo}
selectedFile={selectedFile}
datastoreServer={this.datastoreServer}
sessionToken={sessionToken}
path={path}
<NavigationBar
path={path}
onPathChange={this.handlePathChange}
/>
<div className={[classes.flexContainer, classes.boundary, classes.content].join(' ')}>
controllerRef={this.handleGridControllerRef}
filterModes={[GridFilterOptions.COLUMN_FILTERS]}
header='Files'
classes={{ container: classes.grid }}
label: messages.get(messages.NAME),
<div className={classes.nameCell}>
<ItemIcon
file={row}
classes={{ icon: classes.icon }}
configuration={configuration}
/>
<span>{row.name}</span>
</div>
name: 'type',
label: messages.get(messages.TYPE),
sortable: true,
getValue: ({ row }) => row.directory ? 'Directory' : 'File'
},
label: messages.get(messages.SIZE),
getValue: ({ row }) => this.sizeToString(row.size)
{
name: 'created',
label: messages.get(messages.CREATED),
sortable: true,
getValue: ({ row }) => row.creationTime,
renderValue: ({ row }) => this.timeToString(row.creationTime)
},
label: messages.get(messages.MODIFIED),
sortable: true,
getValue: ({ row }) => row.lastModifiedTime,
renderValue: ({ row }) => this.timeToString(row.lastModifiedTime)
},
{
name: 'accessed',
label: messages.get(messages.ACCESSED),
sortable: true,
getValue: ({ row }) => row.lastAccessTime,
renderValue: ({ row }) => this.timeToString(row.lastAccessTime)
exportable={false}
selectable={true}
multiselectable={true}
loadSettings={null}
showHeaders={true}
onSettingsChange={null}
onError={this.onError}
onSelectedRowChange={this.handleSelect}
onMultiselectedRowsChange={this.handleMultiselect}
onRowDoubleClick={this.handleRowDoubleClick}
exportXLS={null}
/>
)}
{viewType === 'grid' && (
<GridView
clickable={true}
selectable={true}
multiselectable={true}
onClick={this.handleClick}
onSelect={this.handleSelect}
onMultiselect={this.handleMultiselect}
configuration={configuration}
files={files}
selectedFile={selectedFile}
multiselectedFiles={multiselectedFiles}
<InfoPanel selectedFile={selectedFile} configuration={configuration} />