Skip to content

Commit 7b4d2f3

Browse files
authored
Merge pull request #1617 from pfftdammitchris/folder-dragging
Folders in the side nav are now draggable
2 parents ccce75a + 5aa7ef5 commit 7b4d2f3

File tree

3 files changed

+51
-29
lines changed

3 files changed

+51
-29
lines changed

browser/components/StorageItem.js

Lines changed: 26 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import React from 'react'
66
import styles from './StorageItem.styl'
77
import CSSModules from 'browser/lib/CSSModules'
88
import _ from 'lodash'
9+
import { SortableHandle } from 'react-sortable-hoc'
910

1011
/**
1112
* @param {boolean} isActive
@@ -23,32 +24,35 @@ import _ from 'lodash'
2324
const StorageItem = ({
2425
isActive, handleButtonClick, handleContextMenu, folderName,
2526
folderColor, isFolded, noteCount, handleDrop, handleDragEnter, handleDragLeave
26-
}) => (
27-
<button styleName={isActive
27+
}) => {
28+
const FolderDragger = SortableHandle(({ className }) => <i className={className} />)
29+
return (
30+
<button styleName={isActive
2831
? 'folderList-item--active'
2932
: 'folderList-item'
3033
}
31-
onClick={handleButtonClick}
32-
onContextMenu={handleContextMenu}
33-
onDrop={handleDrop}
34-
onDragEnter={handleDragEnter}
35-
onDragLeave={handleDragLeave}
36-
>
37-
<span styleName={isFolded
38-
? 'folderList-item-name--folded' : 'folderList-item-name'
39-
}>
40-
<text style={{color: folderColor, paddingRight: '10px'}}>{isActive ? <i className='fa fa-folder-open-o' /> : <i className='fa fa-folder-o' />}</text>{isFolded ? _.truncate(folderName, {length: 1, omission: ''}) : folderName}
41-
</span>
42-
{(!isFolded && _.isNumber(noteCount)) &&
43-
<span styleName='folderList-item-noteCount'>{noteCount}</span>
44-
}
45-
{isFolded &&
46-
<span styleName='folderList-item-tooltip'>
47-
{folderName}
34+
onClick={handleButtonClick}
35+
onContextMenu={handleContextMenu}
36+
onDrop={handleDrop}
37+
onDragEnter={handleDragEnter}
38+
onDragLeave={handleDragLeave}
39+
>
40+
<span styleName={isFolded
41+
? 'folderList-item-name--folded' : 'folderList-item-name'
42+
}>
43+
<text style={{color: folderColor, paddingRight: '10px'}}>{isActive ? <FolderDragger className='fa fa-folder-open-o' /> : <FolderDragger className='fa fa-folder-o' />}</text>{isFolded ? _.truncate(folderName, {length: 1, omission: ''}) : folderName}
4844
</span>
49-
}
50-
</button>
51-
)
45+
{(!isFolded && _.isNumber(noteCount)) &&
46+
<span styleName='folderList-item-noteCount'>{noteCount}</span>
47+
}
48+
{isFolded &&
49+
<span styleName='folderList-item-tooltip'>
50+
{folderName}
51+
</span>
52+
}
53+
</button>
54+
)
55+
}
5256

5357
StorageItem.propTypes = {
5458
isActive: PropTypes.bool.isRequired,

browser/main/SideNav/StorageItem.js

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import RenameFolderModal from 'browser/main/modals/RenameFolderModal'
99
import dataApi from 'browser/main/lib/dataApi'
1010
import StorageItemChild from 'browser/components/StorageItem'
1111
import _ from 'lodash'
12+
import { SortableElement } from 'react-sortable-hoc'
1213

1314
const { remote } = require('electron')
1415
const { Menu, dialog } = remote
@@ -219,7 +220,8 @@ class StorageItem extends React.Component {
219220
render () {
220221
const { storage, location, isFolded, data, dispatch } = this.props
221222
const { folderNoteMap, trashedSet } = data
222-
const folderList = storage.folders.map((folder) => {
223+
const SortableStorageItemChild = SortableElement(StorageItemChild)
224+
const folderList = storage.folders.map((folder, index) => {
223225
const isActive = !!(location.pathname.match(new RegExp('\/storages\/' + storage.key + '\/folders\/' + folder.key)))
224226
const noteSet = folderNoteMap.get(storage.key + '-' + folder.key)
225227

@@ -233,8 +235,9 @@ class StorageItem extends React.Component {
233235
noteCount = noteSet.size - trashedNoteCount
234236
}
235237
return (
236-
<StorageItemChild
238+
<SortableStorageItemChild
237239
key={folder.key}
240+
index={index}
238241
isActive={isActive}
239242
handleButtonClick={(e) => this.handleFolderButtonClick(folder.key)(e)}
240243
handleContextMenu={(e) => this.handleFolderButtonContextMenu(e, folder)}
@@ -256,9 +259,9 @@ class StorageItem extends React.Component {
256259
key={storage.key}
257260
>
258261
<div styleName={isActive
259-
? 'header--active'
260-
: 'header'
261-
}
262+
? 'header--active'
263+
: 'header'
264+
}
262265
onContextMenu={(e) => this.handleHeaderContextMenu(e)}
263266
>
264267
<button styleName='header-toggleButton'
@@ -267,7 +270,7 @@ class StorageItem extends React.Component {
267270
<img src={this.state.isOpen
268271
? '../resources/icon/icon-down.svg'
269272
: '../resources/icon/icon-right.svg'
270-
}
273+
}
271274
/>
272275
</button>
273276

browser/main/SideNav/index.js

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import EventEmitter from 'browser/main/lib/eventEmitter'
1717
import PreferenceButton from './PreferenceButton'
1818
import ListButton from './ListButton'
1919
import TagButton from './TagButton'
20+
import {SortableContainer} from 'react-sortable-hoc'
2021

2122
class SideNav extends React.Component {
2223
// TODO: should not use electron stuff v0.7
@@ -68,6 +69,17 @@ class SideNav extends React.Component {
6869
router.push('/alltags')
6970
}
7071

72+
onSortEnd (storage) {
73+
return ({oldIndex, newIndex}) => {
74+
const { dispatch } = this.props
75+
dataApi
76+
.reorderFolder(storage.key, oldIndex, newIndex)
77+
.then((data) => {
78+
dispatch({ type: 'REORDER_FOLDER', storage: data.storage })
79+
})
80+
}
81+
}
82+
7183
SideNavComponent (isFolded, storageList) {
7284
const { location, data } = this.props
7385

@@ -180,13 +192,16 @@ class SideNav extends React.Component {
180192
const isFolded = config.isSideNavFolded
181193

182194
const storageList = data.storageMap.map((storage, key) => {
183-
return <StorageItem
195+
const SortableStorageItem = SortableContainer(StorageItem)
196+
return <SortableStorageItem
184197
key={storage.key}
185198
storage={storage}
186199
data={data}
187200
location={location}
188201
isFolded={isFolded}
189202
dispatch={dispatch}
203+
onSortEnd={this.onSortEnd.bind(this)(storage)}
204+
useDragHandle
190205
/>
191206
})
192207
const style = {}

0 commit comments

Comments
 (0)