@alyzenpublic/react-keyed-file-browser
Version:
Folder based file browser given a flat keyed list of objects, powered by React.
137 lines (125 loc) • 3.99 kB
JavaScript
import React from 'react'
import ClassNames from 'classnames'
import { DragSource, DropTarget } from 'react-dnd'
import { NativeTypes } from 'react-dnd-html5-backend'
import BaseFolder, { BaseFolderConnectors } from './../base-folder.js'
import { BaseFileConnectors } from './../base-file.js'
class RawListThumbnailFolder extends BaseFolder {
render() {
const {
isOpen, isDragging, isDeleting, isRenaming, isDraft, isOver, isSelected,
url, action, browserProps, depth, keyDerived, connectDragPreview,
} = this.props
const icon = browserProps.icons[isOpen ? 'FolderOpen' : 'Folder']
const inAction = (isDragging || action)
let name
if (!inAction && isDeleting) {
name = (
<form className="deleting" onSubmit={this.handleDeleteSubmit}>
<a
href={url}
download="download"
onClick={this.handleFileClick}
>
{this.getName()}
</a>
<div>
<button type="submit">
Confirm Deletion
</button>
</div>
</form>
)
} else if ((!inAction && isRenaming) || isDraft) {
name = (
<div>
<form className="renaming" onSubmit={this.handleRenameSubmit}>
<input
type="text"
ref={el => { this.newNameRef = el }}
value={this.state.newName}
onChange={this.handleNewNameChange}
onBlur={this.handleCancelEdit}
autoFocus
/>
</form>
</div>
)
} else {
name = (
<div>
<a onClick={this.toggleFolder}>
{this.getName()}
</a>
</div>
)
}
let children
if (isOpen && browserProps.nestChildren) {
children = []
for (let childIndex = 0; childIndex < children.length; childIndex++) {
const file = children[childIndex]
const thisItemProps = {
...browserProps.getItemProps(file, browserProps),
depth: depth + 1,
}
if (file.size) {
children.push(
<browserProps.fileRenderer
{...file}
{...thisItemProps}
browserProps={browserProps}
{...browserProps.fileRendererProps}
/>
)
} else {
children.push(
<browserProps.folderRenderer
{...file}
{...thisItemProps}
browserProps={browserProps}
{...browserProps.folderRendererProps}
/>
)
}
}
if (children.length) {
children = (<ul style={{padding: '0 8px', paddingLeft: '16px'}}>{children}</ul>)
} else {
children = (<p>No items in this folder</p>)
}
}
let folder = (
<li
className={ClassNames('folder', {
expanded: isOpen && browserProps.nestChildren,
pending: action,
dragging: isDragging,
dragover: isOver,
selected: isSelected,
})}
onClick={this.handleFolderClick}
onDoubleClick={this.handleFolderDoubleClick}
>
<div className="item">
<span className="thumb">{icon}</span>
<span className="name">{name}</span>
</div>
{children}
</li>
)
if (typeof browserProps.moveFolder === 'function' && keyDerived) {
folder = connectDragPreview(folder)
}
return this.connectDND(folder)
}
}
('folder', BaseFolderConnectors.dragSource, BaseFolderConnectors.dragCollect)
(
['file', 'folder', NativeTypes.FILE],
BaseFileConnectors.targetSource,
BaseFileConnectors.targetCollect,
)
class ListThumbnailFolder extends RawListThumbnailFolder {}
export default ListThumbnailFolder
export { RawListThumbnailFolder }