diff --git a/client/components/file-picker/README.md b/client/components/file-picker/README.md new file mode 100644 index 00000000000000..34ddad3f033970 --- /dev/null +++ b/client/components/file-picker/README.md @@ -0,0 +1,28 @@ +FilePicker +========== + +This component opens a native file picker when its children are clicked on. +It is a very thin wrapper around +[`component/file-picker`](https://github.com/component/file-picker) + +#### How to use: + +```js +var FilePicker = require( 'components/file-picker' ); + +render: function() { + return ( + + Select a few images! + + ); +} +``` + +#### Props + +* `multiple`: (bool) Allow selecting multiple files (Defaults to `false`). +* `directory`: (bool) Allow selecting of a directory (Defaults to `false`). +* `accept`: (string) Content type MIME to accept. Wildcards (`*`) are supported. +* `onPick`: (func) Function to call when the user has selected one or more files. + diff --git a/client/components/file-picker/docs/example.jsx b/client/components/file-picker/docs/example.jsx new file mode 100644 index 00000000000000..1a4b8d88e37049 --- /dev/null +++ b/client/components/file-picker/docs/example.jsx @@ -0,0 +1,68 @@ +/** + * External dependencies + */ +import React from 'react'; + +/** + * Internal dependencies + */ +import Card from 'components/card'; +import Button from 'components/button'; +import FilePicker from 'components/file-picker'; + +export default class FilePickers extends React.Component { + constructor( props ) { + super( props ); + } + + onSingle( files ) { + alert( 'Selected file: ' + JSON.stringify( files[0].name ) ); + } + + onMulti( files ) { + alert( 'Selected files:\n' + [].slice.call( files ).map( ( file ) => { + return ' ' + JSON.stringify( file.name ); + } ).join( '\n' ) ); + } + + render() { + return ( +
+

+ File Picker +

+ + + +

Select a single file:

+ + + + +

Select a multiple files:

+ + + + +

Select a directory:

+ + + + +

Select an image file:

+ + + + +

Any internal content works:

+ + Select Fileā€¦ + + +
+
+ ); + } +} + +FilePickers.displayName = 'FilePickers'; diff --git a/client/components/file-picker/index.jsx b/client/components/file-picker/index.jsx new file mode 100644 index 00000000000000..52ebb4a038063c --- /dev/null +++ b/client/components/file-picker/index.jsx @@ -0,0 +1,44 @@ +/** @ssr-ready **/ + +/** + * External dependencies + */ +import React from 'react'; +import assign from 'lodash/assign'; +import noop from 'lodash/noop'; +import pick from 'component-file-picker'; + +export default class FilePicker extends React.Component { + constructor( props ) { + super( props ); + this.showPicker = this.showPicker.bind( this ); + } + + showPicker() { + pick( assign( {}, this.props ), this.props.onPick ); + } + + render() { + return ( + + { this.props.children } + + ); + } +} + +FilePicker.displayName = 'FilePicker'; + +FilePicker.propTypes = { + multiple: React.PropTypes.bool, + directory: React.PropTypes.bool, + accept: React.PropTypes.string, + onPick: React.PropTypes.func +}; + +FilePicker.defaultProps = { + multiple: false, + directory: false, + accept: null, + onPick: noop +}; diff --git a/client/devdocs/design/index.jsx b/client/devdocs/design/index.jsx index 9ad032101d7f0d..882cf6cd3c5d4a 100644 --- a/client/devdocs/design/index.jsx +++ b/client/devdocs/design/index.jsx @@ -48,6 +48,7 @@ import Version from 'components/version/docs/example'; import BulkSelect from 'components/bulk-select/docs/example'; import ExternalLink from 'components/external-link/docs/example'; import FeatureGate from 'components/feature-example/docs/example'; +import FilePickers from 'components/file-picker/docs/example'; import Collection from 'devdocs/design/search-collection'; export default React.createClass( { @@ -94,6 +95,7 @@ export default React.createClass( { + diff --git a/npm-shrinkwrap.json b/npm-shrinkwrap.json index 551df088433a89..fc6a6d529de7ad 100644 --- a/npm-shrinkwrap.json +++ b/npm-shrinkwrap.json @@ -8553,6 +8553,14 @@ }, "semver": { "version": "5.1.0" + }, + "component-file-picker": { + "version": "0.2.1", + "dependencies": { + "component-event": { + "version": "0.1.4" + } + } } } } diff --git a/package.json b/package.json index 4c38c43e585767..459ed8dfa7901b 100644 --- a/package.json +++ b/package.json @@ -28,6 +28,7 @@ "commander": "2.3.0", "component-classes": "1.2.1", "component-closest": "0.1.4", + "component-file-picker": "0.2.1", "component-tip": "2.5.0", "component-uid": "0.0.2", "cookie": "0.1.2",