- {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;
+ }
+}