Skip to content

Commit cfe7537

Browse files
committed
Merge pull request #264 from parallaxinc/overwriteOverlay
adds confirm dialog on overwrite
2 parents dd5e5d4 + 6cb1c65 commit cfe7537

13 files changed

+148
-7
lines changed

src/constants/action-types.js

+1
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ const actionTypes = {
2525
UPDATE_DOWNLOAD_PROGRESS: 'UPDATE_DOWNLOAD_PROGRESS',
2626
QUEUE_NEW_FILE: 'QUEUE_NEW_FILE',
2727
QUEUE_CHANGE_FILE: 'QUEUE_CHANGE_FILE',
28+
QUEUE_OVERWRITE_FILE: 'QUEUE_OVERWRITE_FILE',
2829
RESET_ACTION_QUEUE: 'RESET_ACTION_QUEUE'
2930
};
3031

src/constants/overlay-states.js

+1
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ const overlayStates = {
66
SAVE_OVERLAY: 'SAVE_OVERLAY',
77
DOWNLOAD_OVERLAY: 'DOWNLOAD_OVERLAY',
88
PROJECTS_OVERLAY: 'PROJECTS_OVERLAY',
9+
OVERWRITE_OVERLAY: 'OVERWRITE_OVERLAY',
910
DELETE_FILE_OVERLAY: 'DELETE_FILE_OVERLAY',
1011
DELETE_PROJECT_OVERLAY: 'DELETE_PROJECT_OVERLAY'
1112
};

src/constants/queued-action-types.js

+2-1
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,8 @@
22

33
const queuedActionTypes = {
44
NEW_FILE: 'NEW_FILE',
5-
CHANGE_FILE: 'CHANGE_FILE'
5+
CHANGE_FILE: 'CHANGE_FILE',
6+
OVERWRITE_FILE: 'OVERWRITE_FILE'
67
};
78

89
module.exports = queuedActionTypes;

src/creators/index.js

+2
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ const creators = {
77
showDeleteProjectOverlay: require('./show-delete-project-overlay'),
88
showDownloadOverlay: require('./show-download-overlay'),
99
showProjectsOverlay: require('./show-projects-overlay'),
10+
showOverwriteOverlay: require('./show-overwrite-overlay'),
1011
showSaveOverlay: require('./show-save-overlay'),
1112
showHelpOverlay: require('./show-help-overlay'),
1213
hideOverlay: require('./hide-overlay'),
@@ -34,6 +35,7 @@ const creators = {
3435
// action queue creators
3536
queueNewFile: require('./queue-new-file'),
3637
queueChangeFile: require('./queue-change-file'),
38+
queueOverwriteFile: require('./queue-overwrite-file'),
3739
resetActionQueue: require('./reset-action-queue')
3840
};
3941

src/creators/queue-overwrite-file.js

+16
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
'use strict';
2+
3+
const {
4+
QUEUE_OVERWRITE_FILE
5+
} = require('../constants/action-types');
6+
7+
function queueOverwriteFile(filename){
8+
return {
9+
type: QUEUE_OVERWRITE_FILE,
10+
payload: {
11+
filename
12+
}
13+
};
14+
}
15+
16+
module.exports = queueOverwriteFile;
+20
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
'use strict';
2+
3+
const {
4+
SHOW_OVERLAY
5+
} = require('../constants/action-types');
6+
7+
const {
8+
OVERWRITE_OVERLAY
9+
} = require('../constants/overlay-states');
10+
11+
function showOverwriteOverlay(){
12+
return {
13+
type: SHOW_OVERLAY,
14+
payload: {
15+
state: OVERWRITE_OVERLAY
16+
}
17+
};
18+
}
19+
20+
module.exports = showOverwriteOverlay;

src/lib/documents.js

+4
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,10 @@ class Documents {
4747
this._editor.swapDoc(doc);
4848
return doc;
4949
}
50+
51+
replace(filename){
52+
this._documents[filename] = this._editor.getDoc();
53+
}
5054
}
5155

5256
module.exports = Documents;

src/plugins/handlers.js

+22-4
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,8 @@ const highlighter = require('../lib/highlighter');
1515

1616
const {
1717
NEW_FILE,
18-
CHANGE_FILE
18+
CHANGE_FILE,
19+
OVERWRITE_FILE
1920
} = require('../constants/queued-action-types');
2021

2122
// TODO: move somewhere else?
@@ -71,6 +72,8 @@ function handlers(app, opts, done){
7172
return newFile();
7273
case CHANGE_FILE:
7374
return changeFile(nextFile);
75+
case OVERWRITE_FILE:
76+
return saveFileAs(nextFile, true);
7477
}
7578
}
7679

@@ -117,23 +120,32 @@ function handlers(app, opts, done){
117120
.then(function(){
118121
documents.swap(path.join(cwd, filename));
119122
});
123+
store.dispatch(creators.hideOverlay());
120124
}
121125
}
122126

