From e70b1ad3421af607e725db93622f0bc6369c3065 Mon Sep 17 00:00:00 2001 From: Param Aggarwal Date: Sat, 27 Sep 2014 17:28:37 +0530 Subject: [PATCH] Initial commit --- .gitignore | 28 ++++++++++++++++++ LICENSE | 22 +++++++++++++++ README.md | 46 ++++++++++++++++++++++++++++++ index.js | 75 +++++++++++++++++++++++++++++++++++++++++++++++++ package.json | 33 ++++++++++++++++++++++ screenshot.png | Bin 0 -> 10259 bytes 6 files changed, 204 insertions(+) create mode 100644 .gitignore create mode 100644 LICENSE create mode 100644 README.md create mode 100755 index.js create mode 100755 package.json create mode 100644 screenshot.png diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..59d842ba --- /dev/null +++ b/.gitignore @@ -0,0 +1,28 @@ +# Logs +logs +*.log + +# Runtime data +pids +*.pid +*.seed + +# Directory for instrumented libs generated by jscoverage/JSCover +lib-cov + +# Coverage directory used by tools like istanbul +coverage + +# Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) +.grunt + +# Compiled binary addons (http://nodejs.org/api/addons.html) +build/Release + +# Dependency directory +# Commenting this out is preferred by some people, see +# https://www.npmjs.org/doc/misc/npm-faq.html#should-i-check-my-node_modules-folder-into-git- +node_modules + +# Users Environment Variables +.lock-wscript diff --git a/LICENSE b/LICENSE new file mode 100644 index 00000000..863075c4 --- /dev/null +++ b/LICENSE @@ -0,0 +1,22 @@ +The MIT License (MIT) + +Copyright (c) 2014 Param Aggarwal + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + diff --git a/README.md b/README.md new file mode 100644 index 00000000..c6c67d90 --- /dev/null +++ b/README.md @@ -0,0 +1,46 @@ +react-dropzone +================= + +Simple HTML5 drag-drop zone in React.js. + +![Screenshot of dropzone](https://raw.githubusercontent.com/paramaggarwal/react-dropzone/master/screenshot.png) + +Usage +===== + +Simply `require()` the module and specify a `handler` property as a function that accepts the dropped file. + +You may additionally pass in a CSS size for the dropzone using the `size` property. + +```jsx + +var Dropzone = require('react-dropzone'); + +var component = React.createClass({ + + fileHandler: function(file) { + uploadScript(file, uploadURL, function(err, res) { + if (res.code == 200) {console.log("Upload success.")} + }); + } + }, + + render: function() { + return ( +
+ +
+ ); + } +}); +``` + +Author +====== + +Param Aggarwal (paramaggarwal@gmail.com) + +License +======= + +MIT \ No newline at end of file diff --git a/index.js b/index.js new file mode 100755 index 00000000..3f6564d5 --- /dev/null +++ b/index.js @@ -0,0 +1,75 @@ +/** + * @jsx React.DOM + */ +'use strict'; + +var React = require('react'); + +var component = React.createClass({ + + getInitialState: function() { + return { + isDragActive: false + } + }, + + dragLeaveHandler: function(e) { + this.setState({ + isDragActive: false + }); + }, + + dragOverHandler: function(e) { + e.preventDefault(); + e.dataTransfer.dropEffect = "copy"; + + this.setState({ + isDragActive: true + }); + }, + + dropHandler: function(e) { + e.preventDefault(); + + this.setState({ + isDragActive: false + }); + + if (this.props.handler) { + var file = e.dataTransfer && e.dataTransfer.files && e.dataTransfer.files[0]; + this.props.handler(file); + } + }, + + render: function() { + + var size = this.props.size || "100pt"; + var dropzoneStyle = { + width: size, + height: size, + borderRadius: "10%", + borderWidth: "2pt", + borderColor: "#666", + borderStyle: this.state.isDragActive ? "solid" : "dashed" + }; + + var messageStyle = { + display: "table-cell", + width: size, + height: size, + textAlign: "center", + verticalAlign: "middle", + fontSize: "10pt", + textTransform: "uppercase", + color: "#666" + }; + + return ( +
+ Drop Here +
+ ); + } +}); + +module.exports = component; \ No newline at end of file diff --git a/package.json b/package.json new file mode 100755 index 00000000..a92a300e --- /dev/null +++ b/package.json @@ -0,0 +1,33 @@ +{ + "name": "react-dropzone", + "version": "0.1.0", + "description": "Simple HTML5 drag-drop zone in React", + "main": "index.js", + "keywords": [ + "react-component", + "react", + "drag", + "drop", + "upload" + ], + "browserify": { + "transform": [ + [ + "reactify", + { + "harmony": true + } + ] + ] + }, + "repository": { + "type": "git", + "url": "git@github.com:paramaggarwal/react-dropzone.git" + }, + "bugs": { + "url": "https://github.com/paramaggarwal/react-dropzone/issues" + }, + "homepage": "https://github.com/paramaggarwal/react-dropzone", + "author": "Param Aggarwal", + "license": "MIT" +} diff --git a/screenshot.png b/screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..60d4ff6a147825d8009c68585114cbd821b36965 GIT binary patch literal 10259 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 literal 0 HcmV?d00001