Skip to content

Commit

Permalink
Fix #104: Enhance jQuery events
Browse files Browse the repository at this point in the history
  • Loading branch information
kartik-v committed Dec 26, 2015
1 parent f586c31 commit b38ca6e
Show file tree
Hide file tree
Showing 3 changed files with 69 additions and 45 deletions.
4 changes: 4 additions & 0 deletions CHANGE.md
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,10 @@ Change Log: `yii2-editable`
7. (enh #100): New `initEditablePopover` method to initialize popover for AJAX replaced editables.
8. (enh #103): Add Czech Translations.
9. Code optimizations for widget and JS plugin.
10. (enh #104): Enhance jQuery events
- New event `editableBeforeSubmit` that submits before ajax request
- Enable events to be aborted and prevent default behavior by `event.preventDefault()` (applicable for most critical editable events)
- Incorporate event namespace `.editable` on the critical events

## Version 1.7.3

Expand Down
108 changes: 64 additions & 44 deletions assets/js/editable.js
Original file line number Diff line number Diff line change
Expand Up @@ -47,9 +47,15 @@
});
},
htmlEncode: function(data) {
if (!this.encodeOutput) {
var self = this;
if (!self.encodeOutput) {
return data;
}
if (typeof data === 'object') {
$.each(data, function(key, value) {
data[key] = self.htmlEncode(value);
});
}
return data.replace(/&/g, '&')
.replace(/</g, '&lt;')
.replace(/>/g, '&gt;')
Expand Down Expand Up @@ -85,9 +91,14 @@
self.$popover.popoverX('refreshPosition');
}
},
raise: function($el, ev, params) {
params = params || [];
$el.trigger(ev, params);
raise: function($el, event, params) {
var e = $.Event(event);
if (params !== undefined) {
$el.trigger(e, params);
} else {
$el.trigger(e);
}
return !e.isDefaultPrevented();
},
destroy: function() {
var self = this, $target = self.target === '.kv-editable-button' ? self.$target : self.$value;
Expand Down Expand Up @@ -141,15 +152,17 @@
}, 200);
});
$form.find('input, select').on('change.editable', function () {
self.refreshPopover();
self.raise($el, 'editableChange', [$input.val()]);
if (self.raise($el, 'editableChange', [$input.val()])) {
self.refreshPopover();
}
});
$btnReset.on('click.editable', function () {
$hasEditable.val(0);
setTimeout(function () {
$form[0].reset();
}, 200);
self.raise($el, 'editableReset');
if (self.raise($el, 'editableReset')) {
$hasEditable.val(0);
setTimeout(function () {
$form[0].reset();
}, 200);
}
});
$close.on('click.editable', function () {
self.toggle(false);
Expand Down Expand Up @@ -188,19 +201,24 @@
url: $form.attr('action'),
data: $form.serialize(),
dataType: 'json',
error: function (request, status, message) {
if (self.showAjaxErrors) {
beforeSend: function (jqXHR) {
if (!self.raise($el, 'editableBeforeSubmit', [jqXHR])) {
jqXHR.abort();
}
},
error: function (jqXHR, status, message) {
if (self.raise($el, 'editableAjaxError', [jqXHR, status, message]) && self.showAjaxErrors) {
showError(message);
}
self.raise($el, 'editableAjaxError', [request, status, message]);
},
success: function (data) {
success: function (data, status, jqXHR) {
chkError = '';
out = !isEmpty(data.output) ? data.output : self.htmlEncode($input.val());
self.refreshPopover();
if (!isEmpty(data.message)) {
showError(data.message);
self.raise($el, 'editableError', [$input.val(), $form, data]);
if (self.raise($el, 'editableError', [$input.val(), $form, data])) {
showError(data.message);
}
return;
} else {
if (!isEmpty($msgBlock.attr('class'))) {
Expand All @@ -217,40 +235,43 @@
}
});
if (isEmpty(chkError)) {
$loading.hide();
if (isEmpty(out)) {
out = self.valueIfNull;
} else {
if (displayValueConfig[out] !== undefined) {
out = displayValueConfig[out];
if (self.raise($el, 'editableSuccess', [$input.val(), $form, data, status, jqXHR])) {
$loading.hide();
if (isEmpty(out)) {
out = self.valueIfNull;
} else {
if (displayValueConfig[out] !== undefined) {
out = displayValueConfig[out];
}
}
}
if (notActiveForm) {
$parent2.find('.help-block').remove();
$parent2.removeClass('has-error');
$message.html('');
self.toggle(false);
self.$value.html(out);
} else {
$parent.removeClass('has-error');
$message.html('');
self.toggle(false);
self.$value.html(out);
if (objActiveForm) {
$form.yiiActiveForm('destroy');
$form.yiiActiveForm(objActiveForm.attributes, objActiveForm.settings);
if (notActiveForm) {
$parent2.find('.help-block').remove();
$parent2.removeClass('has-error');
$message.html('');
self.toggle(false);
self.$value.html(out);
} else {
$parent.removeClass('has-error');
$message.html('');
self.toggle(false);
self.$value.html(out);
if (objActiveForm) {
$form.yiiActiveForm('destroy');
$form.yiiActiveForm(objActiveForm.attributes, objActiveForm.settings);
}
}
}
self.raise($el, 'editableSuccess', [$input.val(), $form, data]);

} else {
self.raise($el, 'editableError', [$input.val(), $form, data]);
}
$wrapper.removeClass('kv-editable-processing');
}
}, self.ajaxSettings);
setTimeout(function() {
$.ajax(settings);
self.raise($el, 'editableSubmit', [$input.val(), $form]);
if (self.raise($el, 'editableSubmit', [$input.val(), $form])) {
$.ajax(settings);
}
}, 1000);
});
}
Expand All @@ -260,9 +281,7 @@
var args = Array.apply(null, arguments);
args.shift();
return this.each(function () {
var $this = $(this),
data = $this.data('editable'),
options = typeof option === 'object' && option;
var $this = $(this), data = $this.data('editable'), options = typeof option === 'object' && option;
if (!data) {
data = new Editable(this, $.extend({}, $.fn.editable.defaults, options, $(this).data()));
$this.data('editable', data);
Expand All @@ -285,4 +304,5 @@
};

$.fn.editable.Constructor = Editable;

})(window.jQuery);
2 changes: 1 addition & 1 deletion assets/js/editable.min.js

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

0 comments on commit b38ca6e

Please sign in to comment.