Skip to content

Commit 169df33

Browse files
authored
Merge pull request #22 from Robinsstudio/experiment
Améliorations ergonomiques diverses
2 parents c872bc0 + dd666d0 commit 169df33

5 files changed

Lines changed: 111 additions & 12 deletions

File tree

src/ExplorerView.js

Lines changed: 47 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,14 @@ class ExplorerView extends Component {
1111
this.state = {
1212
contextMenu: { visible: false },
1313
sessionView: { visible: false, sessions: [] },
14-
displayByList: false
14+
displayByList: false,
15+
copiedFile: null
1516
};
1617

1718
this.createFolder = this.createFolder.bind(this);
19+
this.copyFile = this.copyFile.bind(this);
20+
this.dropFile = this.dropFile.bind(this);
21+
this.pasteFile = this.pasteFile.bind(this);
1822
this.handleContextMenu = this.handleContextMenu.bind(this);
1923
this.hideContextMenu = this.hideContextMenu.bind(this);
2024

@@ -30,6 +34,25 @@ class ExplorerView extends Component {
3034
this.props.requestFolder(_id);
3135
}
3236

37+
copyFile(_id) {
38+
this.setState({ copiedFile: _id });
39+
}
40+
41+
pasteFile() {
42+
const { props: { folder: { active: { _id } }, refresh }, state: { copiedFile } } = this;
43+
request('Paste', { _id: copiedFile, idParent: _id }).then(() => refresh());
44+
}
45+
46+
dropFile(event, _id) {
47+
const { refresh } = this.props;
48+
['folder', 'question', 'qcm'].forEach(type => {
49+
if (event.dataTransfer.types.includes(type)) {
50+
const file = JSON.parse(event.dataTransfer.getData(type));
51+
request('Move', { _id: file._id, idParent: _id }).then(() => refresh());
52+
}
53+
});
54+
}
55+
3356
handleContextMenu(event, items = []) {
3457
const { pageX, pageY, screenX, screenY } = event;
3558
const x = screenX - window.screenX;
@@ -43,6 +66,7 @@ class ExplorerView extends Component {
4366
buildMenuItems(items) {
4467
const { create, folder, refresh } = this.props;
4568
return items.concat(
69+
{ label: 'Coller', onClick: this.pasteFile },
4670
{ label: 'Nouveau dossier', onClick: () => {
4771
Modals.showPromptModal('Nouveau dossier', 'Entrez un nom de dossier ici...').then(name => this.createFolder(name)).catch(() => {});
4872
}},
@@ -64,6 +88,8 @@ class ExplorerView extends Component {
6488
folder={folder}
6589
file={file}
6690
edit={edit}
91+
copyFile={this.copyFile}
92+
dropFile={this.dropFile}
6793
requestFolder={requestFolder}
6894
refresh={refresh}
6995
handleContextMenu={handleContextMenu}
@@ -75,6 +101,20 @@ class ExplorerView extends Component {
75101
toggleDisplay(displayByList) {
76102
this.setState({ displayByList });
77103
}
104+
105+
handleDragOver(event) {
106+
event.target.classList.add('dropZone');
107+
event.preventDefault();
108+
}
109+
110+
handleDragLeave(event) {
111+
event.target.classList.remove('dropZone');
112+
}
113+
114+
handleDrop(event, _id) {
115+
this.dropFile(event, _id);
116+
event.target.classList.remove('dropZone');
117+
}
78118

79119
render() {
80120
const {
@@ -93,7 +133,12 @@ class ExplorerView extends Component {
93133
<div id="path">
94134
{[].concat(...[{ name: 'Explorer' }, ...path].map(folder => {
95135
return [
96-
<span onClick={() => this.goBack(folder._id)}>{folder.name}</span>,
136+
<span
137+
onClick={() => this.goBack(folder._id)}
138+
onDragOver={this.handleDragOver}
139+
onDragLeave={this.handleDragLeave}
140+
onDrop={e => this.handleDrop(e, folder._id)}
141+
>{folder.name}</span>,
97142
<div className="arrow"/>
98143
]
99144
})).slice(0, -1)}

src/File.js

Lines changed: 52 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,10 @@ import request from './request';
66
class File extends Component {
77
constructor(props) {
88
super(props);
9-
this.state = { renaming: false };
9+
this.state = {
10+
renaming: false,
11+
dragging: false
12+
};
1013

1114
this.open = this.open.bind(this);
1215
this.rename = this.rename.bind(this);
@@ -15,6 +18,10 @@ class File extends Component {
1518
this.stopRenaming = this.stopRenaming.bind(this);
1619
this.handleContextMenu = this.handleContextMenu.bind(this);
1720
this.handleDragStart = this.handleDragStart.bind(this);
21+
this.handleDragEnd = this.handleDragEnd.bind(this);
22+
this.handleDragOver = this.handleDragOver.bind(this);
23+
this.handleDragLeave = this.handleDragLeave.bind(this);
24+
this.handleDrop = this.handleDrop.bind(this);
1825
}
1926

2027
open() {
@@ -65,6 +72,7 @@ class File extends Component {
6572
handleContextMenu(event) {
6673
const {
6774
file: { name, type, url, sessions, _id },
75+
copyFile,
6876
refresh,
6977
updateSessionView
7078
} = this.props;
@@ -89,7 +97,8 @@ class File extends Component {
8997
label: 'Supprimer',
9098
onClick: () => Modals.showConfirmModal('Supprimer', `Voulez-vous vraiment supprimer ${name} ?`)
9199
.then(this.remove).catch(() => {})
92-
}
100+
},
101+
{ label: 'Copier', onClick: () => copyFile(_id) }
93102
]
94103
.concat(type === 'qcm' ? sharedLinkItem : [])
95104
.concat(type === 'qcm' ? resultsItem : []);
@@ -99,15 +108,53 @@ class File extends Component {
99108

100109
handleDragStart(event) {
101110
const { file } = this.props;
102-
if (file.type === 'question') {
103-
event.dataTransfer.setData('question', JSON.stringify(file));
111+
event.dataTransfer.setData(file.type, JSON.stringify(file));
112+
this.setState({ dragging: true });
113+
}
114+
115+
handleDragEnd() {
116+
this.setState({ dragging: false });
117+
}
118+
119+
handleDragOver(event) {
120+
const { dragging } = this.state;
121+
const element = event.target;
122+
if (!dragging && element.classList.contains('folder')) {
123+
element.classList.add('grow');
124+
}
125+
event.preventDefault();
126+
}
127+
128+
handleDragLeave(event) {
129+
const element = event.target;
130+
element.classList.remove('grow');
131+
}
132+
133+
handleDrop(event) {
134+
const { props: { file: { _id }, dropFile }, state: { dragging } } = this;
135+
const element = event.target;
136+
137+
if (!dragging && element.classList.contains('folder')) {
138+
dropFile(event, _id);
139+
element.classList.remove('grow');
104140
}
105141
}
106142

107143
render() {
108144
const { props: { file: { type, name } }, state: { renaming } } = this;
145+
109146
return (
110-
<div className={`file ${renaming ? 'renaming' : ''}`} onDoubleClick={this.open} onContextMenu={this.handleContextMenu} onDragStart={this.handleDragStart} draggable>
147+
<div
148+
className={`file ${renaming ? 'renaming' : ''}`}
149+
onDoubleClick={this.open}
150+
onContextMenu={this.handleContextMenu}
151+
onDragStart={this.handleDragStart}
152+
onDragEnd={this.handleDragEnd}
153+
onDragOver={this.handleDragOver}
154+
onDragLeave={this.handleDragLeave}
155+
onDrop={this.handleDrop}
156+
draggable
157+
>
111158
<div className={type}/>
112159
<div className="fileName">
113160
{(renaming) ? <AutoFocusInput value={name} onStopEditing={this.stopRenaming}/> : name}

src/style/editor.css

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,4 @@
1313

1414
.stretch {
1515
flex-grow: 1;
16-
}
17-
18-
.dropZone {
19-
border: 1px blue dotted;
20-
background-color: rgba(98, 156, 201, .5);
2116
}

src/style/explorer.css

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,12 @@
6969
.folder, .question, .qcm {
7070
width: 100px;
7171
height: 100px;
72+
transition: transform .2s ease-in-out;
73+
}
74+
75+
.folder.grow {
76+
transform: scale(1.2);
77+
transition: transform .2s ease-in-out;
7278
}
7379

7480
.list .folder, .list .question, .list .qcm {
@@ -102,6 +108,7 @@
102108
.renaming .fileName {
103109
width: auto;
104110
overflow: visible;
111+
z-index: 1;
105112
}
106113

107114
.list .fileName {

src/style/global.css

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,4 +44,9 @@
4444
flex: 1 0;
4545
padding: 5px;
4646
overflow: auto;
47+
}
48+
49+
.dropZone {
50+
border: 1px blue dotted;
51+
background-color: rgba(98, 156, 201, .5);
4752
}

0 commit comments

Comments
 (0)