@@ -8,11 +8,16 @@ A higher order React component for [Sortable](https://github.com/RubaXa/Sortable
88
99The sample code can be found in the [ examples] ( https://github.com/cheton/react-sortable/tree/master/examples ) directory.
1010
11+
12+ ## Notice
13+ There is a major breaking change since v1.0. Checkout [ Migration Guide] ( https://github.com/i18next/i18next-scanner/wiki/Migration-Guide ) while upgrading from earlier versions.
14+
1115## Installation
1216
1317### Webpack or Browserify
1418The easiest way to use react-sortablejs is to install it from npm and include it in your React build process using webpack or browserify.
1519``` bash
20+ npm install --save react react-dom sortablejs # Install peerDependencies
1621npm install --save react-sortablejs
1722```
1823
@@ -24,7 +29,7 @@ You can create a standalone ES5 module as shown below:
2429$ git clone https://github.com/cheton/react-sortable.git
2530$ cd react-sortable
2631$ npm install
27- $ npm run dist
32+ $ npm run build && npm run dist
2833```
2934
3035Then, include these scripts into your html file:
@@ -38,201 +43,156 @@ Then, include these scripts into your html file:
3843</body >
3944```
4045
41- A simple example without using JSX syntax:
42- ``` js
43- var MySortable = React .createClass ({
44- displayName: ' MySortable' ,
45- getInitialState : function () {
46- return { items: [' Apple' , ' Banana' , ' Cherry' ] };
47- },
48- render : function () {
49- return (
50- React .createElement (' ul' , { ref: " list" },
51- this .state .items .map (function (item , key ) {
52- return React .createElement (' li' , { key: key }, item);
53- })
54- )
55- );
56- }
57- });
46+ ## Usage
47+ File: sortable-list.jsx
48+ ``` jsx
49+ import React from ' react' ;
50+ import Sortable from ' react-sortable' ;
5851
59- ReactDOM . render (
60- React . createElement ( SortableMixin . default ({ ref : ' list ' , model : ' items' })(MySortable), null ),
61- document . getElementById ( ' container ' )
62- );
63- ```
52+ // Functional Component
53+ const SortableList = ({ items }) => {
54+ let sortable = null ; // the sortable instance
55+
56+ items = items . map (( val , key ) => ( < li key = {key} data - id = {val} > List Item : {val} < / li > ));
6457
65- ## Options
58+ return (
59+ < Sortable
60+ // Sortable options
61+ options= {{
62+ // See all options at https://github.com/RubaXa/Sortable#options
63+ }}
64+
65+ // Use ref to get the sortable instance
66+ ref= {(c ) => {
67+ if (c) {
68+ sortable = c .sortable ;
69+ }
70+ }}
71+
72+ // An optional tag to specify the wrapping element. Defaults to "div".
73+ tag= " ul"
74+
75+ // The optional onChange method allows you to keep DOM nodes untouched
76+ // and render the sorted items via state change.
77+ // See an example at
78+ // onChange={(order) => {
79+ // this.setState({ items: order });
80+ // }}
81+ >
82+ {items}
83+ < / Sortable>
84+ );
85+ };
6686
67- #### ` ref ` option
68- Specify which items inside the ` ref ` attribute should be sortable.
87+ SortableList .propTypes = {
88+ items: React .PropTypes .array
89+ };
6990
70- #### ` model ` option
71- The state attribute for creating a sortable list.
91+ export default SortableList ;
92+ ```
7293
94+ File: index.jsx
95+ ``` jsx
96+ import React from ' react' ;
97+ import ReactDOM from ' react-dom' ;
98+ import SortableList from ' ./sortable-list' ;
7399
74- See more options at https://github.com/RubaXa/Sortable#options
75- ``` js
76- {
77- ref: ' list' ,
78- model: ' items' ,
79- onStart: ' handleStart' ,
80- onEnd: ' handleEnd' ,
81- onAdd: ' handleAdd' ,
82- onUpdate: ' handleUpdate' ,
83- onRemove: ' handleRemove' ,
84- onSort: ' handleSort' ,
85- onFilter: ' handleFilter' ,
86- onMove: ' handleMove' ,
87- // Sortable options
88- group: " name" , // or { name: "...", pull: [true, false, clone], put: [true, false, array] }
89- sort: true , // sorting inside list
90- delay: 0 , // time in milliseconds to define when the sorting should start
91- disabled: false , // Disables the sortable if set to true.
92- store: null , // @see Store
93- animation: 150 , // ms, animation speed moving items when sorting, `0` — without animation
94- handle: " .my-handle" , // Drag handle selector within list items
95- filter: " .ignore-elements" , // Selectors that do not lead to dragging (String or Function)
96- draggable: " .item" , // Specifies which items inside the element should be sortable
97- ghostClass: " sortable-ghost" , // Class name for the drop placeholder
98- chosenClass: " sortable-chosen" , // Class name for the chosen item
99- dataIdAttr: ' data-id' ,
100- forceFallback: false , // ignore the HTML5 DnD behaviour and force the fallback to kick in
101- fallbackClass: " sortable-fallback" // Class name for the cloned DOM Element when using forceFallback
102- fallbackOnBody: false // Appends the cloned DOM Element into the Document's Body
103- scroll: true , // or HTMLElement
104- scrollSensitivity: 30 , // px, how near the mouse must be to an edge to start scrolling.
105- scrollSpeed: 10 , // px
106- setData : function (dataTransfer , dragEl ) {
107- dataTransfer .setData (' Text' , dragEl .textContent );
108- }
109- }
100+ ReactDOM .render (
101+ < SortableList items= {[1 , 2 , 3 , 4 , 5 , 6 ]} / > ,
102+ document .getElementById (' container' )
103+ );
110104```
111105
112- ## Usage
106+ ## Examples
113107
108+ ### Uncontrolled Component
114109``` js
115110import React from ' react' ;
116111import Sortable from ' react-sortablejs' ;
117112
118- class MySortableList extends React .Component {
119- static propTypes = {
120- sortableInstance: React .PropTypes .object ,
121- items: React .PropTypes .array
122- };
123- static defaultProps = {
124- sortableInstance: null
125- items: []
126- };
113+ class App extends React .Component {
127114 state = {
128- items: this . props . items
115+ items: [ ' Apple ' , ' Banana ' , ' Cherry ' , ' Guava ' , ' Peach ' , ' Strawberry ' ]
129116 };
130117
131- componentDidUpdate () {
132- // Note: The sortableInstance is null for the initial render
133- const { sortableInstance } = this .props ;
134-
135- // You can see all the methods at https://github.com/RubaXa/Sortable#method
136- console .log (sortableInstance .toArray ());
137- }
138- handleStart (evt ) { // Dragging started
139- }
140- handleEnd (evt ) { // Dragging ended
141- }
142- handleAdd (evt ) { // Element is dropped into the list from another list
143- }
144- handleUpdate (evt ) { // Changed sorting within list
145- }
146- handleRemove (evt ) { // Element is removed from the list into another list
147- }
148- handleSort (evt ) { // Called by any change to the list (add / update / remove)
149- }
150- handleFilter (evt ) { // Attempt to drag a filtered element
151- }
152- handleMove (evt ) { // Event when you move an item in the list or between lists
118+ sortable = null ;
119+
120+ handleReverseOrder () {
121+ const order = this .sortable .toArray ();
122+ this .sortable .sort (order .reverse ());
153123 }
154124 render () {
155- const items = this .state .items .map ((val , index ) => (
156- < li key= {index}> {val}< / li>
157- ));
158-
159- return (
125+ const items = this .state .items .map ((val , key ) => (< li key= {key} data- id= {val}> {val}< / li> ));
126+
127+ retrun (
160128 < div>
161- < ul ref= " list" > {items}< / ul>
129+ < button type= " button" onClick= {:: this .handleReverseOrder }> Reverse Order< / button>
130+ < Sortable
131+ // Check out options at https://github.com/RubaXa/Sortable#options
132+ options= {{
133+ handle: " .my-handle" , // Drag handle selector within list items
134+ draggable: " .item" // Specifies which items inside the element should be sortable
135+ }}
136+ ref= {(c ) => {
137+ if (c) {
138+ this .sortable = sortable;
139+ }
140+ }}
141+ tag= " ul" // Defaults to "div"
142+ >
143+ {items}
144+ < / Sortable>
162145 < / div>
163146 );
164147 }
165148}
166-
167- const sortableOptions = {
168- ref: ' list' ,
169- model: ' items'
170- };
171- export default Sortable (sortableOptions)(MySortableList);
172- ```
173-
174- You can also use HOCs as ES7 decorators:
175- ``` js
176- import React from ' react' ;
177- import Sortable from ' react-sortablejs' ;
178-
179- @Sortable ({ ref: ' list' , model: ' items' })
180- export default class SortableList extends React .Component {
181- ...
182- }
183149```
184150
185- ## Examples
186-
187- ### Simple List
188-
189- File: index.jsx
190- ``` js
191- import React from ' react' ;
192- import ReactDOM from ' react-dom' ;
193- import SimpleList from ' ./simple-list' ;
151+ ### Controlled Component
194152
195- ReactDOM .render (
196- < SimpleList items= {[1 , 2 , 3 , 4 , 5 , 6 ]} / > ,
197- document .getElementById (' container' )
198- );
199- ```
200-
201- File: simple-list.jsx
202153``` js
203154import React from ' react' ;
204155import Sortable from ' react-sortablejs' ;
205156
206- const sortableOptions = {
207- ref: ' list' ,
208- model: ' items'
209- };
210-
211- class SimpleList extends React .Component {
212- static propTypes = {
213- items: React .PropTypes .array
214- };
215- static defaultProps = {
216- items: []
217- };
157+ class App extends React .Component {
218158 state = {
219- items: this . props . items
159+ items: [ ' Apple ' , ' Banana ' , ' Cherry ' , ' Guava ' , ' Peach ' , ' Strawberry ' ]
220160 };
221161
162+ sortable = null ;
163+
164+ handleReverseOrder () {
165+ const order = this .sortable .toArray ();
166+ this .sortable .sort (order .reverse ());
167+ }
222168 render () {
223- const items = this .state .items .map ((val , index ) => (
224- < li key= {index}> {val}< / li>
225- ));
169+ const items = this .state .items .map ((val , key ) => (< li key= {key} data- id= {val}> {val}< / li> ));
226170
227- return (
171+ retrun (
228172 < div>
229- < ul ref= " list" > {items}< / ul>
173+ < button type= " button" onClick= {:: this .handleReverseOrder }> Reverse Order< / button>
174+ < Sortable
175+ // Check out options at https://github.com/RubaXa/Sortable#options
176+ options= {{
177+ handle: " .my-handle" , // Drag handle selector within list items
178+ draggable: " .item" // Specifies which items inside the element should be sortable
179+ }}
180+ ref= {(c ) => {
181+ if (c) {
182+ this .sortable = sortable;
183+ }
184+ }}
185+ tag= " ul" // Defaults to "div"
186+ onChange= {(order, sortable) { // [Optional] Controlled Component
187+ this .setState ({ items: order });
188+ }}
189+ >
190+ {items}
191+ < / Sortable>
230192 < / div>
231193 );
232194 }
233195}
234-
235- export default Sortable (sortableOptions)(SimpleList);
236196```
237197
238198### Shared Group
@@ -265,35 +225,20 @@ File: shared-group.jsx
265225import React from ' react' ;
266226import Sortable from ' react-sortablejs' ;
267227
268- const sortableOptions = {
269- ref: ' list' ,
270- model: ' items' ,
271- group: ' shared'
272- };
273-
274- class SharedGroup extends React .Component {
275- static propTypes = {
276- items: React .PropTypes .array
277- };
278- static defaultProps = {
279- items: []
280- };
281- state = {
282- items: this .props .items
283- };
228+ const SharedGroup = ({ items }) => {
229+ item = items .map (item => < li> {item}< / li> );
284230
285- render () {
286- const items = this .state .items .map ((text , index ) => (
287- < li key= {index}> {text}< / li>
288- ));
289-
290- return (
291- < div>
292- < ul ref= " list" > {items}< / ul>
293- < / div>
294- );
295- }
296- }
231+ return (
232+ < Sortable
233+ options= {{
234+ group: ' shared'
235+ }}
236+ tag= " ul"
237+ >
238+ {items}
239+ < / Sortable>
240+ );
241+ };
297242
298- export default Sortable (sortableOptions)( SharedGroup) ;
243+ export default SharedGroup ;
299244```
0 commit comments