improved duration and minute selector (#2264)

* do not close modal if form is dirty
* deprecated TimesheetConfiguration
* inject timezone in form types
* cleanup usage of UserDateTimeFactory
* allow to configure increment steps for minutes
* use 15 minutes step for datetimepicker in project edit form
* use rounding rules for increments in minute select for begin and end
* allow duration in multi user and admin timesheet forms
* make dropdown values configurable
This commit is contained in:
Kevin Papst
2021-01-17 14:04:13 +01:00
committed by GitHub
parent e2324b7d51
commit 8d72d114c7
95 changed files with 1381 additions and 510 deletions

View File

@@ -28,9 +28,20 @@ export default class KimaiAjaxModalForm extends KimaiReducedClickHandler {
init() {
const self = this;
this.isDirty = false;
this.modal = jQuery('#remote_form_modal');
this.modal.on('hide.bs.modal', function () {
this.modal.on('hide.bs.modal', function (e) {
if (self.isDirty) {
if (jQuery('#remote_form_modal .modal-body .remote_modal_is_dirty_warning').length === 0) {
const msg = self.getContainer().getTranslation().get('modal.dirty');
jQuery('#remote_form_modal .modal-body').prepend('<p class="text-danger small remote_modal_is_dirty_warning">' + msg + '</p>');
}
e.preventDefault();
return;
}
jQuery(self._getFormIdentifier()).off('change', self._isDirtyHandler);
self.isDirty = false;
self.getContainer().getPlugin('event').trigger('modal-hide');
});
this.modal.on('hidden.bs.modal', function () {
@@ -44,7 +55,11 @@ export default class KimaiAjaxModalForm extends KimaiReducedClickHandler {
});
this.modal.on('shown.bs.modal', function () {
// workaround for autofocus attribute, as the modal "steals" it
jQuery(self._getFormIdentifier()).find('input[type=text],textarea,select').filter(':not("[data-datetimepicker=on]")').filter(':visible:first').focus().delay(1000).focus();
let formAutofocus = jQuery(self._getFormIdentifier()).find('[autofocus]');
if (formAutofocus.length < 1) {
formAutofocus = jQuery(self._getFormIdentifier()).find('input[type=text],textarea,select');
}
formAutofocus.filter(':not("[data-datetimepicker=on]")').filter(':visible:first').focus().delay(1000).focus();
});
this._addClickHandler(this.selector, function(href) {
@@ -97,7 +112,7 @@ export default class KimaiAjaxModalForm extends KimaiReducedClickHandler {
form.off('submit');
// load new form from given content
if (jQuery(html).find('#form_modal .modal-content').length > 0 ) {
if (jQuery(html).find('#form_modal .modal-content').length > 0) {
// switch classes, in case the modal type changed
remoteModal.on('hidden.bs.modal', function () {
if (remoteModal.hasClass('modal-danger')) {
@@ -113,6 +128,10 @@ export default class KimaiAjaxModalForm extends KimaiReducedClickHandler {
jQuery(html).find('#form_modal .modal-content')
);
jQuery('#remote_form_modal [data-dismiss=modal]').on('click', function() {
self.isDirty = false;
});
// activate new loaded widgets
self.getContainer().getPlugin('form').activateForm(formIdentifier);
}
@@ -139,6 +158,11 @@ export default class KimaiAjaxModalForm extends KimaiReducedClickHandler {
// the new form that was loaded via ajax
form = jQuery(formIdentifier);
this._isDirtyHandler = function(e) {
self.isDirty = true;
}
form.on('change', this._isDirtyHandler);
// click handler for modal save button, to send forms via ajax
form.on('submit', function(event){
const btn = jQuery(formIdentifier + ' button[type=submit]').button('loading');
@@ -181,6 +205,7 @@ export default class KimaiAjaxModalForm extends KimaiReducedClickHandler {
if (msg === null || msg === undefined) {
msg = 'action.update.success';
}
self.isDirty = false;
remoteModal.modal('hide');
alert.success(msg);
}