From 6ad46cdaaf5605df6769de0681aff05f54c73d96 Mon Sep 17 00:00:00 2001
From: Ruud
Date: Thu, 29 Dec 2016 15:11:41 +0100
Subject: [PATCH 001/113] added not_between translation for NL
added not_between translation for NL
---
src/i18n/nl.json | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/src/i18n/nl.json b/src/i18n/nl.json
index f2390971..06199640 100644
--- a/src/i18n/nl.json
+++ b/src/i18n/nl.json
@@ -22,6 +22,7 @@
"greater": "groter",
"greater_or_equal": "groter of gelijk",
"between": "tussen",
+ "not_between": "niet tussen",
"begins_with": "begint met",
"not_begins_with": "begint niet met",
"contains": "bevat",
@@ -54,4 +55,4 @@
"datetime_exceed_min": "Dient na {0}",
"datetime_exceed_max": "Dient voor {0}"
}
-}
\ No newline at end of file
+}
From ec1a831c805abc05a2dc5ec448f6e5b3ff89e29e Mon Sep 17 00:00:00 2001
From: mistic100
Date: Thu, 29 Dec 2016 15:56:44 +0100
Subject: [PATCH 002/113] Fix #399 sortable: add "no_drop" flag and inherit
flags
---
examples/index.html | 4 +-
src/core.js | 6 +-
src/plugins/sortable/plugin.js | 180 +++++++++++++++++----------------
src/public.js | 7 +-
tests/core.module.js | 4 +-
tests/data.module.js | 24 ++++-
6 files changed, 131 insertions(+), 94 deletions(-)
diff --git a/examples/index.html b/examples/index.html
index 128f96a5..fef065e1 100644
--- a/examples/index.html
+++ b/examples/index.html
@@ -472,7 +472,9 @@ Output
condition: 'OR',
not: true,
flags: {
- no_delete: true
+ no_delete: true,
+ no_drop: true,
+ no_sortable: true
},
rules: [{
id: 'category',
diff --git a/src/core.js b/src/core.js
index 900d1890..5a9c31a9 100644
--- a/src/core.js
+++ b/src/core.js
@@ -370,7 +370,7 @@ QueryBuilder.prototype.setRoot = function(addRule, data, flags) {
this.model.root.model = this.model;
this.model.root.data = data;
- this.model.root.flags = $.extend({}, this.settings.default_group_flags, flags);
+ this.model.root.__.flags = $.extend({}, this.settings.default_group_flags, flags);
this.trigger('afterAddGroup', this.model.root);
@@ -406,7 +406,7 @@ QueryBuilder.prototype.addGroup = function(parent, addRule, data, flags) {
var model = parent.addGroup($group);
model.data = data;
- model.flags = $.extend({}, this.settings.default_group_flags, flags);
+ model.__.flags = $.extend({}, this.settings.default_group_flags, flags);
this.trigger('afterAddGroup', model);
@@ -501,7 +501,7 @@ QueryBuilder.prototype.addRule = function(parent, data, flags) {
model.data = data;
}
- model.flags = $.extend({}, this.settings.default_rule_flags, flags);
+ model.__.flags = $.extend({}, this.settings.default_rule_flags, flags);
this.trigger('afterAddRule', model);
diff --git a/src/plugins/sortable/plugin.js b/src/plugins/sortable/plugin.js
index 4b62a871..d9fd30ef 100644
--- a/src/plugins/sortable/plugin.js
+++ b/src/plugins/sortable/plugin.js
@@ -6,11 +6,27 @@
Selectors.rule_and_group_containers = Selectors.rule_container + ', ' + Selectors.group_container;
Selectors.drag_handle = '.drag-handle';
+QueryBuilder.defaults({
+ default_rule_flags: {
+ no_sortable: false,
+ no_drop: false
+ },
+ default_group_flags: {
+ no_sortable: false,
+ no_drop: false
+ }
+});
+
QueryBuilder.define('sortable', function(options) {
if (!('interact' in window)) {
Utils.error('MissingLibrary', 'interact.js is required to use "sortable" plugin. Get it here: http://interactjs.io');
}
+ if (options.default_no_sortable !== undefined) {
+ Utils.error(false, 'Config', 'Sortable plugin : "default_no_sortable" options is deprecated, use standard "default_rule_flags" and "default_group_flags" instead');
+ this.settings.default_rule_flags.no_sortable = this.settings.default_group_flags.no_sortable = options.default_no_sortable;
+ }
+
// recompute drop-zones during drag (when a rule is hidden)
interact.dynamicDrop(true);
@@ -32,70 +48,68 @@ QueryBuilder.define('sortable', function(options) {
var self = e.builder;
/**
- * Configure drag
+ * Inherit flags
*/
- interact(node.$el[0])
- .allowFrom(Selectors.drag_handle)
- .draggable({
- onstart: function(event) {
- // get model of dragged element
- src = Model(event.target);
-
- // create ghost
- ghost = src.$el.clone()
- .appendTo(src.$el.parent())
- .width(src.$el.outerWidth())
- .addClass('dragging');
-
- // create drop placeholder
- var ph = $('
')
- .height(src.$el.outerHeight());
-
- placeholder = src.parent.addRule(ph, src.getPos());
-
- // hide dragged element
- src.$el.hide();
- },
- onmove: function(event) {
- // make the ghost follow the cursor
- ghost[0].style.top = event.clientY - 15 + 'px';
- ghost[0].style.left = event.clientX - 15 + 'px';
- },
- onend: function() {
- // remove ghost
- ghost.remove();
- ghost = undefined;
-
- // remove placeholder
- placeholder.drop();
- placeholder = undefined;
-
- // show element
- src.$el.show();
-
- self.trigger('afterMove', src);
- }
- });
+ if (options.inherit_no_sortable && node.parent && node.parent.flags.no_sortable) {
+ node.flags.no_sortable = true;
+ }
+ if (options.inherit_no_drop && node.parent && node.parent.flags.no_drop) {
+ node.flags.no_drop = true;
+ }
/**
- * Configure drop on groups and rules
+ * Configure drag
*/
- interact(node.$el[0])
- .dropzone({
- accept: Selectors.rule_and_group_containers,
- ondragenter: function(event) {
- moveSortableToTarget(placeholder, $(event.target));
- },
- ondrop: function(event) {
- moveSortableToTarget(src, $(event.target));
- }
- });
+ if (!node.flags.no_sortable) {
+ interact(node.$el[0])
+ .allowFrom(Selectors.drag_handle)
+ .draggable({
+ onstart: function(event) {
+ // get model of dragged element
+ src = Model(event.target);
+
+ // create ghost
+ ghost = src.$el.clone()
+ .appendTo(src.$el.parent())
+ .width(src.$el.outerWidth())
+ .addClass('dragging');
+
+ // create drop placeholder
+ var ph = $('
')
+ .height(src.$el.outerHeight());
+
+ placeholder = src.parent.addRule(ph, src.getPos());
+
+ // hide dragged element
+ src.$el.hide();
+ },
+ onmove: function(event) {
+ // make the ghost follow the cursor
+ ghost[0].style.top = event.clientY - 15 + 'px';
+ ghost[0].style.left = event.clientX - 15 + 'px';
+ },
+ onend: function() {
+ // remove ghost
+ ghost.remove();
+ ghost = undefined;
- /**
- * Configure drop on group headers
- */
- if (node instanceof Group) {
- interact(node.$el.find(Selectors.group_header)[0])
+ // remove placeholder
+ placeholder.drop();
+ placeholder = undefined;
+
+ // show element
+ src.$el.show();
+
+ self.trigger('afterMove', src);
+ }
+ });
+ }
+
+ if (!node.flags.no_drop) {
+ /**
+ * Configure drop on groups and rules
+ */
+ interact(node.$el[0])
.dropzone({
accept: Selectors.rule_and_group_containers,
ondragenter: function(event) {
@@ -105,6 +119,22 @@ QueryBuilder.define('sortable', function(options) {
moveSortableToTarget(src, $(event.target));
}
});
+
+ /**
+ * Configure drop on group headers
+ */
+ if (node instanceof Group) {
+ interact(node.$el.find(Selectors.group_header)[0])
+ .dropzone({
+ accept: Selectors.rule_and_group_containers,
+ ondragenter: function(event) {
+ moveSortableToTarget(placeholder, $(event.target));
+ },
+ ondrop: function(event) {
+ moveSortableToTarget(src, $(event.target));
+ }
+ });
+ }
}
});
@@ -122,32 +152,11 @@ QueryBuilder.define('sortable', function(options) {
});
/**
- * Remove drag handle from non-sortable rules
- */
- this.on('parseRuleFlags.filter', function(flags) {
- if (flags.value.no_sortable === undefined) {
- flags.value.no_sortable = options.default_no_sortable;
- }
- });
-
- this.on('afterApplyRuleFlags', function(e, rule) {
- if (rule.flags.no_sortable) {
- rule.$el.find('.drag-handle').remove();
- }
- });
-
- /**
- * Remove drag handle from non-sortable groups
+ * Remove drag handle from non-sortable items
*/
- this.on('parseGroupFlags.filter', function(flags) {
- if (flags.value.no_sortable === undefined) {
- flags.value.no_sortable = options.default_no_sortable;
- }
- });
-
- this.on('afterApplyGroupFlags', function(e, group) {
- if (group.flags.no_sortable) {
- group.$el.find('.drag-handle').remove();
+ this.on('afterApplyRuleFlags afterApplyGroupFlags', function(e, node) {
+ if (node.flags.no_sortable) {
+ node.$el.find('.drag-handle').remove();
}
});
@@ -168,7 +177,8 @@ QueryBuilder.define('sortable', function(options) {
h.value = $h.prop('outerHTML');
});
}, {
- default_no_sortable: false,
+ inherit_no_sortable: true,
+ inherit_no_drop: true,
icon: 'glyphicon glyphicon-sort'
});
diff --git a/src/public.js b/src/public.js
index bef0915f..70db106d 100644
--- a/src/public.js
+++ b/src/public.js
@@ -235,6 +235,7 @@ QueryBuilder.prototype.setRules = function(data, options) {
this.clear();
this.setRoot(false, data.data, this.parseGroupFlags(data));
+ this.applyGroupFlags(this.model.root);
data = this.change('setRules', data);
@@ -269,6 +270,8 @@ QueryBuilder.prototype.setRules = function(data, options) {
return;
}
+ self.applyGroupFlags(model);
+
add(item, model);
}
}
@@ -283,7 +286,7 @@ QueryBuilder.prototype.setRules = function(data, options) {
}
}
- model = self.addRule(group, item.data);
+ model = self.addRule(group, item.data, self.parseRuleFlags(item));
if (model === null) {
return;
}
@@ -304,7 +307,7 @@ QueryBuilder.prototype.setRules = function(data, options) {
}
}
- model.flags = self.parseRuleFlags(item);
+ self.applyRuleFlags(model);
if (self.change('jsonToRule', model, item) != model) {
Utils.error('RulesParse', 'Plugin tried to change rule reference');
diff --git a/tests/core.module.js b/tests/core.module.js
index 8edab9f6..84ee916b 100644
--- a/tests/core.module.js
+++ b/tests/core.module.js
@@ -762,7 +762,9 @@ $(function(){
filter_readonly: true,
operator_readonly: false,
value_readonly: true,
- no_delete: false
+ no_delete: false,
+ no_sortable: true,
+ no_drop: false
};
QueryBuilder.defaults({ default_rule_flags: flags });
diff --git a/tests/data.module.js b/tests/data.module.js
index 6782e132..a6a2b184 100644
--- a/tests/data.module.js
+++ b/tests/data.module.js
@@ -331,13 +331,33 @@ $(function(){
condition_readonly: true,
no_add_rule: false,
no_add_group: false,
- no_delete: false
+ no_delete: false,
+ no_sortable: false,
+ no_drop: false
};
rules_all_flags.rules[0].flags = {
filter_readonly: false,
operator_readonly: false,
value_readonly: false,
- no_delete: true
+ no_delete: true,
+ no_sortable: false,
+ no_drop: false
+ };
+ rules_all_flags.rules[1].flags = {
+ condition_readonly: true,
+ no_add_rule: true,
+ no_add_group: true,
+ no_delete: true,
+ no_sortable: false,
+ no_drop: false
+ };
+ rules_all_flags.rules[1].rules[0].flags = {
+ filter_readonly: true,
+ operator_readonly: true,
+ value_readonly: true,
+ no_delete: true,
+ no_sortable: false,
+ no_drop: false
};
assert.rulesMatch(
From 358f5d04d12cee8b0b80f374c615fe09d31c109b Mon Sep 17 00:00:00 2001
From: kfirstri
Date: Thu, 29 Dec 2016 18:32:23 +0200
Subject: [PATCH 003/113] added hebrew translation file (#409)
---
examples/index.html | 1 +
src/i18n/he.json | 61 ++++++++++++++++++++++++++++++
src/plugins/invert/i18n/he.json | 3 ++
src/plugins/not-group/i18n/he.json | 3 ++
4 files changed, 68 insertions(+)
create mode 100644 src/i18n/he.json
create mode 100644 src/plugins/invert/i18n/he.json
create mode 100644 src/plugins/not-group/i18n/he.json
diff --git a/examples/index.html b/examples/index.html
index fef065e1..c3294a8d 100644
--- a/examples/index.html
+++ b/examples/index.html
@@ -58,6 +58,7 @@ jQuery QueryBuilder Example
+
diff --git a/src/i18n/he.json b/src/i18n/he.json
new file mode 100644
index 00000000..99f2acf9
--- /dev/null
+++ b/src/i18n/he.json
@@ -0,0 +1,61 @@
+{
+ "__locale": "Hebrew (he)",
+ "__author": "Kfir Stri https://github.com/kfirstri",
+
+ "add_rule": "הוסף כלל",
+ "add_group": "הוסף קבוצה",
+ "delete_rule": "מחק",
+ "delete_group": "מחק",
+
+ "conditions": {
+ "AND": "וגם",
+ "OR": "או"
+ },
+
+ "operators": {
+ "equal": "שווה ל",
+ "not_equal": "שונה מ",
+ "in": "חלק מ",
+ "not_in": "לא חלק מ",
+ "less": "פחות מ",
+ "less_or_equal": "פחות או שווה ל",
+ "greater": "גדול מ",
+ "greater_or_equal": "גדול או שווה ל",
+ "between": "בין",
+ "not_between": "לא בין",
+ "begins_with": "מתחיל ב",
+ "not_begins_with": "לא מתחיל ב",
+ "contains": "מכיל",
+ "not_contains": "לא מכיל",
+ "ends_with": "מסתיים ב",
+ "not_ends_with": "לא מסתיים ב",
+ "is_empty": "ריק",
+ "is_not_empty": "לא ריק",
+ "is_null": "חסר ערך",
+ "is_not_null": "לא חסר ערך"
+ },
+
+ "errors": {
+ "no_filter": "לא נבחרו מסננים",
+ "empty_group": "הקבוצה רירקה",
+ "radio_empty": "לא נבחר אף ערך",
+ "checkbox_empty": "לא נבחר אף ערך",
+ "select_empty": "לא נבחר אף ערך",
+ "string_empty": "חסר ערך",
+ "string_exceed_min_length": "המחרוזת חייבת להכיל לפחות {0} תווים",
+ "string_exceed_max_length": "המחרוזת לא יכולה להכיל יותר מ{0} תווים",
+ "string_invalid_format": "המחרוזת בפורמט שגוי ({0})",
+ "number_nan": "זהו לא מספר",
+ "number_not_integer": "המספר אינו מספר שלם",
+ "number_not_double": "המספר אינו מספר עשרוני",
+ "number_exceed_min": "המספר צריך להיות גדול מ {0}",
+ "number_exceed_max": "המספר צריך להיות קטן מ{0}",
+ "number_wrong_step": "המספר צריך להיות כפולה של {0}",
+ "datetime_empty": "תאריך ריק",
+ "datetime_invalid": "פורמט תאריך שגוי ({0})",
+ "datetime_exceed_min": "התאריך חייב להיות אחרי {0}",
+ "datetime_exceed_max": "התאריך חייב להיות לפני {0}",
+ "boolean_not_valid": "זהו לא בוליאני",
+ "operator_not_multiple": "האופרטור {0} לא יכול לקבל ערכים מרובים"
+ }
+}
\ No newline at end of file
diff --git a/src/plugins/invert/i18n/he.json b/src/plugins/invert/i18n/he.json
new file mode 100644
index 00000000..c279ee3d
--- /dev/null
+++ b/src/plugins/invert/i18n/he.json
@@ -0,0 +1,3 @@
+{
+ "invert": "הפוך שאילתא"
+}
diff --git a/src/plugins/not-group/i18n/he.json b/src/plugins/not-group/i18n/he.json
new file mode 100644
index 00000000..ac76d192
--- /dev/null
+++ b/src/plugins/not-group/i18n/he.json
@@ -0,0 +1,3 @@
+{
+ "NOT": "לא"
+}
From f0fa29c2cdf616199e70af70d050dd454ecd8c4f Mon Sep 17 00:00:00 2001
From: Damien SOREL
Date: Wed, 4 Jan 2017 13:53:35 +0100
Subject: [PATCH 004/113] Fix #404 radio state lost on drag-and-drop
---
src/core.js | 21 ++++++++---------
src/data.js | 15 +++++++------
src/model.js | 3 +++
src/plugins/sortable/plugin.js | 41 +++++++++++++++++++++-------------
4 files changed, 48 insertions(+), 32 deletions(-)
diff --git a/src/core.js b/src/core.js
index 5a9c31a9..d829bd67 100644
--- a/src/core.js
+++ b/src/core.js
@@ -14,8 +14,7 @@ QueryBuilder.prototype.init = function($el, options) {
generated_id: false,
has_optgroup: false,
has_operator_oprgroup: false,
- id: null,
- updating_value: false
+ id: null
};
// "allow_groups" can be boolean or int
@@ -601,9 +600,11 @@ QueryBuilder.prototype.createRuleInput = function(rule) {
$valueContainer.show();
$inputs.on('change ' + (filter.input_event || ''), function() {
- self.status.updating_value = true;
- rule.value = self.getRuleValue(rule);
- self.status.updating_value = false;
+ if (!this._updating_input) {
+ rule._updating_value = true;
+ rule.value = self.getRuleInputValue(rule);
+ rule._updating_value = false;
+ }
});
if (filter.plugin) {
@@ -616,9 +617,9 @@ QueryBuilder.prototype.createRuleInput = function(rule) {
rule.value = filter.default_value;
}
else {
- self.status.updating_value = true;
- rule.value = self.getRuleValue(rule);
- self.status.updating_value = false;
+ rule._updating_value = true;
+ rule.value = self.getRuleInputValue(rule);
+ rule._updating_value = false;
}
};
@@ -676,8 +677,8 @@ QueryBuilder.prototype.updateRuleOperator = function(rule, previousOperator) {
* @param rule {Rule}
*/
QueryBuilder.prototype.updateRuleValue = function(rule) {
- if (!this.status.updating_value) {
- this.setRuleValue(rule, rule.value);
+ if (!rule._updating_value) {
+ this.setRuleInputValue(rule, rule.value);
}
this.trigger('afterUpdateRuleValue', rule);
diff --git a/src/data.js b/src/data.js
index c05e885c..537c4bed 100644
--- a/src/data.js
+++ b/src/data.js
@@ -310,11 +310,11 @@ QueryBuilder.prototype.getOperatorByType = function(type, doThrow) {
};
/**
- * Returns rule value
+ * Returns rule's input value
* @param rule {Rule}
* @return {mixed}
*/
-QueryBuilder.prototype.getRuleValue = function(rule) {
+QueryBuilder.prototype.getRuleInputValue = function(rule) {
var filter = rule.filter;
var operator = rule.operator;
var value = [];
@@ -380,11 +380,11 @@ QueryBuilder.prototype.getRuleValue = function(rule) {
};
/**
- * Sets the value of a rule.
+ * Sets the value of a rule's input.
* @param rule {Rule}
* @param value {mixed}
*/
-QueryBuilder.prototype.setRuleValue = function(rule, value) {
+QueryBuilder.prototype.setRuleInputValue = function(rule, value) {
var filter = rule.filter;
var operator = rule.operator;
@@ -392,6 +392,8 @@ QueryBuilder.prototype.setRuleValue = function(rule, value) {
return;
}
+ this._updating_input = true;
+
if (filter.valueSetter) {
filter.valueSetter.call(this, rule, value);
}
@@ -401,9 +403,6 @@ QueryBuilder.prototype.setRuleValue = function(rule, value) {
if (operator.nb_inputs == 1) {
value = [value];
}
- else {
- value = value;
- }
for (var i = 0; i < operator.nb_inputs; i++) {
var name = Utils.escapeElementId(rule.id + '_value_' + i);
@@ -431,6 +430,8 @@ QueryBuilder.prototype.setRuleValue = function(rule, value) {
}
}
}
+
+ this._updating_input = false;
};
/**
diff --git a/src/model.js b/src/model.js
index 39db5988..e67538e2 100644
--- a/src/model.js
+++ b/src/model.js
@@ -410,6 +410,9 @@ var Rule = function(parent, $el) {
Node.call(this, parent, $el);
+ this._updating_value = false;
+ this._updating_input = false;
+
this.__.filter = null;
this.__.operator = null;
this.__.flags = {};
diff --git a/src/plugins/sortable/plugin.js b/src/plugins/sortable/plugin.js
index d9fd30ef..ec94fe81 100644
--- a/src/plugins/sortable/plugin.js
+++ b/src/plugins/sortable/plugin.js
@@ -116,7 +116,7 @@ QueryBuilder.define('sortable', function(options) {
moveSortableToTarget(placeholder, $(event.target));
},
ondrop: function(event) {
- moveSortableToTarget(src, $(event.target));
+ moveSortableToTarget(src, $(event.target), self);
}
});
@@ -131,7 +131,7 @@ QueryBuilder.define('sortable', function(options) {
moveSortableToTarget(placeholder, $(event.target));
},
ondrop: function(event) {
- moveSortableToTarget(src, $(event.target));
+ moveSortableToTarget(src, $(event.target), self);
}
});
}
@@ -186,29 +186,40 @@ QueryBuilder.define('sortable', function(options) {
* Move an element (placeholder or actual object) depending on active target
* @param {Node} node
* @param {jQuery} target
+ * @param {QueryBuilder} [builder]
*/
-function moveSortableToTarget(node, target) {
- var parent;
+function moveSortableToTarget(node, target, builder) {
+ var parent, method;
// on rule
parent = target.closest(Selectors.rule_container);
if (parent.length) {
- node.moveAfter(Model(parent));
- return;
+ method = 'moveAfter';
}
// on group header
- parent = target.closest(Selectors.group_header);
- if (parent.length) {
- parent = target.closest(Selectors.group_container);
- node.moveAtBegin(Model(parent));
- return;
+ if (!method) {
+ parent = target.closest(Selectors.group_header);
+ if (parent.length) {
+ parent = target.closest(Selectors.group_container);
+ method = 'moveAtBegin';
+ }
}
// on group
- parent = target.closest(Selectors.group_container);
- if (parent.length) {
- node.moveAtEnd(Model(parent));
- return;
+ if (!method) {
+ parent = target.closest(Selectors.group_container);
+ if (parent.length) {
+ method = 'moveAtEnd';
+ }
+ }
+
+ if (method) {
+ node[method](Model(parent));
+
+ // refresh radio value
+ if (builder && node instanceof Rule) {
+ builder.setRuleInputValue(node, node.value);
+ }
}
}
From 92403331fddcb22551edd0f193a9db5ed56eaa98 Mon Sep 17 00:00:00 2001
From: mistic100
Date: Thu, 5 Jan 2017 19:33:11 +0100
Subject: [PATCH 005/113] Fix #416 coordinates demo
---
examples/index.html | 25 ++++++++++++++-----------
1 file changed, 14 insertions(+), 11 deletions(-)
diff --git a/examples/index.html b/examples/index.html
index c3294a8d..b19b5cc8 100644
--- a/examples/index.html
+++ b/examples/index.html
@@ -365,10 +365,10 @@ Output
validation: {
format: /^[A-C]{1}.[1-6]{1}$/
},
- input: function(rule) {
+ input: function(rule, name) {
var $container = rule.$el.find('.rule-value-container');
- $container.on('change', '[name=coord_1]', function(){
+ $container.on('change', '[name='+ name +'_1]', function(){
var h = '';
switch ($(this).val()) {
@@ -383,27 +383,30 @@ Output
break;
}
- $container.find('[name=coord_2]').html(h).toggle(h!='');
+ $container.find('[name$=_2]')
+ .html(h).toggle(!!h)
+ .val('-1').trigger('change');
});
return '\
-