From 6bdf6286c8d68364629fb43ac6aa698becbde44e Mon Sep 17 00:00:00 2001 From: James Date: Sat, 23 Mar 2019 16:11:13 -0400 Subject: [PATCH] begins Media file type --- demo/Page/Page.config.js | 6 ++ demo/Page/components/Edit/index.js | 7 ++ nodemon.json | 3 +- src/components.js | 3 + src/components/controls/Button/index.js | 40 ++++----- src/components/controls/Button/index.scss | 2 +- src/components/field-types/File/index.js | 28 ------ src/components/field-types/Media/index.js | 53 ++++++++++++ .../field-types/{File => Media}/index.scss | 0 src/components/modules/DragAndDrop/index.js | 85 +++++++++++++++++++ src/components/modules/DragAndDrop/index.scss | 22 +++++ 11 files changed, 199 insertions(+), 50 deletions(-) delete mode 100644 src/components/field-types/File/index.js create mode 100644 src/components/field-types/Media/index.js rename src/components/field-types/{File => Media}/index.scss (100%) create mode 100644 src/components/modules/DragAndDrop/index.js create mode 100644 src/components/modules/DragAndDrop/index.scss diff --git a/demo/Page/Page.config.js b/demo/Page/Page.config.js index 7001a3b7e7..2044f7e373 100644 --- a/demo/Page/Page.config.js +++ b/demo/Page/Page.config.js @@ -19,6 +19,12 @@ export default { height: 100, required: true }, + { + name: 'image', + label: 'Image', + type: 'media', + required: true + }, { name: 'slides', label: 'Slides', diff --git a/demo/Page/components/Edit/index.js b/demo/Page/components/Edit/index.js index 73b2e84e7a..61ecdeb1d0 100644 --- a/demo/Page/components/Edit/index.js +++ b/demo/Page/components/Edit/index.js @@ -8,6 +8,7 @@ import { Form, Input, Textarea, + Media, Group, FormSubmit, Repeater @@ -51,6 +52,12 @@ const Edit = props => { height={100} required /> + + - {this.props.children} - - ); + case 'link': + return ( + + {this.props.children} + + ); - case 'anchor': - return ( - - {this.props.children} - - ); + case 'anchor': + return ( + + {this.props.children} + + ); - default: - return ( - - ); + default: + return ( + + ); } } } diff --git a/src/components/controls/Button/index.scss b/src/components/controls/Button/index.scss index 73a6994cb3..ebca024eb1 100644 --- a/src/components/controls/Button/index.scss +++ b/src/components/controls/Button/index.scss @@ -23,7 +23,7 @@ &.btn-secondary { border: $stroke-width solid $primary; - color: $primary; + color: $black; background: none; &.btn-icon { diff --git a/src/components/field-types/File/index.js b/src/components/field-types/File/index.js deleted file mode 100644 index ba13272ba2..0000000000 --- a/src/components/field-types/File/index.js +++ /dev/null @@ -1,28 +0,0 @@ -import React from 'react'; -import { fieldType } from 'payload/components'; - -import './index.scss'; - -const error = 'There was a problem uploading your file.'; - -const validate = () => true; - -const File = props => { - return ( -
- -
- ) -} - -export default fieldType(File, 'file', validate, error); diff --git a/src/components/field-types/Media/index.js b/src/components/field-types/Media/index.js new file mode 100644 index 0000000000..7350327ad7 --- /dev/null +++ b/src/components/field-types/Media/index.js @@ -0,0 +1,53 @@ +import React, { Component } from 'react'; +import { fieldType, DragAndDrop } from 'payload/components'; + +import './index.scss'; + +const error = 'There was a problem uploading your file.'; + +const validate = () => true; + +class Media extends Component { + + constructor(props) { + super(props); + + this.state = { + file: this.props.initialValue + } + + this.inputRef = React.createRef(); + } + + handleDrop = file => { + this.inputRef.current.files = file; + } + + handleSelectFile = () => { + this.inputRef.current.click(); + } + + render() { + return ( +
+ {this.props.label} + + {!this.props.value && + + } +
+ ) + } +} + +export default fieldType(Media, 'media', validate, error); diff --git a/src/components/field-types/File/index.scss b/src/components/field-types/Media/index.scss similarity index 100% rename from src/components/field-types/File/index.scss rename to src/components/field-types/Media/index.scss diff --git a/src/components/modules/DragAndDrop/index.js b/src/components/modules/DragAndDrop/index.js new file mode 100644 index 0000000000..cd72f3391f --- /dev/null +++ b/src/components/modules/DragAndDrop/index.js @@ -0,0 +1,85 @@ +import React, { Component } from 'react'; +import { Button } from 'payload/components'; + +import './index.scss'; + +class DragAndDrop extends Component { + + constructor() { + super(); + + this.state = { + dragging: false + } + + this.dropRef = React.createRef(); + this.dragCounter = 0; + } + + componentDidMount() { + let div = this.dropRef.current + div.addEventListener('dragenter', this.handleDragIn) + div.addEventListener('dragleave', this.handleDragOut) + div.addEventListener('dragover', this.handleDrag) + div.addEventListener('drop', this.handleDrop) + } + + componentWillUnmount() { + let div = this.dropRef.current + div.removeEventListener('dragenter', this.handleDragIn) + div.removeEventListener('dragleave', this.handleDragOut) + div.removeEventListener('dragover', this.handleDrag) + div.removeEventListener('drop', this.handleDrop) + } + + handleDrag = e => { + e.preventDefault(); + e.stopPropagation(); + } + + handleDragIn = e => { + e.preventDefault(); + e.stopPropagation(); + this.dragCounter++; + if (e.dataTransfer.items && e.dataTransfer.items.length > 0) { + this.setState({ dragging: true }) + } + } + + handleDragOut = e => { + e.preventDefault(); + e.stopPropagation(); + this.dragCounter--; + if (this.dragCounter > 0) return; + this.setState({ dragging: false }) + } + + handleDrop = e => { + e.preventDefault(); + e.stopPropagation(); + this.setState({ dragging: false }) + if (e.dataTransfer.files && e.dataTransfer.files.length > 0) { + this.props.handleDrop(e.dataTransfer.files) + e.dataTransfer.clearData() + this.dragCounter = 0 + } + } + + onSelectFile = e => { + e.preventDefault(); + e.stopPropagation(); + this.props.handleSelectFile(); + } + + render() { + return ( +
+ Drag and drop a file here + —or— + +
+ ) + } +} + +export default DragAndDrop; diff --git a/src/components/modules/DragAndDrop/index.scss b/src/components/modules/DragAndDrop/index.scss new file mode 100644 index 0000000000..39679fe3af --- /dev/null +++ b/src/components/modules/DragAndDrop/index.scss @@ -0,0 +1,22 @@ +@import '~payload/scss/styles'; + +.drag-and-drop { + padding: rem(1); + display: flex; + align-items: center; + flex-direction: column; + border: $stroke-width solid $primary; + + &.dragging { + background: rgba($primary, .1); + } + + .or { + @extend %uppercase-label; + display: block; + } + + .btn { + margin: rem(.125) 0 0; + } +}