Skip to content

Commit d67df96

Browse files
authored
Merge pull request #203 from nexB/127-alert-unsaved-component-changes
Add warning re unsaved Component edits #127
2 parents 525f4a9 + 0c292a3 commit d67df96

File tree

2 files changed

+38
-11
lines changed

2 files changed

+38
-11
lines changed

assets/app/js/componentDialog.js

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,11 +34,19 @@ class ComponentDialog {
3434
this.saveButton = this.dialog.find("button#component-save");
3535
this.deleteButton = this.dialog.find("button#component-delete");
3636

37+
// Define the buttons that can be used to close the dialog.
38+
this.exitButton = this.dialog.find("button#component-exit")
39+
this.closeButton = this.dialog.find("button#component-close")
40+
3741
// Make node view modal box draggable
3842
this.dialog.draggable({ handle: ".modal-header" });
3943
this.handlers = {};
4044
this.saveButton.click(() => this._saveComponent());
4145
this.deleteButton.click(() => this._deleteComponent());
46+
47+
// Link each close button's click event to a method that checks for unsaved edits.
48+
this.exitButton.click(() => this._closeComponent());
49+
this.closeButton.click(() => this._closeComponent());
4250
}
4351

4452
database(aboutCodeDB) {
@@ -151,9 +159,28 @@ class ComponentDialog {
151159
$('select').trigger('change.select2');
152160

153161
this.title.text(data.id);
162+
163+
// Disable the ability to close the dialog by clicking outside
164+
// the dialog or pressing the escape key.
165+
this.dialog.modal({ backdrop: "static", keyboard: false });
166+
167+
// Retrieve any previously-saved values -- use below in _closeComponent()
168+
// to compare with any new edits before closing the dialog.
169+
this.initialSerialization = this.dialog.find("form").serialize();
170+
154171
this.dialog.modal('show');
155172
}
156173

174+
// Check whether the user has made any new edits.
175+
_closeComponent() {
176+
// Retrieve the current form values, i.e., including edits not yet saved.
177+
this.currentSerialization = this.dialog.find("form").serialize();
178+
179+
if (this.initialSerialization !== this.currentSerialization) {
180+
return confirm('Your new changes haven\'t been saved. \n\nAre you sure you want to exit without saving?')
181+
}
182+
}
183+
157184
_saveComponent() {
158185
let id = this.title.text();
159186
this._component(id)

index.html

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -261,14 +261,14 @@ <h5>Total Files Scanned: <span class="total-files"></span></h5>
261261
<div class="modal-dialog" role="document">
262262
<div class="modal-content">
263263
<div class="modal-header">
264-
<button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
264+
<button type="button" class="close" data-dismiss="modal" id="component-exit" aria-label="Close"><span aria-hidden="true">&times;</span></button>
265265
<h3 class="modal-title">Modal title</h3>
266266
</div>
267267
<div class="modal-body">
268268
<form>
269269
<fieldset class="form-group">
270270
<label for="component-status">Status</label>
271-
<select class="form-control status" id="component-status" type="text">
271+
<select class="form-control status" id="component-status" name="component-status" type="text">
272272
<option value="Analyzed">Analyzed</option>
273273
<option value="Attention">Needs Attention</option>
274274
<option value="Original">Original Code</option>
@@ -277,40 +277,40 @@ <h3 class="modal-title">Modal title</h3>
277277
</fieldset>
278278
<fieldset class="form-group">
279279
<label for="component-name">Component</label>
280-
<input type="text" class="form-control" id="component-name" placeholder="Enter component">
280+
<input type="text" class="form-control" id="component-name" name="component-name" placeholder="Enter component">
281281
</fieldset>
282282
<fieldset class="form-group">
283283
<label for="component-version">Version</label>
284-
<input type="text" class="form-control" id="component-version" placeholder="Enter version">
284+
<input type="text" class="form-control" id="component-version" name="component-version" placeholder="Enter version">
285285
</fieldset>
286286
<fieldset class="form-group">
287287
<label for="component-license">License</label>
288-
<select data-hide-on-select="true" class="form-control " id="component-license" type="text"></select>
288+
<select data-hide-on-select="true" class="form-control " id="component-license" name="component-license" type="text"></select>
289289
</fieldset>
290290
<fieldset class="form-group">
291291
<label for="component-owner">Owner</label>
292-
<select data-hide-on-select="true" class="form-control" id="component-owner" type="text"></select>
292+
<select data-hide-on-select="true" class="form-control" id="component-owner" name="component-owner" type="text"></select>
293293
</fieldset>
294294
<fieldset class="form-group">
295295
<label for="component-copyright">Copyright</label>
296-
<select data-hide-on-select="true" class="form-control" id="component-copyright" type="text"></select>
296+
<select data-hide-on-select="true" class="form-control" id="component-copyright" name="component-copyright" type="text"></select>
297297
</fieldset>
298298
<fieldset class="form-group">
299299
<label for="component-language">Programming Language</label>
300-
<select data-hide-on-select="true" class="form-control" id="component-language" type="text"></select>
300+
<select data-hide-on-select="true" class="form-control" id="component-language" name="component-language" type="text"></select>
301301
</fieldset>
302302
<fieldset class="form-group">
303303
<label for="component-homepage-url">Homepage URL</label>
304-
<select data-hide-on-select="true" class="form-control" id="component-homepage-url" type="text"></select>
304+
<select data-hide-on-select="true" class="form-control" id="component-homepage-url" name="component-homepage-url" type="text"></select>
305305
</fieldset>
306306
<fieldset class="form-group">
307307
<label for="component-notes">Notes</label>
308-
<textarea class="form-control" id="component-notes" rows="3"></textarea>
308+
<textarea class="form-control" id="component-notes" name="component-notes" rows="3"></textarea>
309309
</fieldset>
310310
</form>
311311
</div>
312312
<div class="modal-footer">
313-
<button type="button" class="btn btn-default" data-dismiss="modal">Close</button>
313+
<button type="button" class="btn btn-default" data-dismiss="modal" id="component-close">Close</button>
314314
<button type="button" class="btn btn-danger" data-dismiss="modal" id="component-delete">Delete Component</button>
315315
<button type="button" class="btn btn-primary" id="component-save">Save changes</button>
316316
</div>

0 commit comments

Comments
 (0)