Skip to content

Commit

Permalink
fixed: click events in bs3 on yesno element. Note change events propb…
Browse files Browse the repository at this point in the history
…ably wont fire as event has to be attached to the label
  • Loading branch information
pollen8 committed Feb 3, 2016
1 parent 963f312 commit 9fd81a5
Show file tree
Hide file tree
Showing 6 changed files with 65 additions and 35 deletions.
2 changes: 1 addition & 1 deletion media/com_fabrik/js/elementlist-min.js

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

45 changes: 31 additions & 14 deletions media/com_fabrik/js/elementlist.js
Expand Up @@ -43,16 +43,29 @@ FbElementList = new Class({
});
},

/**
* Get the dom selector that events should be attached to
* @returns {string}
*/
eventDelegate: function () {
return 'input[type=' + this.type + '][name^=' + this.options.fullName + ']';
},

/**
* Add an event
* @param {string} action
* @param {string|function} js
*/
addNewEvent: function (action, js) {
var r, delegate, uid;
var r, delegate, uid, c;
if (action === 'load') {
this.loadEvents.push(js);
this.runLoadEvent(js);
} else {
c = this.form.form;

// Added name^= for http://fabrikar.com/forums/showthread.php?t=30563 (js events to show hide multiple groups)
delegate = action + ':relay(input[type=' + this.type + '][name^=' + this.options.fullName + '])';
delegate = this.eventDelegate();
if (typeOf(this.form.events[action]) === 'null') {
this.form.events[action] = {};
}
Expand All @@ -66,15 +79,20 @@ FbElementList = new Class({
}
if (typeOf(this.form.events[action][uid]) === 'null') {
this.form.events[action][uid] = true;

c.addEvent(delegate, function (event, target) {

jQuery(c).on(action, delegate, function (event) {
// Don't use the usual jQuery this, as we need to bind the plugin as 'this' to the event.
var target = jQuery(event.currentTarget), elid, that, subEls;
if (target.prop('tagName') === 'LABEL') {
target = target.find('input');
}
// As we are delegating the event, and reference to 'this' in the js will refer to the first element
// When in a repeat group we want to replace that with a reference to the current element.
var elid = target.getParent('.fabrikSubElementContainer').id;
var that = this.form.formElements[elid];
var subEls = that._getSubElements();
if (subEls.contains(target)) {
elid = target.closest('.fabrikSubElementContainer').prop('id');
that = this.form.formElements[elid];
subEls = that._getSubElements();
if (target.length > 0 && subEls.contains(target[0])) {

// Replace this with that so that the js code runs on the correct element
if (typeof(js) !== 'function') {
js = js.replace(/this/g, 'that');
Expand All @@ -96,7 +114,7 @@ FbElementList = new Class({
},

startAddNewOption: function () {
var c = this.getContainer();
var c = this.getContainer(), val;
var l = c.getElement('input[name=addPicklistLabel]');
var v = c.getElement('input[name=addPicklistValue]');
var label = l.value;
Expand All @@ -106,7 +124,7 @@ FbElementList = new Class({
val = label;
}
if (val === '' || label === '') {
alert(Joomla.JText._('PLG_ELEMENT_CHECKBOX_ENTER_VALUE_LABEL'));
window.alert(Joomla.JText._('PLG_ELEMENT_CHECKBOX_ENTER_VALUE_LABEL'));
}
else {
var r = this.subElements.getLast().findClassUp('fabrikgrid_' + this.type).clone();
Expand All @@ -127,7 +145,7 @@ FbElementList = new Class({
index = this.subElements.length;
}
var is = $$('input[name=' + i.name + ']');
document.id(this.form.form).fireEvent("change", {target: is[index]});
document.id(this.form.form).fireEvent('change', {target: is[index]});

this._getSubElements();
if (v) {
Expand All @@ -142,7 +160,6 @@ FbElementList = new Class({
},

watchAdd: function () {
var val;
if (this.options.allowadd === true && this.options.editable !== false) {
var c = this.getContainer();
c.getElements('input[name=addPicklistLabel], input[name=addPicklistValue]').addEvent('keypress', function (e) {
Expand All @@ -159,5 +176,5 @@ FbElementList = new Class({
}.bind(this));
}
}

});
2 changes: 1 addition & 1 deletion plugins/fabrik_element/radiobutton/radiobutton-min.js

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

18 changes: 10 additions & 8 deletions plugins/fabrik_element/radiobutton/radiobutton.js
Expand Up @@ -21,7 +21,7 @@ FbRadio = new Class({
},

btnGroup: function () {
// Seems slighly skewy in admin as the j template does the same code
// Seems slightly screwy in admin as the j template does the same code
if (!this.options.btnGroup) {
return;
}
Expand All @@ -36,7 +36,7 @@ FbRadio = new Class({


c.getElements(".btn-group input[checked=checked]").each(function (input) {
var label = input.getParent('label');
var label = input.getParent('label'), v;
if (typeOf(label) === 'null') {
// J3.2 button group markup - label is after input (no longer the case)
label = input.getNext();
Expand Down Expand Up @@ -80,11 +80,13 @@ FbRadio = new Class({
}
var v = input.get('value');
var fabchecked = parseInt(input.get('fabchecked'), 10);

// Protostar in J3.2 adds its own btn-group js code - need to thus apply this section even after input has been unchecked

// Protostar in J3.2 adds its own btn-group js code -
// need to thus apply this section even after input has been unchecked
if (!input.get('checked') || fabchecked === 1) {
if (label) {
label.getParent('.btn-group').getElements('label').removeClass('active').removeClass('btn-success').removeClass('btn-danger').removeClass('btn-primary');
label.getParent('.btn-group').getElements('label').removeClass('active').removeClass('btn-success')
.removeClass('btn-danger').removeClass('btn-primary');
if (v === '') {
label.addClass('active btn-primary');
} else if (v.toInt() === 0) {
Expand All @@ -94,7 +96,7 @@ FbRadio = new Class({
}
}
input.set('checked', true);

if (typeOf(fabchecked) === 'null') {
input.set('fabchecked', 1);
}
Expand Down Expand Up @@ -184,9 +186,9 @@ FbRadio = new Class({
this.parent(c);
this.btnGroup();
},

getChangeEvent: function () {
return this.options.changeEvent;
}

});
2 changes: 1 addition & 1 deletion plugins/fabrik_element/yesno/yesno-min.js

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

31 changes: 21 additions & 10 deletions plugins/fabrik_element/yesno/yesno.js
Expand Up @@ -6,14 +6,25 @@
*/

FbYesno = new Class({
Extends: FbRadio,
initialize: function (element, options) {
this.setPlugin('fabrikyesno');
this.parent(element, options);
},

getChangeEvent: function () {
return this.options.changeEvent;
}

Extends : FbRadio,
initialize: function (element, options) {
this.setPlugin('fabrikyesno');
this.parent(element, options);
},

/**
* Get the dom selector that events should be attached to. Attach to labels as well
* @returns {string}
*/
eventDelegate: function () {
var str = 'input[type=' + this.type + '][name^=' + this.options.fullName + ']';
str += ', div.fb_el_school___private label';

return str;
},

getChangeEvent: function () {
return this.options.changeEvent;
}

});

0 comments on commit 9fd81a5

Please sign in to comment.