diff --git a/ui-admin/src/js/common/messages.js b/ui-admin/src/js/common/messages.js index 5cdcb16583f13115831eb7e131268ebf4c1ee7e5..70a65a54357be1ebd6dc652735f4e343efebe6b9 100644 --- a/ui-admin/src/js/common/messages.js +++ b/ui-admin/src/js/common/messages.js @@ -104,6 +104,7 @@ const keys = { FILTERS: 'FILTERS', FIRST_NAME: 'FIRST_NAME', FIRST_PAGE: 'FIRST_PAGE', + FOLDER_NAME: 'FOLDER_NAME', FOLDER_UPLOAD: 'FOLDER_UPLOAD', FORM_PREVIEW: 'FORM_PREVIEW', FREEZES: 'FREEZES', @@ -132,6 +133,7 @@ const keys = { INFO: 'INFO', INHERITED_FROM: 'INHERITED_FROM', INITIAL_VALUE: 'INITIAL_VALUE', + INPUT: 'INPUT', INTERNAL: 'INTERNAL', INVALID: 'INVALID', IS_NEW_ENTITY: 'IS_NEW_ENTITY', @@ -418,6 +420,7 @@ const messages_en = { [keys.FILTERS]: 'Filters', [keys.FIRST_NAME]: 'First Name', [keys.FIRST_PAGE]: 'First Page', + [keys.FOLDER_NAME]: 'Folder name', [keys.FOLDER_UPLOAD]: 'Folder upload', [keys.FORM_PREVIEW]: 'Form Preview', [keys.FREEZES]: 'Freezes', @@ -446,6 +449,7 @@ const messages_en = { [keys.INFO]: 'Info', [keys.INHERITED_FROM]: 'Inherited From', [keys.INITIAL_VALUE]: 'Initial Value', + [keys.INPUT]: 'Input', [keys.INTERNAL]: 'Internal', [keys.INVALID]: 'Invalid', [keys.IS_NEW_ENTITY]: 'Is New Entity', diff --git a/ui-admin/src/js/components/common/dialog/InputDialog.jsx b/ui-admin/src/js/components/common/dialog/InputDialog.jsx new file mode 100644 index 0000000000000000000000000000000000000000..77ea497f9affac86387f948790a29587d135b03c --- /dev/null +++ b/ui-admin/src/js/components/common/dialog/InputDialog.jsx @@ -0,0 +1,140 @@ +import React from 'react' +import { withStyles } from '@material-ui/core/styles' +import Button from '@src/js/components/common/form/Button.jsx' +import Dialog from '@src/js/components/common/dialog/Dialog.jsx' +import messages from '@src/js/common/messages.js' +import logger from '@src/js/common/logger.js' +import { DialogContentText } from '@material-ui/core' +import TextField from '@material-ui/core/TextField' +import autoBind from 'auto-bind' + +const styles = theme => ({ + button: { + marginLeft: theme.spacing(1) + } +}) + +class InputDialog extends React.Component { + constructor(props) { + super(props) + autoBind(this) + + this.state = { + inputValue: '' + } + + this.handleClose = this.handleClose.bind(this) + } + + handleClose() { + const { onCancel } = this.props + if (onCancel) { + onCancel() + } + } + + updateInputValue(event) { + const value = event.target.value + this.setState({ + inputValue: value + }) + } + + handleConfirmClick() { + const { onConfirm } = this.props + const { inputValue } = this.state + onConfirm(inputValue) + this.clearInput() + } + + handleCancelClick() { + const { onCancel } = this.props + onCancel() + this.clearInput() + } + + clearInput() { + this.setState({ + inputValue: '' + }) + } + + renderButtons() { + const { classes } = this.props + return ( + <div> + <Button + name='confirm' + label={messages.get(messages.CONFIRM)} + type={this.getButtonType()} + styles={{ root: classes.button }} + onClick={this.handleConfirmClick} + /> + <Button + name='cancel' + label={messages.get(messages.CANCEL)} + styles={{ root: classes.button }} + onClick={this.handleCancelClick} + /> + </div> + ) + } + + getMessageType() { + const type = this.getType() + + if (type === 'warning') { + return 'warning' + } else if (type === 'info') { + return 'info' + } else { + throw new Error('Unsupported type: ' + type) + } + } + + getButtonType() { + const type = this.getType() + + if (type === 'warning') { + return 'risky' + } else if (type === 'info') { + return null + } else { + throw new Error('Unsupported type: ' + type) + } + } + + getType() { + return this.props.type || 'warning' + } + + render() { + logger.log(logger.DEBUG, 'ConfirmationDialog.render') + + const { open, title, inputLabel, inputType, content } = this.props + const { inputValue } = this.state + + return ( + <Dialog + open={open} + onClose={this.handleClose} + title={title || messages.get(messages.INPUT)} + content={[<DialogContentText key='dialog-content'>{content}</DialogContentText>, + <TextField + key='dialog-text' + autoFocus + margin='dense' + label={inputLabel} + type={inputType || 'text'} + fullWidth + variant='standard' + value={inputValue} + onChange={this.updateInputValue} + />]} + actions={this.renderButtons()} + /> + ) + } +} + +export default withStyles(styles)(InputDialog) diff --git a/ui-admin/src/js/components/database/data-browser/DataBrowserController.js b/ui-admin/src/js/components/database/data-browser/DataBrowserController.js index e09042a3a92221bf0ac15b6f0920f3ef0da7fe0a..7072b2feb8054d479d32682bdaeb5819e0197872 100644 --- a/ui-admin/src/js/components/database/data-browser/DataBrowserController.js +++ b/ui-admin/src/js/components/database/data-browser/DataBrowserController.js @@ -22,6 +22,9 @@ export default class DataBrowserController extends ComponentController { constructor() { super() autoBind(this) + + this.owner = 'demo-sample' + this.source = '' } async login() { @@ -38,7 +41,7 @@ export default class DataBrowserController extends ComponentController { async listFiles() { return new Promise((resolve, reject) => { - this.component.datastoreServer.list('demo-sample', '', 'true', (data) => { + this.component.datastoreServer.list(this.owner, this.source, true, (data) => { if (!data.error) { const results = data.result[1] const files = results.map(result => result[1]) @@ -57,8 +60,8 @@ export default class DataBrowserController extends ComponentController { return await files.map(file => ({ id: file.name, ...file })) } - handleNewFolderClick(event) { - console.log(event.target) + createNewFolder(name) { + // this.component.datastoreServer.create(this.owner, this.source, true, ) } handleUploadClick(event) { diff --git a/ui-admin/src/js/components/database/data-browser/LeftToolbar.jsx b/ui-admin/src/js/components/database/data-browser/LeftToolbar.jsx index d28e289c9b4dbf2b758921ab5e16383f2b01f433..1f3103448a1c78c37124e5da70ae1d6efc6ba3ac 100644 --- a/ui-admin/src/js/components/database/data-browser/LeftToolbar.jsx +++ b/ui-admin/src/js/components/database/data-browser/LeftToolbar.jsx @@ -33,6 +33,7 @@ import IconButton from '@material-ui/core/IconButton' import { debounce } from '@material-ui/core' import Container from '@src/js/components/common/form/Container.jsx' import Popover from '@material-ui/core/Popover' +import InputDialog from '@src/js/components/common/dialog/InputDialog.jsx' const color = 'secondary' const iconButtonSize = 'medium' @@ -72,27 +73,50 @@ class LeftToolbar extends React.Component { this.state = { width: 0, - hiddenButtonsPopup: null + hiddenButtonsPopup: null, + newFolderDialogOpen: false } this.controller = this.props.controller - this.onResize = debounce(this.onResize, 1); + this.onResize = debounce(this.onResize, 1) + } + + handleNewFolderCreate(event) { + this.closeNewFolderDialog() + console.log(event) + } + + openNewFolderDialog() { + this.setState({ newFolderDialogOpen: true }) + } + + closeNewFolderDialog() { + this.setState({ newFolderDialogOpen: false }) } renderNoSelectionContextToolbar() { const { classes, buttonSize } = this.props - return ( + return ([ <Button + key='new-folder' classes={{ root: classes.button }} color={color} size={buttonSize} variant='outlined' startIcon={<CreateNewFolderIcon />} - onClick={this.controller.handleNewFolderClick} + onClick={this.openNewFolderDialog} > {messages.get(messages.NEW_FOLDER)} - </Button> - ) + </Button>, + <InputDialog + key='new-folder-dialog' + open={this.state.newFolderDialogOpen} + title={messages.get(messages.NEW_FOLDER)} + inputLabel={messages.get(messages.FOLDER_NAME)} + onCancel={this.closeNewFolderDialog} + onConfirm={this.handleNewFolderCreate} + /> + ]) } renderSelectionContextToolbar() { @@ -114,7 +138,6 @@ class LeftToolbar extends React.Component { size={buttonSize} variant='outlined' startIcon={<DownloadIcon />} - onClick={this.controller.handleNewFolderClick} > {messages.get(messages.DOWNLOAD)} </Button>, @@ -125,7 +148,6 @@ class LeftToolbar extends React.Component { size={buttonSize} variant='text' startIcon={<DeleteIcon />} - onClick={this.controller.handleNewFolderClick} > {messages.get(messages.DELETE)} </Button>, @@ -136,7 +158,6 @@ class LeftToolbar extends React.Component { size={buttonSize} variant='text' startIcon={<RenameIcon />} - onClick={this.controller.handleNewFolderClick} > {messages.get(messages.RENAME)} </Button>, @@ -147,7 +168,6 @@ class LeftToolbar extends React.Component { size={buttonSize} variant='text' startIcon={<CopyIcon />} - onClick={this.controller.handleNewFolderClick} > {messages.get(messages.COPY)} </Button>, @@ -158,7 +178,6 @@ class LeftToolbar extends React.Component { size={buttonSize} variant='text' startIcon={<MoveIcon />} - onClick={this.controller.handleNewFolderClick} > {messages.get(messages.MOVE)} </Button>