123-
function saveFileAs(filename){
127+
function saveFileAs(filename, overwrite){
124128
if(!filename){
125129
return;
126130
}
127131

128-
const { cwd, content } = workspace.getState();
132+
const { cwd, content, directory } = workspace.getState();
133+
if(!overwrite && _.filter(directory, {name: filename}).length){
134+
return showOverwriteOverlay(filename);
135+
}
129136

130137
workspace.updateFilename(filename)
131138
.then(() => workspace.saveFile(filename, content))
132139
.then(() => userConfig.set('last-file', filename))
133140
.then(function(){
134-
documents.swap(path.join(cwd, filename));
141+
documents.replace(path.join(cwd, filename));
135142
handleActionQueue();
136143
});
144+
store.dispatch(creators.hideOverlay());
145+
}
146+
147+
function overwriteFile(){
148+
handleActionQueue();
137149
}
138150

139151
function dontSaveFile(){
@@ -233,6 +245,11 @@ function handlers(app, opts, done){
233245
store.dispatch(creators.showSaveOverlay());
234246
}
235247

248+
function showOverwriteOverlay(name){
249+
store.dispatch(creators.queueOverwriteFile(name));
250+
store.dispatch(creators.showOverwriteOverlay());
251+
}
252+
236253
function showDownloadOverlay(){
237254
store.dispatch(creators.showDownloadOverlay());
238255
// TODO: is there ever a time when show download overlay doesn't reload devices?
@@ -571,6 +588,7 @@ function handlers(app, opts, done){
571588
deleteFile,
572589
changeFile,
573590
dontSaveFile,
591+
overwriteFile,
574592
// project methods
575593
changeProject,
576594
deleteProject,

src/plugins/overlays.js

+5
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ const HelpOverlay = require('../views/help-overlay');
66
const SaveOverlay = require('../views/save-overlay');
77
const ProjectOverlay = require('../views/project-overlay');
88
const DownloadOverlay = require('../views/download-overlay');
9+
const OverwriteOverlay = require('../views/overwrite-overlay');
910
const DeleteFileOverlay = require('../views/delete-file-overlay');
1011
const DeleteProjectOverlay = require('../views/delete-project-overlay');
1112

@@ -17,6 +18,7 @@ const {
1718
SAVE_OVERLAY,
1819
DOWNLOAD_OVERLAY,
1920
PROJECTS_OVERLAY,
21+
OVERWRITE_OVERLAY,
2022
DELETE_FILE_OVERLAY,
2123
DELETE_PROJECT_OVERLAY
2224
} = require('../constants/overlay-states');
@@ -43,6 +45,9 @@ function overlays(app, opts, done){
4345
case SAVE_OVERLAY:
4446
renderOverlay(<SaveOverlay workspace={workspace} handlers={handlers} />);
4547
break;
48+
case OVERWRITE_OVERLAY:
49+
renderOverlay(<OverwriteOverlay store={store} handlers={handlers} />);
50+
break;
4651
case DOWNLOAD_OVERLAY:
4752
renderOverlay(<DownloadOverlay store={store} handlers={handlers} />);
4853
break;

src/reducers/next-action.js

+5-1
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,14 @@
33
const {
44
QUEUE_NEW_FILE,
55
QUEUE_CHANGE_FILE,
6+
QUEUE_OVERWRITE_FILE,
67
RESET_ACTION_QUEUE
78
} = require('../constants/action-types');
89

910
const {
1011
NEW_FILE,
11-
CHANGE_FILE
12+
CHANGE_FILE,
13+
OVERWRITE_FILE
1214
} = require('../constants/queued-action-types');
1315

1416
const initial = '';
@@ -19,6 +21,8 @@ function nextAction(state = initial, { type }){
1921
return NEW_FILE;
2022
case QUEUE_CHANGE_FILE:
2123
return CHANGE_FILE;
24+
case QUEUE_OVERWRITE_FILE:
25+
return OVERWRITE_FILE;
2226
case RESET_ACTION_QUEUE:
2327
return initial;
2428
default:

src/reducers/next-file.js

+3
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
const {
44
QUEUE_CHANGE_FILE,
5+
QUEUE_OVERWRITE_FILE,
56
RESET_ACTION_QUEUE
67
} = require('../constants/action-types');
78

@@ -11,6 +12,8 @@ function nextFile(state = initial, { type, payload }){
1112
switch(type){
1213
case QUEUE_CHANGE_FILE:
1314
return payload.filename;
15+
case QUEUE_OVERWRITE_FILE:
16+
return payload.filename;
1417
case RESET_ACTION_QUEUE:
1518
return initial;
1619
default:

src/views/overwrite-overlay.js

+67
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
'use strict';
2+
3+
const React = require('react');
4+
const { createContainer } = require('sovereign');
5+
const Button = require('react-material/components/Button');
6+
7+
const Overlay = require('../components/overlay');
8+
const OverlayTitle = require('../components/overlay-title');
9+
const OverlayFooter = require('../components/overlay-footer');
10+
11+
class OverwriteOverlay extends React.Component {
12+
13+
constructor(...args){
14+
super(...args);
15+
16+
this.overwrite = this.overwrite.bind(this);
17+
}
18+
19+
overwrite(){
20+
const {
21+
handlers
22+
} = this.props;
23+
24+
const {
25+
overwriteFile
26+
} = handlers;
27+
28+
overwriteFile();
29+
}
30+
31+
render(){
32+
const {
33+
filename,
34+
handlers
35+
} = this.props;
36+
37+
const {
38+
showSaveOverlay
39+
} = handlers;
40+
41+
return (
42+
<Overlay>
43+
<OverlayTitle>File '{filename}' already exists. Overwrite anyway?</OverlayTitle>
44+
<OverlayFooter>
45+
<Button onClick={this.overwrite}>Overwrite</Button>
46+
<Button onClick={showSaveOverlay}>Cancel</Button>
47+
</OverlayFooter>
48+
</Overlay>
49+
);
50+
}
51+
}
52+
53+
module.exports = createContainer(OverwriteOverlay, {
54+
getStores({ store }){
55+
return {
56+
store
57+
};
58+
},
59+
60+
getPropsFromStores({ store }){
61+
const { nextFile } = store.getState();
62+
63+
return {
64+
filename: nextFile
65+
};
66+
}
67+
});

src/views/save-overlay.js

-1
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,6 @@ class SaveOverlay extends React.Component {
6060
} = this.props.handlers;
6161

6262
saveFileAs(filename);
63-
hideOverlay();
6463
this.clearName();
6564
}
6665

0 commit comments

Comments
 (0)