Skip to content
Open
Show file tree
Hide file tree
Changes from 4 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions ephios/core/templates/core/event_form.html
Original file line number Diff line number Diff line change
Expand Up @@ -64,3 +64,8 @@ <h1>{% blocktranslate with title=eventtype.title %}Create new {{ title }}{% endb
</div>
</form>
{% endblock %}

{% block javascript %}
<script type="text/javascript" src="{% static "areyousure/are-you-sure.js" %}"></script>
<script type="text/javascript" src="{% static "ephios/js/areyousure_form.js" %}"></script>
{% endblock %}
5 changes: 5 additions & 0 deletions ephios/core/templates/core/eventtype_form.html
Original file line number Diff line number Diff line change
Expand Up @@ -19,4 +19,9 @@
{% endif %}
<button class="btn btn-primary" type="submit">{% translate "Save" %}</button>
</form>
{% endblock %}

{% block javascript %}
<script type="text/javascript" src="{% static "areyousure/are-you-sure.js" %}"></script>
<script type="text/javascript" src="{% static "ephios/js/areyousure_form.js" %}"></script>
{% endblock %}
2 changes: 2 additions & 0 deletions ephios/core/templates/core/group_form.html
Original file line number Diff line number Diff line change
Expand Up @@ -24,4 +24,6 @@ <h1>{% trans "Create new group" %}</h1>

{% block javascript %}
<script type="text/javascript" src="{% static "ephios/js/group_form.js" %}"></script>
<script type="text/javascript" src="{% static "areyousure/are-you-sure.js" %}"></script>
<script type="text/javascript" src="{% static "ephios/js/areyousure_form.js" %}"></script>
{% endblock %}
5 changes: 5 additions & 0 deletions ephios/core/templates/core/shift_form.html
Original file line number Diff line number Diff line change
Expand Up @@ -85,3 +85,8 @@ <h5 class="card-subtitle mb-2 text-muted">{% trans "Shift" %}</h5>
<script type="text/javascript" src="{% static "ephios/js/shift_form.js" %}"></script>

{% endblock %}

{% block javascript %}
<script type="text/javascript" src="{% static "areyousure/are-you-sure.js" %}"></script>
<script type="text/javascript" src="{% static "ephios/js/areyousure_form.js" %}"></script>
{% endblock %}
9 changes: 7 additions & 2 deletions ephios/core/templates/core/userprofile_form.html
Original file line number Diff line number Diff line change
Expand Up @@ -64,8 +64,8 @@ <h3 class="card-title">{% translate "Qualifications" %}</h3>
</div>
{% endfor %}
</ul>

<input class="btn btn-secondary mt-2" type="button"
<input class="btn btn-secondary mt-2 add-form" type="button"
value="{% translate "Add qualification" %}"
data-formset-add>
</div>
Expand Down Expand Up @@ -104,3 +104,8 @@ <h3 class="card-title">{% translate "Qualifications" %}</h3>
<input type="submit" value="{% trans "Save" %}" class="btn btn-primary float-right">
</form>
{% endblock %}

{% block javascript %}
<script type="text/javascript" src="{% static "areyousure/are-you-sure.js" %}"></script>
<script type="text/javascript" src="{% static "ephios/js/areyousure_form.js" %}"></script>
{% endblock %}
180 changes: 180 additions & 0 deletions ephios/static/areyousure/are-you-sure.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,180 @@
(function($) {

$.fn.areYouSure = function(options) {

var settings = $.extend(
{
'message' : 'You have unsaved changes!',
'dirtyClass' : 'dirty',
'change' : null,
'silent' : false,
'addRemoveFieldsMarksDirty' : false,
'fieldEvents' : 'change keyup propertychange input',
'fieldSelector': ":input:not(input[type=submit]):not(input[type=button])"
}, options);

var getValue = function($field) {
if ($field.hasClass('ays-ignore')
|| $field.hasClass('aysIgnore')
|| $field.attr('data-ays-ignore')
|| $field.attr('name') === undefined) {
return null;
}

if ($field.is(':disabled')) {
return 'ays-disabled';
}

var val;
var type = $field.attr('type');
if ($field.is('select')) {
type = 'select';
}

switch (type) {
case 'checkbox':
case 'radio':
val = $field.is(':checked');
break;
case 'select':
val = '';
$field.find('option').each(function(o) {
var $option = $(this);
if ($option.is(':selected')) {
val += $option.val();
}
});
break;
default:
val = $field.val();
}

return val;
};

var storeOrigValue = function($field) {
$field.data('ays-orig', getValue($field));
};

var checkForm = function(evt) {

var isFieldDirty = function($field) {
var origValue = $field.data('ays-orig');
if (undefined === origValue) {
return false;
}
return (getValue($field) != origValue);
};

var $form = ($(this).is('form'))
? $(this)
: $(this).parents('form');

// Test on the target first as it's the most likely to be dirty
if (isFieldDirty($(evt.target))) {
setDirtyStatus($form, true);
return;
}

$fields = $form.find(settings.fieldSelector);

if (settings.addRemoveFieldsMarksDirty) {
// Check if field count has changed
var origCount = $form.data("ays-orig-field-count");
if (origCount != $fields.length) {
setDirtyStatus($form, true);
return;
}
}

// Brute force - check each field
var isDirty = false;
$fields.each(function() {
var $field = $(this);
if (isFieldDirty($field)) {
isDirty = true;
return false; // break
}
});

setDirtyStatus($form, isDirty);
};

var initForm = function($form) {
var fields = $form.find(settings.fieldSelector);
$(fields).each(function() { storeOrigValue($(this)); });
$(fields).unbind(settings.fieldEvents, checkForm);
$(fields).bind(settings.fieldEvents, checkForm);
$form.data("ays-orig-field-count", $(fields).length);
setDirtyStatus($form, false);
};

var setDirtyStatus = function($form, isDirty) {
var changed = isDirty != $form.hasClass(settings.dirtyClass);
$form.toggleClass(settings.dirtyClass, isDirty);

// Fire change event if required
if (changed) {
if (settings.change) settings.change.call($form, $form);

if (isDirty) $form.trigger('dirty.areYouSure', [$form]);
if (!isDirty) $form.trigger('clean.areYouSure', [$form]);
$form.trigger('change.areYouSure', [$form]);
}
};

var rescan = function() {
var $form = $(this);
var fields = $form.find(settings.fieldSelector);
$(fields).each(function() {
var $field = $(this);
if (!$field.data('ays-orig')) {
storeOrigValue($field);
$field.bind(settings.fieldEvents, checkForm);
}
});
// Check for changes while we're here
$form.trigger('checkform.areYouSure');
};

var reinitialize = function() {
initForm($(this));
}

if (!settings.silent && !window.aysUnloadSet) {
window.aysUnloadSet = true;
$(window).bind('beforeunload', function() {
$dirtyForms = $("form").filter('.' + settings.dirtyClass);
if ($dirtyForms.length == 0) {
return;
}
// Prevent multiple prompts - seen on Chrome and IE
if (navigator.userAgent.toLowerCase().match(/msie|chrome/)) {
if (window.aysHasPrompted) {
return;
}
window.aysHasPrompted = true;
window.setTimeout(function() {window.aysHasPrompted = false;}, 900);
}
return settings.message;
});
}

return this.each(function(elem) {
if (!$(this).is('form')) {
return;
}
var $form = $(this);

$form.submit(function() {
$form.removeClass(settings.dirtyClass);
});
$form.bind('reset', function() { setDirtyStatus($form, false); });
// Add a custom events
$form.bind('rescan.areYouSure', rescan);
$form.bind('reinitialize.areYouSure', reinitialize);
$form.bind('checkform.areYouSure', checkForm);
initForm($form);
});
};
})(jQuery);
7 changes: 7 additions & 0 deletions ephios/static/ephios/js/areyousure_form.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
$(document).ready(function () {
$('form').areYouSure();
// Listener for inputs that can dynamically add new forms and trigger a scan of the new form
$('.add-form').click(function() {
$('form').trigger('reinitialize.areYouSure');
});
});