diff --git a/app/assets/javascripts/application.js.erb b/app/assets/javascripts/application.js.erb index 27da2b230..6e00179f6 100644 --- a/app/assets/javascripts/application.js.erb +++ b/app/assets/javascripts/application.js.erb @@ -273,7 +273,19 @@ var HelperModule = (function(){ /* Clean up TinyMCE */ tinymce.remove(); }); -})(); + + // Show warning if page has unsaved data + $(document).on('turbolinks:before-visit', () => { + let exit = true; + let editing = $(`.${GLOBAL_CONSTANTS.HAS_UNSAVED_DATA_CLASS_NAME}`).length > 0; + + if (editing) { + exit = confirm(I18n.t('general.leaving_unsaved_warning')); + } + + return exit; + }); +}()); // Check that loaded page, not turbolinks preview function notTurbolinksPreview() { diff --git a/app/assets/javascripts/protocols/steps.js.erb b/app/assets/javascripts/protocols/steps.js.erb index 49547c3a5..6ed8373fe 100644 --- a/app/assets/javascripts/protocols/steps.js.erb +++ b/app/assets/javascripts/protocols/steps.js.erb @@ -101,6 +101,9 @@ DragNDropSteps.clearFiles(); if (tinyMCE.editors.step_description_textarea) tinyMCE.editors.step_description_textarea.remove(); TinyMCE.init('#step_description_textarea'); + $form.on('change', '.checklist-item-text, .checklist-name', function() { + $form.addClass(GLOBAL_CONSTANTS.HAS_UNSAVED_DATA_CLASS_NAME); + }); $("#new-step-checklists fieldset.nested_step_checklists ul").each(function () { enableCheckboxSorting(this); }); @@ -279,7 +282,10 @@ colHeaders: true, contextMenu: true, formulas: true, - preventOverflow: 'horizontal' + preventOverflow: 'horizontal', + afterChange: function() { + $container.addClass(GLOBAL_CONSTANTS.HAS_UNSAVED_DATA_CLASS_NAME); + } }); $container.attr("initialized", true); @@ -390,6 +396,8 @@ destroyName = destroyName.replace(/\[\d+\]\[_destroy\]/, "[" + itemPos + "][_destroy]"); $destroyInput.attr("name", destroyName); } + + $formGroup.addClass(GLOBAL_CONSTANTS.HAS_UNSAVED_DATA_CLASS_NAME); }); } diff --git a/app/assets/javascripts/reports/new.js b/app/assets/javascripts/reports/new.js index 8c086f716..1c5c030c4 100644 --- a/app/assets/javascripts/reports/new.js +++ b/app/assets/javascripts/reports/new.js @@ -1,3 +1,5 @@ +/* globals animateSpinner GLOBAL_CONSTANTS */ + var REPORT_CONTENT = '#report-content'; var ADD_CONTENTS_FORM_ID = '#add-contents-form'; var SAVE_REPORT_FORM_ID = '#save-report-form'; @@ -42,9 +44,12 @@ function initializeHandsonTable(el) { columnSorting: true, editor: false, copyPaste: false, - formulas: true + formulas: true, + afterChange: function() { + el.addClass(GLOBAL_CONSTANTS.HAS_UNSAVED_DATA_CLASS_NAME); + } }); - el.handsontable("getInstance").loadData(data); + el.handsontable('getInstance').loadData(data); el.handsontable('getInstance').getPlugin('columnSorting').sort(3, order); // "Hack" to disable user sorting rows by clicking on @@ -61,7 +66,10 @@ function initializeHandsonTable(el) { colHeaders: true, editor: false, copyPaste: false, - formulas: true + formulas: true, + afterChange: function() { + el.addClass(GLOBAL_CONSTANTS.HAS_UNSAVED_DATA_CLASS_NAME); + } }); el.handsontable("getInstance").loadData(data); } diff --git a/app/assets/javascripts/repositories/row_editor.js b/app/assets/javascripts/repositories/row_editor.js index a3638f43a..f08574d0f 100644 --- a/app/assets/javascripts/repositories/row_editor.js +++ b/app/assets/javascripts/repositories/row_editor.js @@ -7,7 +7,7 @@ var RepositoryDatatableRowEditor = (function() { const NAME_COLUMN_ID = 'row-name'; const TABLE_ROW = '