Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

280 areyousure #366

Open
wants to merge 8 commits into
base: main
Choose a base branch
from
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');
});
});