@bigfishtv/cockpit
Version:
151 lines (138 loc) • 4.07 kB
JavaScript
import PropTypes from 'prop-types'
import React, { Component } from 'react'
import { pruneTree } from '../../utils/treeUtils'
import Tree from '../tree/Tree'
import Button from '../button/Button'
import Modal from '../modal/Modal'
import InfoTooltip from '../InfoTooltip'
import AssetFolderTreeCell from './AssetFolderTreeCell'
// used in AssetFolderEditModal
const ModalActions = props => {
const { primaryActionText, folderName, onSave, onClose } = props.modalActionProps
return (
<div>
<Button text={primaryActionText} style="primary" onClick={onSave} disabled={!folderName} />
<Button text="Cancel" onClick={onClose} />
</div>
)
}
/**
* Modal component for editing existing folder or creating a new one
*/
export default class AssetFolderEditModal extends Component {
static propTypes = {
/** Modal title */
title: PropTypes.string,
/** Primary button text */
primaryActionText: PropTypes.string,
/** If editing, name of folder */
folderName: PropTypes.string,
/** Folder id of parent folder, null if top-level */
parentId: PropTypes.number,
/** Only applicable if editing */
folderId: PropTypes.number,
/** An array of one item, used to know which parent folder to auto-select in the parent folder select tree */
selectedIds: PropTypes.array,
/** An array of collapsed folder ids, to mimic in the parent folder select tree */
collapsedIds: PropTypes.array,
/** Nested data for all asset folders */
data: PropTypes.array,
/** Called on save */
onSave: PropTypes.func,
/** Called on close */
onClose: PropTypes.func,
}
static defaultProps = {
title: 'Add New Folder',
primaryActionText: 'Add',
folderName: '',
parentId: null,
folderId: null,
selectedIds: [],
collapsedIds: [],
data: [],
onSave: () => console.warn('[AssetFolderEditModal] no onSave prop provided'),
onClose: () => console.warn('[AssetFolderEditModal] no onClose prop provided'),
}
constructor(props) {
super()
const { folderId, parentId, folderName } = props
const data = pruneTree(pruneTree(props.data, 'locked', [true]), 'id', [null, folderId])
this.state = { folderName, parentId, data }
}
/**
* called by ModalActions button
*/
handleSave = () => {
const { folderName, parentId } = this.state
this.props.onSave({
folderId: this.props.folderId,
folderName,
parentId,
})
this.props.closeModal()
}
/**
* called by ModalActions button or default ModalToolbar close button
*/
handleClose = () => {
this.props.onClose()
this.props.closeModal()
}
/**
* called by modal parent folder select tree
* @param {Number[]} selectedIds [description]
*/
handleSelectionChange = selectedIds => {
const parentId = selectedIds.length ? selectedIds[0] : null
this.setState({ parentId })
}
/**
* called on input onChange
* @param {InputEvent} event
*/
handleFolderNameChange = event => {
this.setState({ folderName: event.target.value })
}
render() {
const { title, primaryActionText, selectedIds, collapsedIds } = this.props
const { data, folderName } = this.state
const modalActionProps = {
folderName,
primaryActionText,
onSave: this.handleSave,
onClose: this.handleClose,
}
return (
<Modal
title={title}
size="medium"
onClose={this.handleClose}
onSave={this.handleSave}
ModalActions={ModalActions}
modalActionProps={modalActionProps}>
<div className="form-input">
<label>Folder Name</label>
<input value={this.state.folderName} onChange={this.handleFolderNameChange} autoFocus />
</div>
<div className="form-input">
<label>
Select Parent Folder
<InfoTooltip text="To make folder top-level, don't make a selection." />
</label>
<Tree
uncontrolled={true}
value={data}
TreeCell={AssetFolderTreeCell}
multiselect={false}
reorderable={false}
stickySelect={false}
selectedIds={selectedIds}
collapsedIds={collapsedIds}
onSelectionChange={this.handleSelectionChange}
/>
</div>
</Modal>
)
}
}