{"version":3,"names":["root","factory","define","amd","module","exports","require","jQuery","this","$","extendext","options","name","src","copy","copyIsArray","clone","target","arguments","i","length","deep","arrayMode","toLowerCase","isFunction","isArray","concat","extend","forEach","e","type","indexOf","push","isPlainObject","Array","undefined","QueryBuilder","$el","queryBuilder","settings","DEFAULTS","model","Model","status","id","generated_id","group_id","rule_id","has_optgroup","has_operator_optgroup","filters","icons","operators","templates","plugins","lang","regional","Utils","error","lang_code","allow_groups","Object","keys","tpl","Error","attr","Math","floor","random","addClass","checkFilters","checkOperators","bindEvents","initPlugins","prototype","trigger","event","Event","_tojQueryEvent","builder","triggerHandler","slice","call","change","value","on","cb","off","once","one","filter","split","map","join","types","string","integer","double","date","time","datetime","boolean","inputs","modifiable_options","selectors","group_container","rule_container","filter_container","operator_container","value_container","error_container","condition_container","rule_header","group_header","group_actions","rule_actions","rules_list","group_condition","rule_filter","rule_operator","rule_value","add_rule","delete_rule","add_group","delete_group","OPERATORS","equal","nb_inputs","multiple","apply_to","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","sort_filters","display_errors","allow_empty","conditions","default_condition","inputs_separator","select_placeholder","display_empty_filter","default_filter","optgroups","default_rule_flags","filter_readonly","operator_readonly","value_readonly","no_delete","default_group_flags","condition_readonly","no_add_rule","no_add_group","group","rule","filterSelect","operatorSelect","ruleValueSelect","ruleValueCheck","remove_group","remove_rule","defaults","fct","def","methods","tmp","plugin","getPluginOptions","property","init","rules","setRules","setRoot","definedFilters","input","operator","field","label","optgroup","values","cleanValues","iterateOptions","bind","groupSort","placeholder","placeholder_value","entry","sort","self","a","b","translate","localeCompare","definedOperators","Selectors","is","$group","closest","getModel","condition","val","$rule","getFilterById","getOperatorByType","addRule","deleteRule","addGroup","deleteGroup","drop","node","remove","refreshGroupsConditions","add","parent","index","prependTo","find","insertAfter","move","detach","update","oldValue","Rule","updateError","applyRuleFlags","updateRuleFilter","updateRuleOperator","updateRuleValue","applyGroupFlags","updateGroupCondition","data","flags","nextGroupId","parseHTML","getGroupTemplate","append","Group","tooltip","placement","level","isDefaultPrevented","isRoot","del","each","previousCondition","$this","prop","toggleClass","walk","nextRuleId","getRuleTemplate","createRuleFilters","$filterSelect","getRuleFilterSelect","html","createRuleOperators","$operatorContainer","empty","getOperators","$operatorSelect","getRuleOperatorSelect","default_operator","__","createRuleInput","$valueContainer","$inputs","$ruleInput","getRuleInput","trim","document","css","input_event","_updating_input","_updating_value","getRuleInputValue","plugin_config","default_value","previousFilter","previousOperator","hide","previousValue","setRuleInputValue","clearErrors","removeClass","errorMessage","fmt","eq","triggerValidationError","destroy","removeAttr","clear","removeData","reset","setOptions","opt","Node","validate","skip_empty","valid","parse","done","errors","validateValue","res","getRules","get_flags","allow_invalid","out","groupData","getGroupFlags","isEmptyObject","ruleData","getRuleFlags","parseGroupFlags","item","parseRuleFlags","validation","result","callback","_validateValue","tempValue","allow_empty_value","j","min","parseInt","getValidationMessage","max","format","RegExp","test","isNaN","parseFloat","step","v","toPrecision","window","DateTime","fromFormat","isValid","l","doThrow","valueGetter","$value","escapeElementId","value_separator","subval","changeType","valueSetter","readonly","all","ret","key","category","translation","messages","icon","vertical","h","getRuleValueSelect","getRuleValueCheck","value_id","size","rows","utils","str","args","replace","m","message","err","console","ew","parseNumber","parseDateTime","toSQLDate","convertToBool","escapeString","additionalEscape","escaped","s","escapeRegExp","$0","$1","$2","items","newItems","idx","lastIndexOf","splice","defineModelProperties","obj","fields","defineProperty","enumerable","get","set","apply","getPos","getNodePos","removeNode","moveAfter","moveAtBegin","moveAtEnd","insertNode","create","constructor","reverse","cbRule","cbGroup","context","c","stop","recursive","getStmtConfig","stmt","config","match","fn","option","setFilters","deleteOrphans","filtersIds","checkOrphans","updateBuilder","updateDisabledFilters","selectpicker","addFilter","newFilters","position","some","removeFilter","filterIds","mode","$p","description","getFilterDescription","appendTo","$b","after","dir","container","title","invert","display_rules_button","invert_rules","disable_template","$h","silent_fail","operatorOpposites","conditionOpposites","AND","OR","tempOpts","no_invert","not","updateGroupNot","before","json","toUpperCase","operation","SQLParser","nodes","Op","$nor","applyToFilter","select2","filterSelect2Options","applyToOperator","operatorSelect2Options","applyToValue","valueSelect2Options","boolean_as_integer","sqlOperators","op","sep","mod","escape","sqlRuleOperator","LIKE","IN","BETWEEN","IS","sqlStatements","question_mark","params","run","numbered","char","named","indexes","sqlRuleStatement","esc","sql","regex1","regex2","getSQL","nl","parts","ope","sqlFn","ruleExpression","groupExpression","getRulesFromSQL","query","parsed","where","curr","flatten","next","left","right","sqlrl","opVal","JSON","stringify","finalValue","searchChars","getSQLFieldID","setRulesFromSQL","matchingFilters","used_filters","applyDisabledFilters","clearDisabledFilters","unique","filterId","groups","__locale","__author","no_filter","empty_group","radio_empty","checkbox_empty","select_empty","string_empty","string_exceed_min_length","string_exceed_max_length","string_invalid_format","number_nan","number_not_integer","number_not_double","number_exceed_min","number_exceed_max","number_wrong_step","number_between_invalid","datetime_empty","datetime_invalid","datetime_exceed_min","datetime_exceed_max","datetime_between_invalid","boolean_not_valid","operator_not_multiple","NOT"],"sources":["../template/php2024/jquery/query-builder.js"],"sourcesContent":["/*!\n * jQuery.extendext 1.0.0\n *\n * Copyright 2014-2019 Damien \"Mistic\" Sorel (http://www.strangeplanet.fr)\n * Licensed under MIT (http://opensource.org/licenses/MIT)\n *\n * Based on jQuery.extend by jQuery Foundation, Inc. and other contributors\n */\n\n(function (root, factory) {\n if (typeof define === 'function' && define.amd) {\n define('jquery-extendext', ['jquery'], factory);\n }\n else if (typeof module === 'object' && module.exports) {\n module.exports = factory(require('jquery'));\n }\n else {\n factory(root.jQuery);\n }\n}(this, function ($) {\n \"use strict\";\n\n $.extendext = function () {\n var options, name, src, copy, copyIsArray, clone,\n target = arguments[0] || {},\n i = 1,\n length = arguments.length,\n deep = false,\n arrayMode = 'default';\n\n // Handle a deep copy situation\n if (typeof target === \"boolean\") {\n deep = target;\n\n // Skip the boolean and the target\n target = arguments[i++] || {};\n }\n\n // Handle array mode parameter\n if (typeof target === \"string\") {\n arrayMode = target.toLowerCase();\n if (arrayMode !== 'concat' && arrayMode !== 'replace' && arrayMode !== 'extend') {\n arrayMode = 'default';\n }\n\n // Skip the string param\n target = arguments[i++] || {};\n }\n\n // Handle case when target is a string or something (possible in deep copy)\n if (typeof target !== \"object\" && !$.isFunction(target)) {\n target = {};\n }\n\n // Extend jQuery itself if only one argument is passed\n if (i === length) {\n target = this;\n i--;\n }\n\n for (; i < length; i++) {\n // Only deal with non-null/undefined values\n if ((options = arguments[i]) !== null) {\n // Special operations for arrays\n if ($.isArray(options) && arrayMode !== 'default') {\n clone = target && $.isArray(target) ? target : [];\n\n switch (arrayMode) {\n case 'concat':\n target = clone.concat($.extend(deep, [], options));\n break;\n\n case 'replace':\n target = $.extend(deep, [], options);\n break;\n\n case 'extend':\n options.forEach(function (e, i) {\n if (typeof e === 'object') {\n var type = $.isArray(e) ? [] : {};\n clone[i] = $.extendext(deep, arrayMode, clone[i] || type, e);\n\n } else if (clone.indexOf(e) === -1) {\n clone.push(e);\n }\n });\n\n target = clone;\n break;\n }\n\n } else {\n // Extend the base object\n for (name in options) {\n copy = options[name];\n\n // Prevent never-ending loop\n if (name === '__proto__' || target === copy) {\n continue;\n }\n\n // Recurse if we're merging plain objects or arrays\n if (deep && copy && ( $.isPlainObject(copy) ||\n (copyIsArray = $.isArray(copy)) )) {\n src = target[name];\n\n // Ensure proper type for the source value\n if ( copyIsArray && !Array.isArray( src ) ) {\n clone = [];\n } else if ( !copyIsArray && !$.isPlainObject( src ) ) {\n clone = {};\n } else {\n clone = src;\n }\n copyIsArray = false;\n\n // Never move original objects, clone them\n target[name] = $.extendext(deep, arrayMode, clone, copy);\n\n // Don't bring in undefined values\n } else if (copy !== undefined) {\n target[name] = copy;\n }\n }\n }\n }\n }\n\n // Return the modified object\n return target;\n };\n}));\n\n\n/*!\n * jQuery QueryBuilder 2.7.0\n * Copyright 2014-2023 Damien \"Mistic\" Sorel (http://www.strangeplanet.fr)\n * Licensed under MIT (https://opensource.org/licenses/MIT)\n */\n\n(function(root, factory) {\n if (typeof define == 'function' && define.amd) {\n define('query-builder', ['jquery', 'jquery-extendext'], factory);\n }\n else if (typeof module === 'object' && module.exports) {\n module.exports = factory(require('jquery'), require('jquery-extendext'));\n }\n else {\n factory(root.jQuery);\n }\n}(this, function($) {\n\"use strict\";\n\n/**\n * @typedef {object} Filter\n * @memberof QueryBuilder\n * @description See {@link http://querybuilder.js.org/index.html#filters}\n */\n\n/**\n * @typedef {object} Operator\n * @memberof QueryBuilder\n * @description See {@link http://querybuilder.js.org/index.html#operators}\n */\n\n/**\n * @param {jQuery} $el\n * @param {object} options - see {@link http://querybuilder.js.org/#options}\n * @constructor\n */\nvar QueryBuilder = function($el, options) {\n $el[0].queryBuilder = this;\n\n /**\n * Element container\n * @member {jQuery}\n * @readonly\n */\n this.$el = $el;\n\n /**\n * Configuration object\n * @member {object}\n * @readonly\n */\n this.settings = $.extendext(true, 'replace', {}, QueryBuilder.DEFAULTS, options);\n\n /**\n * Internal model\n * @member {Model}\n * @readonly\n */\n this.model = new Model();\n\n /**\n * Internal status\n * @member {object}\n * @property {string} id - id of the container\n * @property {boolean} generated_id - if the container id has been generated\n * @property {int} group_id - current group id\n * @property {int} rule_id - current rule id\n * @property {boolean} has_optgroup - if filters have optgroups\n * @property {boolean} has_operator_optgroup - if operators have optgroups\n * @readonly\n * @private\n */\n this.status = {\n id: null,\n generated_id: false,\n group_id: 0,\n rule_id: 0,\n has_optgroup: false,\n has_operator_optgroup: false\n };\n\n /**\n * List of filters\n * @member {QueryBuilder.Filter[]}\n * @readonly\n */\n this.filters = this.settings.filters;\n\n /**\n * List of icons\n * @member {object.<string, string>}\n * @readonly\n */\n this.icons = this.settings.icons;\n\n /**\n * List of operators\n * @member {QueryBuilder.Operator[]}\n * @readonly\n */\n this.operators = this.settings.operators;\n\n /**\n * List of templates\n * @member {object.<string, function>}\n * @readonly\n */\n this.templates = this.settings.templates;\n\n /**\n * Plugins configuration\n * @member {object.<string, object>}\n * @readonly\n */\n this.plugins = this.settings.plugins;\n\n /**\n * Translations object\n * @member {object}\n * @readonly\n */\n this.lang = null;\n\n // translations : english << 'lang_code' << custom\n if (QueryBuilder.regional['en'] === undefined) {\n Utils.error('Config', '\"i18n/en.js\" not loaded.');\n }\n this.lang = $.extendext(true, 'replace', {}, QueryBuilder.regional['en'], QueryBuilder.regional[this.settings.lang_code], this.settings.lang);\n\n // \"allow_groups\" can be boolean or int\n if (this.settings.allow_groups === false) {\n this.settings.allow_groups = 0;\n }\n else if (this.settings.allow_groups === true) {\n this.settings.allow_groups = -1;\n }\n\n // init templates\n Object.keys(this.templates).forEach(function(tpl) {\n if (!this.templates[tpl]) {\n this.templates[tpl] = QueryBuilder.templates[tpl];\n }\n if (typeof this.templates[tpl] !== 'function') {\n throw new Error(`Template ${tpl} must be a function`);\n }\n }, this);\n\n // ensure we have a container id\n if (!this.$el.attr('id')) {\n this.$el.attr('id', 'qb_' + Math.floor(Math.random() * 99999));\n this.status.generated_id = true;\n }\n this.status.id = this.$el.attr('id');\n\n // INIT\n this.$el.addClass('query-builder form-inline');\n\n this.filters = this.checkFilters(this.filters);\n this.operators = this.checkOperators(this.operators);\n this.bindEvents();\n this.initPlugins();\n};\n\n$.extend(QueryBuilder.prototype, /** @lends QueryBuilder.prototype */ {\n /**\n * Triggers an event on the builder container\n * @param {string} type\n * @returns {$.Event}\n */\n trigger: function(type) {\n var event = new $.Event(this._tojQueryEvent(type), {\n builder: this\n });\n\n this.$el.triggerHandler(event, Array.prototype.slice.call(arguments, 1));\n\n return event;\n },\n\n /**\n * Triggers an event on the builder container and returns the modified value\n * @param {string} type\n * @param {*} value\n * @returns {*}\n */\n change: function(type, value) {\n var event = new $.Event(this._tojQueryEvent(type, true), {\n builder: this,\n value: value\n });\n\n this.$el.triggerHandler(event, Array.prototype.slice.call(arguments, 2));\n\n return event.value;\n },\n\n /**\n * Attaches an event listener on the builder container\n * @param {string} type\n * @param {function} cb\n * @returns {QueryBuilder}\n */\n on: function(type, cb) {\n this.$el.on(this._tojQueryEvent(type), cb);\n return this;\n },\n\n /**\n * Removes an event listener from the builder container\n * @param {string} type\n * @param {function} [cb]\n * @returns {QueryBuilder}\n */\n off: function(type, cb) {\n this.$el.off(this._tojQueryEvent(type), cb);\n return this;\n },\n\n /**\n * Attaches an event listener called once on the builder container\n * @param {string} type\n * @param {function} cb\n * @returns {QueryBuilder}\n */\n once: function(type, cb) {\n this.$el.one(this._tojQueryEvent(type), cb);\n return this;\n },\n\n /**\n * Appends `.queryBuilder` and optionally `.filter` to the events names\n * @param {string} name\n * @param {boolean} [filter=false]\n * @returns {string}\n * @private\n */\n _tojQueryEvent: function(name, filter) {\n return name.split(' ').map(function(type) {\n return type + '.queryBuilder' + (filter ? '.filter' : '');\n }).join(' ');\n }\n});\n\n\n/**\n * Allowed types and their internal representation\n * @type {object.<string, string>}\n * @readonly\n * @private\n */\nQueryBuilder.types = {\n 'string': 'string',\n 'integer': 'number',\n 'double': 'number',\n 'date': 'datetime',\n 'time': 'datetime',\n 'datetime': 'datetime',\n 'boolean': 'boolean'\n};\n\n/**\n * Allowed inputs\n * @type {string[]}\n * @readonly\n * @private\n */\nQueryBuilder.inputs = [\n 'text',\n 'number',\n 'textarea',\n 'radio',\n 'checkbox',\n 'select'\n];\n\n/**\n * Runtime modifiable options with `setOptions` method\n * @type {string[]}\n * @readonly\n * @private\n */\nQueryBuilder.modifiable_options = [\n 'display_errors',\n 'allow_groups',\n 'allow_empty',\n 'default_condition',\n 'default_filter'\n];\n\n/**\n * CSS selectors for common components\n * @type {object.<string, string>}\n * @readonly\n */\nQueryBuilder.selectors = {\n group_container: '.rules-group-container',\n rule_container: '.rule-container',\n filter_container: '.rule-filter-container',\n operator_container: '.rule-operator-container',\n value_container: '.rule-value-container',\n error_container: '.error-container',\n condition_container: '.rules-group-header .group-conditions',\n\n rule_header: '.rule-header',\n group_header: '.rules-group-header',\n group_actions: '.group-actions',\n rule_actions: '.rule-actions',\n\n rules_list: '.rules-group-body>.rules-list',\n\n group_condition: '.rules-group-header [name$=_cond]',\n rule_filter: '.rule-filter-container [name$=_filter]',\n rule_operator: '.rule-operator-container [name$=_operator]',\n rule_value: '.rule-value-container [name*=_value_]',\n\n add_rule: '[data-add=rule]',\n delete_rule: '[data-delete=rule]',\n add_group: '[data-add=group]',\n delete_group: '[data-delete=group]'\n};\n\n/**\n * Template strings (see template.js)\n * @type {object.<string, string>}\n * @readonly\n */\nQueryBuilder.templates = {};\n\n/**\n * Localized strings (see i18n/)\n * @type {object.<string, object>}\n * @readonly\n */\nQueryBuilder.regional = {};\n\n/**\n * Default operators\n * @type {object.<string, object>}\n * @readonly\n */\nQueryBuilder.OPERATORS = {\n equal: { type: 'equal', nb_inputs: 1, multiple: false, apply_to: ['string', 'number', 'datetime', 'boolean'] },\n not_equal: { type: 'not_equal', nb_inputs: 1, multiple: false, apply_to: ['string', 'number', 'datetime', 'boolean'] },\n in: { type: 'in', nb_inputs: 1, multiple: true, apply_to: ['string', 'number', 'datetime'] },\n not_in: { type: 'not_in', nb_inputs: 1, multiple: true, apply_to: ['string', 'number', 'datetime'] },\n less: { type: 'less', nb_inputs: 1, multiple: false, apply_to: ['number', 'datetime'] },\n less_or_equal: { type: 'less_or_equal', nb_inputs: 1, multiple: false, apply_to: ['number', 'datetime'] },\n greater: { type: 'greater', nb_inputs: 1, multiple: false, apply_to: ['number', 'datetime'] },\n greater_or_equal: { type: 'greater_or_equal', nb_inputs: 1, multiple: false, apply_to: ['number', 'datetime'] },\n between: { type: 'between', nb_inputs: 2, multiple: false, apply_to: ['number', 'datetime'] },\n not_between: { type: 'not_between', nb_inputs: 2, multiple: false, apply_to: ['number', 'datetime'] },\n begins_with: { type: 'begins_with', nb_inputs: 1, multiple: false, apply_to: ['string'] },\n not_begins_with: { type: 'not_begins_with', nb_inputs: 1, multiple: false, apply_to: ['string'] },\n contains: { type: 'contains', nb_inputs: 1, multiple: false, apply_to: ['string'] },\n not_contains: { type: 'not_contains', nb_inputs: 1, multiple: false, apply_to: ['string'] },\n ends_with: { type: 'ends_with', nb_inputs: 1, multiple: false, apply_to: ['string'] },\n not_ends_with: { type: 'not_ends_with', nb_inputs: 1, multiple: false, apply_to: ['string'] },\n is_empty: { type: 'is_empty', nb_inputs: 0, multiple: false, apply_to: ['string'] },\n is_not_empty: { type: 'is_not_empty', nb_inputs: 0, multiple: false, apply_to: ['string'] },\n is_null: { type: 'is_null', nb_inputs: 0, multiple: false, apply_to: ['string', 'number', 'datetime', 'boolean'] },\n is_not_null: { type: 'is_not_null', nb_inputs: 0, multiple: false, apply_to: ['string', 'number', 'datetime', 'boolean'] }\n};\n\n/**\n * Default configuration\n * @type {object}\n * @readonly\n */\nQueryBuilder.DEFAULTS = {\n filters: [],\n plugins: [],\n\n sort_filters: false,\n display_errors: true,\n allow_groups: -1,\n allow_empty: false,\n conditions: ['AND', 'OR'],\n default_condition: 'AND',\n inputs_separator: ' , ',\n select_placeholder: '------',\n display_empty_filter: true,\n default_filter: null,\n optgroups: {},\n\n default_rule_flags: {\n filter_readonly: false,\n operator_readonly: false,\n value_readonly: false,\n no_delete: false\n },\n\n default_group_flags: {\n condition_readonly: false,\n no_add_rule: false,\n no_add_group: false,\n no_delete: false\n },\n\n templates: {\n group: null,\n rule: null,\n filterSelect: null,\n operatorSelect: null,\n ruleValueSelect: null,\n ruleValueCheck: null\n },\n\n lang_code: 'en',\n lang: {},\n\n operators: [\n 'equal',\n 'not_equal',\n 'in',\n 'not_in',\n 'less',\n 'less_or_equal',\n 'greater',\n 'greater_or_equal',\n 'between',\n 'not_between',\n 'begins_with',\n 'not_begins_with',\n 'contains',\n 'not_contains',\n 'ends_with',\n 'not_ends_with',\n 'is_empty',\n 'is_not_empty',\n 'is_null',\n 'is_not_null'\n ],\n\n icons: {\n add_group: 'fa-solid fa-circle-plus',\n add_rule: 'fa-solid fa-plus',\n remove_group: 'fa-solid fa-xmark',\n remove_rule: 'fa-solid fa-xmark',\n error: 'fa-solid fa-circle-exclamation'\n }\n};\n\n\n/**\n * @module plugins\n */\n\n/**\n * Definition of available plugins\n * @type {object.<String, object>}\n */\nQueryBuilder.plugins = {};\n\n/**\n * Gets or extends the default configuration\n * @param {object} [options] - new configuration\n * @returns {undefined|object} nothing or configuration object (copy)\n */\nQueryBuilder.defaults = function(options) {\n if (typeof options == 'object') {\n $.extendext(true, 'replace', QueryBuilder.DEFAULTS, options);\n }\n else if (typeof options == 'string') {\n if (typeof QueryBuilder.DEFAULTS[options] == 'object') {\n return $.extend(true, {}, QueryBuilder.DEFAULTS[options]);\n }\n else {\n return QueryBuilder.DEFAULTS[options];\n }\n }\n else {\n return $.extend(true, {}, QueryBuilder.DEFAULTS);\n }\n};\n\n/**\n * Registers a new plugin\n * @param {string} name\n * @param {function} fct - init function\n * @param {object} [def] - default options\n */\nQueryBuilder.define = function(name, fct, def) {\n QueryBuilder.plugins[name] = {\n fct: fct,\n def: def || {}\n };\n};\n\n/**\n * Adds new methods to QueryBuilder prototype\n * @param {object.<string, function>} methods\n */\nQueryBuilder.extend = function(methods) {\n $.extend(QueryBuilder.prototype, methods);\n};\n\n/**\n * Initializes plugins for an instance\n * @throws ConfigError\n * @private\n */\nQueryBuilder.prototype.initPlugins = function() {\n if (!this.plugins) {\n return;\n }\n\n if (Array.isArray(this.plugins)) {\n var tmp = {};\n this.plugins.forEach(function(plugin) {\n tmp[plugin] = null;\n });\n this.plugins = tmp;\n }\n\n Object.keys(this.plugins).forEach(function(plugin) {\n if (plugin in QueryBuilder.plugins) {\n this.plugins[plugin] = $.extend(true, {},\n QueryBuilder.plugins[plugin].def,\n this.plugins[plugin] || {}\n );\n\n QueryBuilder.plugins[plugin].fct.call(this, this.plugins[plugin]);\n }\n else {\n Utils.error('Config', 'Unable to find plugin \"{0}\"', plugin);\n }\n }, this);\n};\n\n/**\n * Returns the config of a plugin, if the plugin is not loaded, returns the default config.\n * @param {string} name\n * @param {string} [property]\n * @throws ConfigError\n * @returns {*}\n */\nQueryBuilder.prototype.getPluginOptions = function(name, property) {\n var plugin;\n if (this.plugins && this.plugins[name]) {\n plugin = this.plugins[name];\n }\n else if (QueryBuilder.plugins[name]) {\n plugin = QueryBuilder.plugins[name].def;\n }\n\n if (plugin) {\n if (property) {\n return plugin[property];\n }\n else {\n return plugin;\n }\n }\n else {\n Utils.error('Config', 'Unable to find plugin \"{0}\"', name);\n }\n};\n\n\n/**\n * Final initialisation of the builder\n * @param {object} [rules]\n * @fires QueryBuilder.afterInit\n * @private\n */\nQueryBuilder.prototype.init = function(rules) {\n /**\n * When the initilization is done, just before creating the root group\n * @event afterInit\n * @memberof QueryBuilder\n */\n this.trigger('afterInit');\n\n if (rules) {\n this.setRules(rules);\n delete this.settings.rules;\n }\n else {\n this.setRoot(true);\n }\n};\n\n/**\n * Checks the configuration of each filter\n * @param {QueryBuilder.Filter[]} filters\n * @returns {QueryBuilder.Filter[]}\n * @throws ConfigError\n */\nQueryBuilder.prototype.checkFilters = function(filters) {\n var definedFilters = [];\n\n if (!filters || filters.length === 0) {\n Utils.error('Config', 'Missing filters list');\n }\n\n filters.forEach(function(filter, i) {\n if (!filter.id) {\n Utils.error('Config', 'Missing filter {0} id', i);\n }\n if (definedFilters.indexOf(filter.id) != -1) {\n Utils.error('Config', 'Filter \"{0}\" already defined', filter.id);\n }\n definedFilters.push(filter.id);\n\n if (!filter.type) {\n filter.type = 'string';\n }\n else if (!QueryBuilder.types[filter.type]) {\n Utils.error('Config', 'Invalid type \"{0}\"', filter.type);\n }\n\n if (!filter.input) {\n filter.input = QueryBuilder.types[filter.type] === 'number' ? 'number' : 'text';\n }\n else if (typeof filter.input != 'function' && QueryBuilder.inputs.indexOf(filter.input) == -1) {\n Utils.error('Config', 'Invalid input \"{0}\"', filter.input);\n }\n\n if (filter.operators) {\n filter.operators.forEach(function(operator) {\n if (typeof operator != 'string') {\n Utils.error('Config', 'Filter operators must be global operators types (string)');\n }\n });\n }\n\n if (!filter.field) {\n filter.field = filter.id;\n }\n if (!filter.label) {\n filter.label = filter.field;\n }\n\n if (!filter.optgroup) {\n filter.optgroup = null;\n }\n else {\n this.status.has_optgroup = true;\n\n // register optgroup if needed\n if (!this.settings.optgroups[filter.optgroup]) {\n this.settings.optgroups[filter.optgroup] = filter.optgroup;\n }\n }\n\n switch (filter.input) {\n case 'radio':\n case 'checkbox':\n if (!filter.values || filter.values.length < 1) {\n Utils.error('Config', 'Missing filter \"{0}\" values', filter.id);\n }\n break;\n\n case 'select':\n var cleanValues = [];\n filter.has_optgroup = false;\n\n Utils.iterateOptions(filter.values, function(value, label, optgroup) {\n cleanValues.push({\n value: value,\n label: label,\n optgroup: optgroup || null\n });\n\n if (optgroup) {\n filter.has_optgroup = true;\n\n // register optgroup if needed\n if (!this.settings.optgroups[optgroup]) {\n this.settings.optgroups[optgroup] = optgroup;\n }\n }\n }.bind(this));\n\n if (filter.has_optgroup) {\n filter.values = Utils.groupSort(cleanValues, 'optgroup');\n }\n else {\n filter.values = cleanValues;\n }\n\n if (filter.placeholder) {\n if (filter.placeholder_value === undefined) {\n filter.placeholder_value = -1;\n }\n\n filter.values.forEach(function(entry) {\n if (entry.value == filter.placeholder_value) {\n Utils.error('Config', 'Placeholder of filter \"{0}\" overlaps with one of its values', filter.id);\n }\n });\n }\n break;\n }\n }, this);\n\n if (this.settings.sort_filters) {\n if (typeof this.settings.sort_filters == 'function') {\n filters.sort(this.settings.sort_filters);\n }\n else {\n var self = this;\n filters.sort(function(a, b) {\n return self.translate(a.label).localeCompare(self.translate(b.label));\n });\n }\n }\n\n if (this.status.has_optgroup) {\n filters = Utils.groupSort(filters, 'optgroup');\n }\n\n return filters;\n};\n\n/**\n * Checks the configuration of each operator\n * @param {QueryBuilder.Operator[]} operators\n * @returns {QueryBuilder.Operator[]}\n * @throws ConfigError\n */\nQueryBuilder.prototype.checkOperators = function(operators) {\n var definedOperators = [];\n\n operators.forEach(function(operator, i) {\n if (typeof operator == 'string') {\n if (!QueryBuilder.OPERATORS[operator]) {\n Utils.error('Config', 'Unknown operator \"{0}\"', operator);\n }\n\n operators[i] = operator = $.extendext(true, 'replace', {}, QueryBuilder.OPERATORS[operator]);\n }\n else {\n if (!operator.type) {\n Utils.error('Config', 'Missing \"type\" for operator {0}', i);\n }\n\n if (QueryBuilder.OPERATORS[operator.type]) {\n operators[i] = operator = $.extendext(true, 'replace', {}, QueryBuilder.OPERATORS[operator.type], operator);\n }\n\n if (operator.nb_inputs === undefined || operator.apply_to === undefined) {\n Utils.error('Config', 'Missing \"nb_inputs\" and/or \"apply_to\" for operator \"{0}\"', operator.type);\n }\n }\n\n if (definedOperators.indexOf(operator.type) != -1) {\n Utils.error('Config', 'Operator \"{0}\" already defined', operator.type);\n }\n definedOperators.push(operator.type);\n\n if (!operator.optgroup) {\n operator.optgroup = null;\n }\n else {\n this.status.has_operator_optgroup = true;\n\n // register optgroup if needed\n if (!this.settings.optgroups[operator.optgroup]) {\n this.settings.optgroups[operator.optgroup] = operator.optgroup;\n }\n }\n }, this);\n\n if (this.status.has_operator_optgroup) {\n operators = Utils.groupSort(operators, 'optgroup');\n }\n\n return operators;\n};\n\n/**\n * Adds all events listeners to the builder\n * @private\n */\nQueryBuilder.prototype.bindEvents = function() {\n var self = this;\n var Selectors = QueryBuilder.selectors;\n\n // group condition change\n this.$el.on('change.queryBuilder', Selectors.group_condition, function() {\n if ($(this).is(':checked')) {\n var $group = $(this).closest(Selectors.group_container);\n self.getModel($group).condition = $(this).val();\n }\n });\n\n // rule filter change\n this.$el.on('change.queryBuilder', Selectors.rule_filter, function() {\n var $rule = $(this).closest(Selectors.rule_container);\n self.getModel($rule).filter = self.getFilterById($(this).val());\n });\n\n // rule operator change\n this.$el.on('change.queryBuilder', Selectors.rule_operator, function() {\n var $rule = $(this).closest(Selectors.rule_container);\n self.getModel($rule).operator = self.getOperatorByType($(this).val());\n });\n\n // add rule button\n this.$el.on('click.queryBuilder', Selectors.add_rule, function() {\n var $group = $(this).closest(Selectors.group_container);\n self.addRule(self.getModel($group));\n });\n\n // delete rule button\n this.$el.on('click.queryBuilder', Selectors.delete_rule, function() {\n var $rule = $(this).closest(Selectors.rule_container);\n self.deleteRule(self.getModel($rule));\n });\n\n if (this.settings.allow_groups !== 0) {\n // add group button\n this.$el.on('click.queryBuilder', Selectors.add_group, function() {\n var $group = $(this).closest(Selectors.group_container);\n self.addGroup(self.getModel($group));\n });\n\n // delete group button\n this.$el.on('click.queryBuilder', Selectors.delete_group, function() {\n var $group = $(this).closest(Selectors.group_container);\n self.deleteGroup(self.getModel($group));\n });\n }\n\n // model events\n this.model.on({\n 'drop': function(e, node) {\n node.$el.remove();\n self.refreshGroupsConditions();\n },\n 'add': function(e, parent, node, index) {\n if (index === 0) {\n node.$el.prependTo(parent.$el.find('>' + QueryBuilder.selectors.rules_list));\n }\n else {\n node.$el.insertAfter(parent.rules[index - 1].$el);\n }\n self.refreshGroupsConditions();\n },\n 'move': function(e, node, group, index) {\n node.$el.detach();\n\n if (index === 0) {\n node.$el.prependTo(group.$el.find('>' + QueryBuilder.selectors.rules_list));\n }\n else {\n node.$el.insertAfter(group.rules[index - 1].$el);\n }\n self.refreshGroupsConditions();\n },\n 'update': function(e, node, field, value, oldValue) {\n if (node instanceof Rule) {\n switch (field) {\n case 'error':\n self.updateError(node);\n break;\n\n case 'flags':\n self.applyRuleFlags(node);\n break;\n\n case 'filter':\n self.updateRuleFilter(node, oldValue);\n break;\n\n case 'operator':\n self.updateRuleOperator(node, oldValue);\n break;\n\n case 'value':\n self.updateRuleValue(node, oldValue);\n break;\n }\n }\n else {\n switch (field) {\n case 'error':\n self.updateError(node);\n break;\n\n case 'flags':\n self.applyGroupFlags(node);\n break;\n\n case 'condition':\n self.updateGroupCondition(node, oldValue);\n break;\n }\n }\n }\n });\n};\n\n/**\n * Creates the root group\n * @param {boolean} [addRule=true] - adds a default empty rule\n * @param {object} [data] - group custom data\n * @param {object} [flags] - flags to apply to the group\n * @returns {Group} root group\n * @fires QueryBuilder.afterAddGroup\n */\nQueryBuilder.prototype.setRoot = function(addRule, data, flags) {\n addRule = (addRule === undefined || addRule === true);\n\n var group_id = this.nextGroupId();\n var $group = $($.parseHTML(this.getGroupTemplate(group_id, 1)));\n\n this.$el.append($group);\n this.model.root = new Group(null, $group);\n this.model.root.model = this.model;\n\n this.model.root.data = data;\n this.model.root.flags = $.extend({}, this.settings.default_group_flags, flags);\n this.model.root.condition = this.settings.default_condition;\n\n this.trigger('afterAddGroup', this.model.root);\n\n this.model.root.$el.find(\"[data-bs-toggle=tooltip]\").tooltip({\n //*** container: this.$el[0], // Note: Do not put in this.$el[0] or the position of the tooltip will be affected after size change (e.g. after adding a rule)\n trigger: \"hover\",\n placement: \"bottom\"\n });\n\n if (addRule) {\n this.addRule(this.model.root);\n }\n\n return this.model.root;\n};\n\n/**\n * Adds a new group\n * @param {Group} parent\n * @param {boolean} [addRule=true] - adds a default empty rule\n * @param {object} [data] - group custom data\n * @param {object} [flags] - flags to apply to the group\n * @returns {Group}\n * @fires QueryBuilder.beforeAddGroup\n * @fires QueryBuilder.afterAddGroup\n */\nQueryBuilder.prototype.addGroup = function(parent, addRule, data, flags) {\n addRule = (addRule === undefined || addRule === true);\n\n var level = parent.level + 1;\n\n /**\n * Just before adding a group, can be prevented.\n * @event beforeAddGroup\n * @memberof QueryBuilder\n * @param {Group} parent\n * @param {boolean} addRule - if an empty rule will be added in the group\n * @param {int} level - nesting level of the group, 1 is the root group\n */\n var e = this.trigger('beforeAddGroup', parent, addRule, level);\n if (e.isDefaultPrevented()) {\n return null;\n }\n\n var group_id = this.nextGroupId();\n var $group = $(this.getGroupTemplate(group_id, level));\n var model = parent.addGroup($group);\n\n model.data = data;\n model.flags = $.extend({}, this.settings.default_group_flags, flags);\n model.condition = this.settings.default_condition;\n\n /**\n * Just after adding a group\n * @event afterAddGroup\n * @memberof QueryBuilder\n * @param {Group} group\n */\n this.trigger('afterAddGroup', model);\n\n model.$el.find(\"[data-bs-toggle=tooltip]\").tooltip({\n //*** container: this.$el[0],\n trigger: \"hover\",\n placement: \"bottom\"\n });\n\n /**\n * After any change in the rules\n * @event rulesChanged\n * @memberof QueryBuilder\n */\n this.trigger('rulesChanged');\n\n if (addRule) {\n this.addRule(model);\n }\n\n return model;\n};\n\n/**\n * Tries to delete a group. The group is not deleted if at least one rule is flagged `no_delete`.\n * @param {Group} group\n * @returns {boolean} if the group has been deleted\n * @fires QueryBuilder.beforeDeleteGroup\n * @fires QueryBuilder.afterDeleteGroup\n */\nQueryBuilder.prototype.deleteGroup = function(group) {\n if (group.isRoot()) {\n return false;\n }\n\n /**\n * Just before deleting a group, can be prevented\n * @event beforeDeleteGroup\n * @memberof QueryBuilder\n * @param {Group} parent\n */\n var e = this.trigger('beforeDeleteGroup', group);\n if (e.isDefaultPrevented()) {\n return false;\n }\n\n var del = true;\n\n group.each('reverse', function(rule) {\n del &= this.deleteRule(rule);\n }, function(group) {\n del &= this.deleteGroup(group);\n }, this);\n\n if (del) {\n group.drop();\n\n /**\n * Just after deleting a group\n * @event afterDeleteGroup\n * @memberof QueryBuilder\n */\n this.trigger('afterDeleteGroup');\n\n this.trigger('rulesChanged');\n }\n\n return del;\n};\n\n/**\n * Performs actions when a group's condition changes\n * @param {Group} group\n * @param {object} previousCondition\n * @fires QueryBuilder.afterUpdateGroupCondition\n * @private\n */\nQueryBuilder.prototype.updateGroupCondition = function(group, previousCondition) {\n group.$el.find('>' + QueryBuilder.selectors.group_condition).each(function() {\n var $this = $(this);\n $this.prop('checked', $this.val() === group.condition);\n $this.parent().toggleClass('active', $this.val() === group.condition);\n });\n\n /**\n * After the group condition has been modified\n * @event afterUpdateGroupCondition\n * @memberof QueryBuilder\n * @param {Group} group\n * @param {object} previousCondition\n */\n this.trigger('afterUpdateGroupCondition', group, previousCondition);\n\n this.trigger('rulesChanged');\n};\n\n/**\n * Updates the visibility of conditions based on number of rules inside each group\n * @private\n */\nQueryBuilder.prototype.refreshGroupsConditions = function() {\n (function walk(group) {\n if (!group.flags || (group.flags && !group.flags.condition_readonly)) {\n group.$el.find('>' + QueryBuilder.selectors.group_condition).prop('disabled', group.rules.length <= 1)\n .parent().toggleClass('disabled', group.rules.length <= 1);\n }\n\n group.each(null, function(group) {\n walk(group);\n }, this);\n }(this.model.root));\n};\n\n/**\n * Adds a new rule\n * @param {Group} parent\n * @param {object} [data] - rule custom data\n * @param {object} [flags] - flags to apply to the rule\n * @returns {Rule}\n * @fires QueryBuilder.beforeAddRule\n * @fires QueryBuilder.afterAddRule\n * @fires QueryBuilder.changer:getDefaultFilter\n */\nQueryBuilder.prototype.addRule = function(parent, data, flags) {\n /**\n * Just before adding a rule, can be prevented\n * @event beforeAddRule\n * @memberof QueryBuilder\n * @param {Group} parent\n */\n var e = this.trigger('beforeAddRule', parent);\n if (e.isDefaultPrevented()) {\n return null;\n }\n\n var rule_id = this.nextRuleId();\n var $rule = $($.parseHTML(this.getRuleTemplate(rule_id)));\n var model = parent.addRule($rule);\n\n model.data = data;\n model.flags = $.extend({}, this.settings.default_rule_flags, flags);\n\n /**\n * Just after adding a rule\n * @event afterAddRule\n * @memberof QueryBuilder\n * @param {Rule} rule\n */\n this.trigger('afterAddRule', model);\n\n model.$el.find(\"[data-bs-toggle=tooltip]\").tooltip({\n //*** container: this.$el[0],\n trigger: \"hover\",\n placement: \"bottom\"\n });\n\n this.trigger('rulesChanged');\n\n this.createRuleFilters(model);\n\n if (this.settings.default_filter || !this.settings.display_empty_filter) {\n /**\n * Modifies the default filter for a rule\n * @event changer:getDefaultFilter\n * @memberof QueryBuilder\n * @param {QueryBuilder.Filter} filter\n * @param {Rule} rule\n * @returns {QueryBuilder.Filter}\n */\n model.filter = this.change('getDefaultFilter',\n this.getFilterById(this.settings.default_filter || this.filters[0].id),\n model\n );\n }\n\n return model;\n};\n\n/**\n * Tries to delete a rule\n * @param {Rule} rule\n * @returns {boolean} if the rule has been deleted\n * @fires QueryBuilder.beforeDeleteRule\n * @fires QueryBuilder.afterDeleteRule\n */\nQueryBuilder.prototype.deleteRule = function(rule) {\n if (rule.flags.no_delete) {\n return false;\n }\n\n /**\n * Just before deleting a rule, can be prevented\n * @event beforeDeleteRule\n * @memberof QueryBuilder\n * @param {Rule} rule\n */\n var e = this.trigger('beforeDeleteRule', rule);\n if (e.isDefaultPrevented()) {\n return false;\n }\n\n rule.drop();\n\n /**\n * Just after deleting a rule\n * @event afterDeleteRule\n * @memberof QueryBuilder\n */\n this.trigger('afterDeleteRule');\n\n this.trigger('rulesChanged');\n\n return true;\n};\n\n/**\n * Creates the filters for a rule\n * @param {Rule} rule\n * @fires QueryBuilder.changer:getRuleFilters\n * @fires QueryBuilder.afterCreateRuleFilters\n * @private\n */\nQueryBuilder.prototype.createRuleFilters = function(rule) {\n /**\n * Modifies the list a filters available for a rule\n * @event changer:getRuleFilters\n * @memberof QueryBuilder\n * @param {QueryBuilder.Filter[]} filters\n * @param {Rule} rule\n * @returns {QueryBuilder.Filter[]}\n */\n var filters = this.change('getRuleFilters', this.filters, rule);\n var $filterSelect = $($.parseHTML(this.getRuleFilterSelect(rule, filters)));\n\n rule.$el.find(QueryBuilder.selectors.filter_container).html($filterSelect);\n\n /**\n * After creating the dropdown for filters\n * @event afterCreateRuleFilters\n * @memberof QueryBuilder\n * @param {Rule} rule\n */\n this.trigger('afterCreateRuleFilters', rule);\n\n this.applyRuleFlags(rule);\n};\n\n/**\n * Creates the operators for a rule and init the rule operator\n * @param {Rule} rule\n * @fires QueryBuilder.afterCreateRuleOperators\n * @private\n */\nQueryBuilder.prototype.createRuleOperators = function(rule) {\n var $operatorContainer = rule.$el.find(QueryBuilder.selectors.operator_container).empty();\n\n if (!rule.filter) {\n return;\n }\n\n var operators = this.getOperators(rule.filter);\n var $operatorSelect = $($.parseHTML(this.getRuleOperatorSelect(rule, operators)));\n\n $operatorContainer.html($operatorSelect);\n\n // set the operator without triggering update event\n if (rule.filter.default_operator) {\n rule.__.operator = this.getOperatorByType(rule.filter.default_operator);\n }\n else {\n rule.__.operator = operators[0];\n }\n\n rule.$el.find(QueryBuilder.selectors.rule_operator).val(rule.operator.type);\n\n /**\n * After creating the dropdown for operators\n * @event afterCreateRuleOperators\n * @memberof QueryBuilder\n * @param {Rule} rule\n * @param {QueryBuilder.Operator[]} operators - allowed operators for this rule\n */\n this.trigger('afterCreateRuleOperators', rule, operators);\n\n this.applyRuleFlags(rule);\n};\n\n/**\n * Creates the main input for a rule\n * @param {Rule} rule\n * @fires QueryBuilder.afterCreateRuleInput\n * @private\n */\nQueryBuilder.prototype.createRuleInput = function(rule) {\n var $valueContainer = rule.$el.find(QueryBuilder.selectors.value_container).empty();\n\n rule.__.value = undefined;\n\n if (!rule.filter || !rule.operator || rule.operator.nb_inputs === 0) {\n return;\n }\n\n var self = this;\n var $inputs = $();\n var filter = rule.filter;\n\n for (var i = 0; i < rule.operator.nb_inputs; i++) {\n var $ruleInput = $($.parseHTML(this.getRuleInput(rule, i).trim(), document, true)); // Keep scripts //***\n if (i > 0) $valueContainer.append(this.settings.inputs_separator);\n $valueContainer.append($ruleInput);\n $inputs = $inputs.add($ruleInput);\n }\n\n $valueContainer.css('display', '');\n\n $inputs.on('change ' + (filter.input_event || ''), function() {\n if (!rule._updating_input) {\n rule._updating_value = true;\n rule.value = self.getRuleInputValue(rule);\n rule._updating_value = false;\n }\n });\n\n if (filter.plugin) {\n $inputs[filter.plugin](filter.plugin_config || {});\n }\n\n /**\n * After creating the input for a rule and initializing optional plugin\n * @event afterCreateRuleInput\n * @memberof QueryBuilder\n * @param {Rule} rule\n */\n this.trigger('afterCreateRuleInput', rule);\n\n if (filter.default_value !== undefined) {\n rule.value = filter.default_value;\n }\n else {\n rule._updating_value = true;\n rule.value = self.getRuleInputValue(rule);\n rule._updating_value = false;\n }\n\n this.applyRuleFlags(rule);\n};\n\n/**\n * Performs action when a rule's filter changes\n * @param {Rule} rule\n * @param {object} previousFilter\n * @fires QueryBuilder.afterUpdateRuleFilter\n * @private\n */\nQueryBuilder.prototype.updateRuleFilter = function(rule, previousFilter) {\n this.createRuleOperators(rule);\n this.createRuleInput(rule);\n\n rule.$el.find(QueryBuilder.selectors.rule_filter).val(rule.filter ? rule.filter.id : '-1');\n\n // clear rule data if the filter changed\n if (previousFilter && rule.filter && previousFilter.id !== rule.filter.id) {\n rule.data = undefined;\n }\n\n /**\n * After the filter has been updated and the operators and input re-created\n * @event afterUpdateRuleFilter\n * @memberof QueryBuilder\n * @param {Rule} rule\n * @param {object} previousFilter\n */\n this.trigger('afterUpdateRuleFilter', rule, previousFilter);\n\n this.trigger('rulesChanged');\n};\n\n/**\n * Performs actions when a rule's operator changes\n * @param {Rule} rule\n * @param {object} previousOperator\n * @fires QueryBuilder.afterUpdateRuleOperator\n * @private\n */\nQueryBuilder.prototype.updateRuleOperator = function(rule, previousOperator) {\n var $valueContainer = rule.$el.find(QueryBuilder.selectors.value_container);\n\n if (!rule.operator || rule.operator.nb_inputs === 0) {\n $valueContainer.hide();\n\n rule.__.value = undefined;\n }\n else {\n $valueContainer.css('display', '');\n\n if ($valueContainer.is(':empty') || !previousOperator ||\n rule.operator.nb_inputs !== previousOperator.nb_inputs ||\n rule.operator.optgroup !== previousOperator.optgroup\n ) {\n this.createRuleInput(rule);\n }\n }\n\n if (rule.operator) {\n rule.$el.find(QueryBuilder.selectors.rule_operator).val(rule.operator.type);\n\n // refresh value if the format changed for this operator\n rule.__.value = this.getRuleInputValue(rule);\n }\n\n /**\n * After the operator has been updated and the input optionally re-created\n * @event afterUpdateRuleOperator\n * @memberof QueryBuilder\n * @param {Rule} rule\n * @param {object} previousOperator\n */\n this.trigger('afterUpdateRuleOperator', rule, previousOperator);\n\n this.trigger('rulesChanged');\n};\n\n/**\n * Performs actions when rule's value changes\n * @param {Rule} rule\n * @param {object} previousValue\n * @fires QueryBuilder.afterUpdateRuleValue\n * @private\n */\nQueryBuilder.prototype.updateRuleValue = function(rule, previousValue) {\n if (!rule._updating_value) {\n this.setRuleInputValue(rule, rule.value);\n }\n\n /**\n * After the rule value has been modified\n * @event afterUpdateRuleValue\n * @memberof QueryBuilder\n * @param {Rule} rule\n * @param {*} previousValue\n */\n this.trigger('afterUpdateRuleValue', rule, previousValue);\n\n this.trigger('rulesChanged');\n};\n\n/**\n * Changes a rule's properties depending on its flags\n * @param {Rule} rule\n * @fires QueryBuilder.afterApplyRuleFlags\n * @private\n */\nQueryBuilder.prototype.applyRuleFlags = function(rule) {\n var flags = rule.flags;\n var Selectors = QueryBuilder.selectors;\n\n rule.$el.find(Selectors.rule_filter).prop('disabled', flags.filter_readonly);\n rule.$el.find(Selectors.rule_operator).prop('disabled', flags.operator_readonly);\n rule.$el.find(Selectors.rule_value).prop('disabled', flags.value_readonly);\n\n if (flags.no_delete) {\n rule.$el.find(Selectors.delete_rule).remove();\n }\n\n /**\n * After rule's flags has been applied\n * @event afterApplyRuleFlags\n * @memberof QueryBuilder\n * @param {Rule} rule\n */\n this.trigger('afterApplyRuleFlags', rule);\n};\n\n/**\n * Changes group's properties depending on its flags\n * @param {Group} group\n * @fires QueryBuilder.afterApplyGroupFlags\n * @private\n */\nQueryBuilder.prototype.applyGroupFlags = function(group) {\n var flags = group.flags;\n var Selectors = QueryBuilder.selectors;\n\n group.$el.find('>' + Selectors.group_condition).prop('disabled', flags.condition_readonly)\n .parent().toggleClass('readonly', flags.condition_readonly);\n\n if (flags.no_add_rule) {\n group.$el.find(Selectors.add_rule).remove();\n }\n if (flags.no_add_group) {\n group.$el.find(Selectors.add_group).remove();\n }\n if (flags.no_delete) {\n group.$el.find(Selectors.delete_group).remove();\n }\n\n /**\n * After group's flags has been applied\n * @event afterApplyGroupFlags\n * @memberof QueryBuilder\n * @param {Group} group\n */\n this.trigger('afterApplyGroupFlags', group);\n};\n\n/**\n * Clears all errors markers\n * @param {Node} [node] default is root Group\n */\nQueryBuilder.prototype.clearErrors = function(node) {\n node = node || this.model.root;\n\n if (!node) {\n return;\n }\n\n node.error = null;\n\n if (node instanceof Group) {\n node.each(function(rule) {\n rule.error = null;\n }, function(group) {\n this.clearErrors(group);\n }, this);\n }\n};\n\n/**\n * Adds/Removes error on a Rule or Group\n * @param {Node} node\n * @fires QueryBuilder.changer:displayError\n * @private\n */\nQueryBuilder.prototype.updateError = function(node) {\n if (this.settings.display_errors) {\n if (node.error === null) {\n node.$el.removeClass('has-error');\n }\n else {\n var errorMessage = this.translate('errors', node.error[0]);\n errorMessage = Utils.fmt(errorMessage, node.error.slice(1));\n\n /**\n * Modifies an error message before display\n * @event changer:displayError\n * @memberof QueryBuilder\n * @param {string} errorMessage - the error message (translated and formatted)\n * @param {array} error - the raw error array (error code and optional arguments)\n * @param {Node} node\n * @returns {string}\n */\n errorMessage = this.change('displayError', errorMessage, node.error, node);\n\n if (errorMessage)\n node.$el.addClass('has-error').find(QueryBuilder.selectors.error_container).eq(0).html(errorMessage); //***\n }\n }\n};\n\n/**\n * Triggers a validation error event\n * @param {Node} node\n * @param {string|array} error\n * @param {*} value\n * @fires QueryBuilder.validationError\n * @private\n */\nQueryBuilder.prototype.triggerValidationError = function(node, error, value) {\n if (!Array.isArray(error)) {\n error = [error];\n }\n\n /**\n * Fired when a validation error occurred, can be prevented\n * @event validationError\n * @memberof QueryBuilder\n * @param {Node} node\n * @param {string} error\n * @param {*} value\n */\n var e = this.trigger('validationError', node, error, value);\n if (!e.isDefaultPrevented()) {\n node.error = error;\n }\n};\n\n\n/**\n * Destroys the builder\n * @fires QueryBuilder.beforeDestroy\n */\nQueryBuilder.prototype.destroy = function() {\n /**\n * Before the {@link QueryBuilder#destroy} method\n * @event beforeDestroy\n * @memberof QueryBuilder\n */\n this.trigger('beforeDestroy');\n\n if (this.status.generated_id) {\n this.$el.removeAttr('id');\n }\n\n this.clear();\n this.model = null;\n\n this.$el\n .off('.queryBuilder')\n .removeClass('query-builder')\n .removeData('queryBuilder');\n\n delete this.$el[0].queryBuilder;\n};\n\n/**\n * Clear all rules and resets the root group\n * @fires QueryBuilder.beforeReset\n * @fires QueryBuilder.afterReset\n */\nQueryBuilder.prototype.reset = function() {\n /**\n * Before the {@link QueryBuilder#reset} method, can be prevented\n * @event beforeReset\n * @memberof QueryBuilder\n */\n var e = this.trigger('beforeReset');\n if (e.isDefaultPrevented()) {\n return;\n }\n\n this.status.group_id = 1;\n this.status.rule_id = 0;\n\n this.model.root.empty();\n\n this.model.root.data = undefined;\n this.model.root.flags = $.extend({}, this.settings.default_group_flags);\n this.model.root.condition = this.settings.default_condition;\n\n this.addRule(this.model.root);\n\n /**\n * After the {@link QueryBuilder#reset} method\n * @event afterReset\n * @memberof QueryBuilder\n */\n this.trigger('afterReset');\n\n this.trigger('rulesChanged');\n};\n\n/**\n * Clears all rules and removes the root group\n * @fires QueryBuilder.beforeClear\n * @fires QueryBuilder.afterClear\n */\nQueryBuilder.prototype.clear = function() {\n /**\n * Before the {@link QueryBuilder#clear} method, can be prevented\n * @event beforeClear\n * @memberof QueryBuilder\n */\n var e = this.trigger('beforeClear');\n if (e.isDefaultPrevented()) {\n return;\n }\n\n this.status.group_id = 0;\n this.status.rule_id = 0;\n\n if (this.model.root) {\n this.model.root.drop();\n this.model.root = null;\n }\n\n /**\n * After the {@link QueryBuilder#clear} method\n * @event afterClear\n * @memberof QueryBuilder\n */\n this.trigger('afterClear');\n\n this.trigger('rulesChanged');\n};\n\n/**\n * Modifies the builder configuration.<br>\n * Only options defined in QueryBuilder.modifiable_options are modifiable\n * @param {object} options\n */\nQueryBuilder.prototype.setOptions = function(options) {\n $.each(options, function(opt, value) {\n if (QueryBuilder.modifiable_options.indexOf(opt) !== -1) {\n this.settings[opt] = value;\n }\n }.bind(this));\n};\n\n/**\n * Returns the model associated to a DOM object, or the root model\n * @param {jQuery} [target]\n * @returns {Node}\n */\nQueryBuilder.prototype.getModel = function(target) {\n if (!target) {\n return this.model.root;\n }\n else if (target instanceof Node) {\n return target;\n }\n else {\n return $(target).data('queryBuilderModel');\n }\n};\n\n/**\n * Validates the whole builder\n * @param {object} [options]\n * @param {boolean} [options.skip_empty=false] - skips validating rules that have no filter selected\n * @returns {boolean}\n * @fires QueryBuilder.changer:validate\n */\nQueryBuilder.prototype.validate = function(options) {\n options = $.extend({\n skip_empty: false\n }, options);\n\n this.clearErrors();\n\n var self = this;\n\n var valid = (function parse(group) {\n var done = 0;\n var errors = 0;\n\n group.each(function(rule) {\n if (!rule.filter && options.skip_empty) {\n return;\n }\n\n if (!rule.filter) {\n self.triggerValidationError(rule, 'no_filter', null);\n errors++;\n return;\n }\n\n if (!rule.operator) {\n self.triggerValidationError(rule, 'no_operator', null);\n errors++;\n return;\n }\n\n if (rule.operator.nb_inputs !== 0) {\n var valid = self.validateValue(rule, rule.value);\n\n if (valid !== true) {\n self.triggerValidationError(rule, valid, rule.value);\n errors++;\n return;\n }\n }\n\n done++;\n\n }, function(group) {\n var res = parse(group);\n if (res === true) {\n done++;\n }\n else if (res === false) {\n errors++;\n }\n });\n\n if (errors > 0) {\n return false;\n }\n else if (done === 0 && !group.isRoot() && options.skip_empty) {\n return null;\n }\n else if (done === 0 && (!self.settings.allow_empty || !group.isRoot())) {\n self.triggerValidationError(group, 'empty_group', null);\n return false;\n }\n\n return true;\n\n }(this.model.root));\n\n /**\n * Modifies the result of the {@link QueryBuilder#validate} method\n * @event changer:validate\n * @memberof QueryBuilder\n * @param {boolean} valid\n * @returns {boolean}\n */\n return this.change('validate', valid);\n};\n\n/**\n * Gets an object representing current rules\n * @param {object} [options]\n * @param {boolean|string} [options.get_flags=false] - export flags, true: only changes from default flags or 'all'\n * @param {boolean} [options.allow_invalid=false] - returns rules even if they are invalid\n * @param {boolean} [options.skip_empty=false] - remove rules that have no filter selected\n * @returns {object}\n * @fires QueryBuilder.changer:ruleToJson\n * @fires QueryBuilder.changer:groupToJson\n * @fires QueryBuilder.changer:getRules\n */\nQueryBuilder.prototype.getRules = function(options) {\n options = $.extend({\n get_flags: false,\n allow_invalid: false,\n skip_empty: false\n }, options);\n\n var valid = this.validate(options);\n if (!valid && !options.allow_invalid) {\n return null;\n }\n\n var self = this;\n\n var out = (function parse(group) {\n var groupData = {\n condition: group.condition,\n rules: []\n };\n\n if (group.data) {\n groupData.data = $.extendext(true, 'replace', {}, group.data);\n }\n\n if (options.get_flags) {\n var flags = self.getGroupFlags(group.flags, options.get_flags === 'all');\n if (!$.isEmptyObject(flags)) {\n groupData.flags = flags;\n }\n }\n\n group.each(function(rule) {\n if ((!rule.filter || rule.value === undefined) && options.skip_empty) { //***\n return;\n }\n\n var value = null;\n if (!rule.operator || rule.operator.nb_inputs !== 0) {\n value = rule.value;\n }\n\n var ruleData = {\n id: rule.filter ? rule.filter.id : null,\n field: rule.filter ? rule.filter.field : null,\n type: rule.filter ? rule.filter.type : null,\n input: rule.filter ? rule.filter.input : null,\n operator: rule.operator ? rule.operator.type : null,\n value: value\n };\n\n if (rule.filter && rule.filter.data || rule.data) {\n ruleData.data = $.extendext(true, 'replace', {}, rule.filter ? rule.filter.data : {}, rule.data);\n }\n\n if (options.get_flags) {\n var flags = self.getRuleFlags(rule.flags, options.get_flags === 'all');\n if (!$.isEmptyObject(flags)) {\n ruleData.flags = flags;\n }\n }\n\n /**\n * Modifies the JSON generated from a Rule object\n * @event changer:ruleToJson\n * @memberof QueryBuilder\n * @param {object} json\n * @param {Rule} rule\n * @returns {object}\n */\n groupData.rules.push(self.change('ruleToJson', ruleData, rule));\n\n }, function(model) {\n var data = parse(model);\n if (data.rules.length !== 0 || !options.skip_empty) {\n groupData.rules.push(data);\n }\n }, this);\n\n /**\n * Modifies the JSON generated from a Group object\n * @event changer:groupToJson\n * @memberof QueryBuilder\n * @param {object} json\n * @param {Group} group\n * @returns {object}\n */\n return self.change('groupToJson', groupData, group);\n\n }(this.model.root));\n\n out.valid = valid;\n\n /**\n * Modifies the result of the {@link QueryBuilder#getRules} method\n * @event changer:getRules\n * @memberof QueryBuilder\n * @param {object} json\n * @returns {object}\n */\n return this.change('getRules', out);\n};\n\n/**\n * Sets rules from object\n * @param {object} data\n * @param {object} [options]\n * @param {boolean} [options.allow_invalid=false] - silent-fail if the data are invalid\n * @throws RulesError, UndefinedConditionError\n * @fires QueryBuilder.changer:setRules\n * @fires QueryBuilder.changer:jsonToRule\n * @fires QueryBuilder.changer:jsonToGroup\n * @fires QueryBuilder.afterSetRules\n */\nQueryBuilder.prototype.setRules = function(data, options) {\n options = $.extend({\n allow_invalid: false\n }, options);\n\n if (Array.isArray(data)) {\n data = {\n condition: this.settings.default_condition,\n rules: data\n };\n }\n\n if (!data || !data.rules || (data.rules.length === 0 && !this.settings.allow_empty)) {\n Utils.error('RulesParse', 'Incorrect data object passed');\n }\n\n this.clear();\n this.setRoot(false, data.data, this.parseGroupFlags(data));\n\n /**\n * Modifies data before the {@link QueryBuilder#setRules} method\n * @event changer:setRules\n * @memberof QueryBuilder\n * @param {object} json\n * @param {object} options\n * @returns {object}\n */\n data = this.change('setRules', data, options);\n\n var self = this;\n\n (function add(data, group) {\n if (group === null) {\n return;\n }\n\n if (data.condition === undefined) {\n data.condition = self.settings.default_condition;\n }\n else if (self.settings.conditions.indexOf(data.condition) == -1) {\n Utils.error(!options.allow_invalid, 'UndefinedCondition', 'Invalid condition \"{0}\"', data.condition);\n data.condition = self.settings.default_condition;\n }\n\n group.condition = data.condition;\n\n data.rules.forEach(function(item) {\n var model;\n\n if (item.rules !== undefined) {\n if (self.settings.allow_groups !== -1 && self.settings.allow_groups < group.level) {\n Utils.error(!options.allow_invalid, 'RulesParse', 'No more than {0} groups are allowed', self.settings.allow_groups);\n self.reset();\n }\n else {\n model = self.addGroup(group, false, item.data, self.parseGroupFlags(item));\n if (model === null) {\n return;\n }\n\n add(item, model);\n }\n }\n else {\n if (!item.empty) {\n if (item.id === undefined) {\n Utils.error(!options.allow_invalid, 'RulesParse', 'Missing rule field id');\n item.empty = true;\n }\n if (item.operator === undefined) {\n item.operator = 'equal';\n }\n }\n\n model = self.addRule(group, item.data, self.parseRuleFlags(item));\n if (model === null) {\n return;\n }\n\n if (!item.empty) {\n model.filter = self.getFilterById(item.id, !options.allow_invalid);\n }\n\n if (model.filter) {\n model.operator = self.getOperatorByType(item.operator, !options.allow_invalid);\n\n if (!model.operator) {\n model.operator = self.getOperators(model.filter)[0];\n }\n }\n\n if (model.operator && model.operator.nb_inputs !== 0) {\n if (item.value !== undefined) {\n model.value = item.value;\n }\n else if (model.filter.default_value !== undefined) {\n model.value = model.filter.default_value;\n }\n }\n\n /**\n * Modifies the Rule object generated from the JSON\n * @event changer:jsonToRule\n * @memberof QueryBuilder\n * @param {Rule} rule\n * @param {object} json\n * @returns {Rule} the same rule\n */\n if (self.change('jsonToRule', model, item) != model) {\n Utils.error('RulesParse', 'Plugin tried to change rule reference');\n }\n }\n });\n\n /**\n * Modifies the Group object generated from the JSON\n * @event changer:jsonToGroup\n * @memberof QueryBuilder\n * @param {Group} group\n * @param {object} json\n * @returns {Group} the same group\n */\n if (self.change('jsonToGroup', group, data) != group) {\n Utils.error('RulesParse', 'Plugin tried to change group reference');\n }\n\n }(data, this.model.root));\n\n /**\n * After the {@link QueryBuilder#setRules} method\n * @event afterSetRules\n * @memberof QueryBuilder\n */\n this.trigger('afterSetRules');\n};\n\n\n/**\n * Performs value validation\n * @param {Rule} rule\n * @param {string|string[]} value\n * @returns {array|boolean} true or error array\n * @fires QueryBuilder.changer:validateValue\n */\nQueryBuilder.prototype.validateValue = function(rule, value) {\n var validation = rule.filter.validation || {};\n var result = true;\n\n if (validation.callback) {\n result = validation.callback.call(this, value, rule);\n }\n else {\n result = this._validateValue(rule, value);\n }\n\n /**\n * Modifies the result of the rule validation method\n * @event changer:validateValue\n * @memberof QueryBuilder\n * @param {array|boolean} result - true or an error array\n * @param {*} value\n * @param {Rule} rule\n * @returns {array|boolean}\n */\n return this.change('validateValue', result, value, rule);\n};\n\n/**\n * Default validation function\n * @param {Rule} rule\n * @param {string|string[]} value\n * @returns {array|boolean} true or error array\n * @throws ConfigError\n * @private\n */\nQueryBuilder.prototype._validateValue = function(rule, value) {\n var filter = rule.filter;\n var operator = rule.operator;\n var validation = filter.validation || {};\n var result = true;\n var tmp, tempValue;\n\n if (rule.operator.nb_inputs === 1) {\n value = [value];\n }\n\n for (var i = 0; i < operator.nb_inputs; i++) {\n if (!operator.multiple && Array.isArray(value[i]) && value[i].length > 1) {\n result = ['operator_not_multiple', operator.type, this.translate('operators', operator.type)];\n break;\n }\n\n switch (filter.input) {\n case 'radio':\n if (value[i] === undefined || value[i].length === 0) {\n if (!validation.allow_empty_value) {\n result = ['radio_empty'];\n }\n break;\n }\n break;\n\n case 'checkbox':\n if (value[i] === undefined || value[i].length === 0) {\n if (!validation.allow_empty_value) {\n result = ['checkbox_empty'];\n }\n break;\n }\n break;\n\n case 'select':\n if (value[i] === undefined || value[i].length === 0 || (filter.placeholder && value[i] == filter.placeholder_value)) {\n if (!validation.allow_empty_value) {\n result = ['select_empty'];\n }\n break;\n }\n break;\n\n default:\n tempValue = Array.isArray(value[i]) ? value[i] : [value[i]];\n\n for (var j = 0; j < tempValue.length; j++) {\n switch (QueryBuilder.types[filter.type]) {\n case 'string':\n if (tempValue[j] === undefined || tempValue[j].length === 0) {\n if (!validation.allow_empty_value) {\n result = ['string_empty'];\n }\n break;\n }\n if (validation.min !== undefined) {\n if (tempValue[j].length < parseInt(validation.min)) {\n result = [this.getValidationMessage(validation, 'min', 'string_exceed_min_length'), validation.min];\n break;\n }\n }\n if (validation.max !== undefined) {\n if (tempValue[j].length > parseInt(validation.max)) {\n result = [this.getValidationMessage(validation, 'max', 'string_exceed_max_length'), validation.max];\n break;\n }\n }\n if (validation.format) {\n if (typeof validation.format == 'string') {\n validation.format = new RegExp(validation.format);\n }\n if (!validation.format.test(tempValue[j])) {\n result = [this.getValidationMessage(validation, 'format', 'string_invalid_format'), validation.format];\n break;\n }\n }\n break;\n\n case 'number':\n if (tempValue[j] === undefined || tempValue[j].length === 0) {\n if (!validation.allow_empty_value) {\n result = ['number_nan'];\n }\n break;\n }\n if (isNaN(tempValue[j])) {\n result = ['number_nan'];\n break;\n }\n if (filter.type == 'integer') {\n if (parseInt(tempValue[j]) != tempValue[j]) {\n result = ['number_not_integer'];\n break;\n }\n }\n else {\n if (parseFloat(tempValue[j]) != tempValue[j]) {\n result = ['number_not_double'];\n break;\n }\n }\n if (validation.min !== undefined) {\n if (tempValue[j] < parseFloat(validation.min)) {\n result = [this.getValidationMessage(validation, 'min', 'number_exceed_min'), validation.min];\n break;\n }\n }\n if (validation.max !== undefined) {\n if (tempValue[j] > parseFloat(validation.max)) {\n result = [this.getValidationMessage(validation, 'max', 'number_exceed_max'), validation.max];\n break;\n }\n }\n if (validation.step !== undefined && validation.step !== 'any') {\n var v = (tempValue[j] / validation.step).toPrecision(14);\n if (parseInt(v) != v) {\n result = [this.getValidationMessage(validation, 'step', 'number_wrong_step'), validation.step];\n break;\n }\n }\n break;\n\n case 'datetime':\n if (tempValue[j] === undefined || tempValue[j].length === 0) {\n if (!validation.allow_empty_value) {\n result = ['datetime_empty'];\n }\n break;\n }\n\n // we need Luxon //***\n if (validation.format) {\n if (!('luxon' in window)) {\n Utils.error('MissingLibrary', 'Luxon is required for Date/Time validation.'); //***\n }\n\n var datetime = DateTime.fromFormat(tempValue[j], validation.format, validation.options); //***\n if (!datetime.isValid()) {\n result = [this.getValidationMessage(validation, 'format', 'datetime_invalid'), validation.format];\n break;\n }\n else {\n if (validation.min) {\n if (datetime < DateTime.fromFormat(validation.min, validation.format, validation.options)) { //***\n result = [this.getValidationMessage(validation, 'min', 'datetime_exceed_min'), validation.min];\n break;\n }\n }\n if (validation.max) {\n if (datetime > DateTime.fromFormat(validation.max, validation.format, validation.options)) { //***\n result = [this.getValidationMessage(validation, 'max', 'datetime_exceed_max'), validation.max];\n break;\n }\n }\n }\n }\n break;\n\n case 'boolean':\n if (tempValue[j] === undefined || tempValue[j].length === 0) {\n if (!validation.allow_empty_value) {\n result = ['boolean_not_valid'];\n }\n break;\n }\n tmp = ('' + tempValue[j]).trim().toLowerCase();\n if (tmp !== 'true' && tmp !== 'false' &&\n tmp !== 't' && tmp !== 'f' && tmp !== 'y' && tmp !== 'n' && //***\n tmp !== '1' && tmp !== '0' && tempValue[j] !== 1 && tempValue[j] !== 0) {\n result = ['boolean_not_valid'];\n break;\n }\n }\n\n if (result !== true) {\n break;\n }\n }\n }\n\n if (result !== true) {\n break;\n }\n }\n\n if ((rule.operator.type === 'between' || rule.operator.type === 'not_between') && value.length === 2) {\n switch (QueryBuilder.types[filter.type]) {\n case 'number':\n if (value[0] > value[1]) {\n result = ['number_between_invalid', value[0], value[1]];\n }\n break;\n\n case 'datetime':\n // we need Luxon //***\n if (validation.format) {\n if (!('luxon' in window)) {\n Utils.error('MissingLibrary', 'Luxon is required for Date/Time validation.'); //***\n }\n\n if (DateTime.fromFormat(value[0], validation.format, validation.options) > DateTime.fromFormat(value[1], validation.format, validation.options)) { //***\n result = ['datetime_between_invalid', value[0], value[1]];\n }\n }\n break;\n }\n }\n\n return result;\n};\n\n/**\n * Returns an incremented group ID\n * @returns {string}\n * @private\n */\nQueryBuilder.prototype.nextGroupId = function() {\n return this.status.id + '_group_' + (this.status.group_id++);\n};\n\n/**\n * Returns an incremented rule ID\n * @returns {string}\n * @private\n */\nQueryBuilder.prototype.nextRuleId = function() {\n return this.status.id + '_rule_' + (this.status.rule_id++);\n};\n\n/**\n * Returns the operators for a filter\n * @param {string|object} filter - filter id or filter object\n * @returns {object[]}\n * @fires QueryBuilder.changer:getOperators\n */\nQueryBuilder.prototype.getOperators = function(filter) {\n if (typeof filter == 'string') {\n filter = this.getFilterById(filter);\n }\n\n var result = [];\n\n for (var i = 0, l = this.operators.length; i < l; i++) {\n // filter operators check\n if (filter.operators) {\n if (filter.operators.indexOf(this.operators[i].type) == -1) {\n continue;\n }\n }\n // type check\n else if (this.operators[i].apply_to.indexOf(QueryBuilder.types[filter.type]) == -1) {\n continue;\n }\n\n result.push(this.operators[i]);\n }\n\n // keep sort order defined for the filter\n if (filter.operators) {\n result.sort(function(a, b) {\n return filter.operators.indexOf(a.type) - filter.operators.indexOf(b.type);\n });\n }\n\n /**\n * Modifies the operators available for a filter\n * @event changer:getOperators\n * @memberof QueryBuilder\n * @param {QueryBuilder.Operator[]} operators\n * @param {QueryBuilder.Filter} filter\n * @returns {QueryBuilder.Operator[]}\n */\n return this.change('getOperators', result, filter);\n};\n\n/**\n * Returns a particular filter by its id\n * @param {string} id\n * @param {boolean} [doThrow=true]\n * @returns {object|null}\n * @throws UndefinedFilterError\n */\nQueryBuilder.prototype.getFilterById = function(id, doThrow) {\n if (id == '-1') {\n return null;\n }\n\n for (var i = 0, l = this.filters.length; i < l; i++) {\n if (this.filters[i].id == id) {\n return this.filters[i];\n }\n }\n\n Utils.error(doThrow !== false, 'UndefinedFilter', 'Undefined filter \"{0}\"', id);\n\n return null;\n};\n\n/**\n * Returns a particular operator by its type\n * @param {string} type\n * @param {boolean} [doThrow=true]\n * @returns {object|null}\n * @throws UndefinedOperatorError\n */\nQueryBuilder.prototype.getOperatorByType = function(type, doThrow) {\n if (type == '-1') {\n return null;\n }\n\n for (var i = 0, l = this.operators.length; i < l; i++) {\n if (this.operators[i].type == type) {\n return this.operators[i];\n }\n }\n\n Utils.error(doThrow !== false, 'UndefinedOperator', 'Undefined operator \"{0}\"', type);\n\n return null;\n};\n\n/**\n * Returns rule's current input value\n * @param {Rule} rule\n * @returns {*}\n * @fires QueryBuilder.changer:getRuleValue\n * @private\n */\nQueryBuilder.prototype.getRuleInputValue = function(rule) {\n var filter = rule.filter;\n var operator = rule.operator;\n var value = [];\n\n if (filter.valueGetter) {\n value = filter.valueGetter.call(this, rule);\n }\n else {\n var $value = rule.$el.find(QueryBuilder.selectors.value_container);\n\n for (var i = 0; i < operator.nb_inputs; i++) {\n var name = Utils.escapeElementId(rule.id + '_value_' + i);\n var tmp;\n\n switch (filter.input) {\n case 'radio':\n value.push($value.find('[name=' + name + ']:checked').val());\n break;\n\n case 'checkbox':\n tmp = [];\n $value.find('[name=' + name + ']:checked').each(function() {\n tmp.push($(this).val());\n });\n value.push(tmp);\n break;\n\n case 'select':\n if (filter.multiple) {\n tmp = [];\n $value.find('[name=' + name + '] option:selected').each(function() {\n tmp.push($(this).val());\n });\n value.push(tmp);\n }\n else {\n value.push($value.find('[name=' + name + '] option:selected').val());\n }\n break;\n\n default:\n value.push($value.find('[name=' + name + ']').val());\n }\n }\n\n value = value.map(function(val) {\n if (operator.multiple && filter.value_separator && typeof val == 'string') {\n val = val.split(filter.value_separator);\n }\n\n if (Array.isArray(val)) {\n return val.map(function(subval) {\n return Utils.changeType(subval, filter); //***\n });\n }\n else {\n return Utils.changeType(val, filter); //***\n }\n });\n\n if (operator.nb_inputs === 1) {\n value = value[0];\n }\n\n // @deprecated\n // if (filter.valueParser) {\n // value = filter.valueParser.call(this, rule, value);\n // }\n }\n\n /**\n * Modifies the rule's value grabbed from the DOM\n * @event changer:getRuleValue\n * @memberof QueryBuilder\n * @param {*} value\n * @param {Rule} rule\n * @returns {*}\n */\n return this.change('getRuleValue', value, rule);\n};\n\n/**\n * Sets the value of a rule's input\n * @param {Rule} rule\n * @param {*} value\n * @private\n */\nQueryBuilder.prototype.setRuleInputValue = function(rule, value) {\n var filter = rule.filter;\n var operator = rule.operator;\n\n if (!filter || !operator) {\n return;\n }\n\n rule._updating_input = true;\n\n if (filter.valueSetter) {\n filter.valueSetter.call(this, rule, value);\n }\n else {\n var $value = rule.$el.find(QueryBuilder.selectors.value_container);\n\n if (operator.nb_inputs == 1) {\n value = [value];\n }\n\n for (var i = 0; i < operator.nb_inputs; i++) {\n var name = Utils.escapeElementId(rule.id + '_value_' + i);\n\n switch (filter.input) {\n case 'radio':\n $value.find('[name=' + name + '][value=\"' + value[i] + '\"]').prop('checked', true).trigger('change');\n break;\n\n case 'checkbox':\n if (!Array.isArray(value[i])) {\n value[i] = [value[i]];\n }\n value[i].forEach(function(value) {\n $value.find('[name=' + name + '][value=\"' + value + '\"]').prop('checked', true).trigger('change');\n });\n break;\n\n default:\n if (operator.multiple && filter.value_separator && Array.isArray(value[i])) {\n value[i] = value[i].join(filter.value_separator);\n }\n $value.find('[name=' + name + ']').val(value[i]).trigger('change');\n break;\n }\n }\n }\n\n rule._updating_input = false;\n};\n\n/**\n * Parses rule flags\n * @param {object} rule\n * @returns {object}\n * @fires QueryBuilder.changer:parseRuleFlags\n * @private\n */\nQueryBuilder.prototype.parseRuleFlags = function(rule) {\n var flags = $.extend({}, this.settings.default_rule_flags);\n\n if (rule.readonly) {\n $.extend(flags, {\n filter_readonly: true,\n operator_readonly: true,\n value_readonly: true,\n no_delete: true\n });\n }\n\n if (rule.flags) {\n $.extend(flags, rule.flags);\n }\n\n /**\n * Modifies the consolidated rule's flags\n * @event changer:parseRuleFlags\n * @memberof QueryBuilder\n * @param {object} flags\n * @param {object} rule - <b>not</b> a Rule object\n * @returns {object}\n */\n return this.change('parseRuleFlags', flags, rule);\n};\n\n/**\n * Gets a copy of flags of a rule\n * @param {object} flags\n * @param {boolean} [all=false] - return all flags or only changes from default flags\n * @returns {object}\n * @private\n */\nQueryBuilder.prototype.getRuleFlags = function(flags, all) {\n if (all) {\n return $.extend({}, flags);\n }\n else {\n var ret = {};\n $.each(this.settings.default_rule_flags, function(key, value) {\n if (flags[key] !== value) {\n ret[key] = flags[key];\n }\n });\n return ret;\n }\n};\n\n/**\n * Parses group flags\n * @param {object} group\n * @returns {object}\n * @fires QueryBuilder.changer:parseGroupFlags\n * @private\n */\nQueryBuilder.prototype.parseGroupFlags = function(group) {\n var flags = $.extend({}, this.settings.default_group_flags);\n\n if (group.readonly) {\n $.extend(flags, {\n condition_readonly: true,\n no_add_rule: true,\n no_add_group: true,\n no_delete: true\n });\n }\n\n if (group.flags) {\n $.extend(flags, group.flags);\n }\n\n /**\n * Modifies the consolidated group's flags\n * @event changer:parseGroupFlags\n * @memberof QueryBuilder\n * @param {object} flags\n * @param {object} group - <b>not</b> a Group object\n * @returns {object}\n */\n return this.change('parseGroupFlags', flags, group);\n};\n\n/**\n * Gets a copy of flags of a group\n * @param {object} flags\n * @param {boolean} [all=false] - return all flags or only changes from default flags\n * @returns {object}\n * @private\n */\nQueryBuilder.prototype.getGroupFlags = function(flags, all) {\n if (all) {\n return $.extend({}, flags);\n }\n else {\n var ret = {};\n $.each(this.settings.default_group_flags, function(key, value) {\n if (flags[key] !== value) {\n ret[key] = flags[key];\n }\n });\n return ret;\n }\n};\n\n/**\n * Translate a label either by looking in the `lang` object or in itself if it's an object where keys are language codes\n * @param {string} [category]\n * @param {string|object} key\n * @returns {string}\n * @fires QueryBuilder.changer:translate\n */\nQueryBuilder.prototype.translate = function(category, key) {\n if (key === undefined) { //***\n key = category;\n category = undefined;\n }\n\n var translation;\n if (typeof key === 'object') {\n translation = key[this.settings.lang_code] || key['en'];\n }\n else {\n translation = (category ? this.lang[category] : this.lang)[key] || key;\n }\n\n /**\n * Modifies the translated label\n * @event changer:translate\n * @memberof QueryBuilder\n * @param {string} translation\n * @param {string|object} key\n * @param {string} [category]\n * @returns {string}\n */\n return this.change('translate', translation, key, category);\n};\n\n/**\n * Returns a validation message\n * @param {object} validation\n * @param {string} type\n * @param {string} def\n * @returns {string}\n * @private\n */\nQueryBuilder.prototype.getValidationMessage = function(validation, type, def) {\n return validation.messages && validation.messages[type] || def;\n};\n\n\nQueryBuilder.templates.group = ({ group_id, level, conditions, icons, settings, translate, builder }) => {\n return `\n<div id=\"${group_id}\" class=\"rules-group-container\">\n <div class=\"rules-group-header\">\n ${level > 1 ? `\n <button type=\"button\" class=\"btn-close float-end m-2\" aria-label=\"${translate(\"delete_group\")}\" data-delete=\"group\"></button>\n ` : ''}\n <div class=\"btn-group btn-group-sm float-end group-actions\"> \\\n <button type=\"button\" class=\"btn btn-primary\" data-add=\"rule\" data-bs-toggle=\"tooltip\" title=\"${translate(\"add_rule\")}\">\n <i class=\"${icons.add_rule}\"></i>\n </button>\n ${settings.allow_groups === -1 || settings.allow_groups >= level ? `\n <button type=\"button\" class=\"btn btn-primary\" data-add=\"group\" data-bs-toggle=\"tooltip\" title=\"${translate(\"add_group\")}\">\n <i class=\"${icons.add_group}\"></i>\n </button>\n ` : ''}\n </div>\n <div class=\"btn-group btn-group-sm group-conditions bg-white\" role=\"group\">\n ${conditions.map((condition, i) => `\n <input type=\"radio\" class=\"btn-check\" name=\"${group_id}_cond\" id=\"${group_id}_cond_${i + 1}\" value=\"${condition}\"> \\\n <label class=\"btn btn-outline-primary\" for=\"${group_id}_cond_${i + 1}\">${translate(\"conditions\", condition)}</label>\n `).join('\\n')}\n </div>\n ${settings.display_errors ? `\n <div class=\"error-container\"></div>\n ` : ''}\n </div>\n <div class=rules-group-body>\n <div class=rules-list></div>\n </div>\n</div>`;\n};\n\nQueryBuilder.templates.rule = ({ rule_id, icons, settings, translate, builder }) => {\n return `\n<div id=\"${rule_id}\" class=\"rule-container\">\n <div class=\"rule-header mb-1\">\n <div class=\"btn-group btn-group-sm float-end rule-actions\">\n <button type=\"button\" class=\"btn-close m-2\" aria-label=\"${translate(\"delete_rule\")}\" data-delete=\"rule\"></button>\n </div>\n </div>\n <div class=\"rule-filter-container\"></div>\n <div class=\"rule-operator-container\"></div>\n <div class=\"rule-value-container\"></div>\n</div>`;\n};\n\nQueryBuilder.templates.filterSelect = ({ rule, filters, icons, settings, translate, builder }) => {\n let optgroup = null;\n return `\n<select class=\"form-select\" name=\"${rule.id}_filter\">\n ${settings.display_empty_filter ? `\n <option value=\"-1\">${settings.select_placeholder}</option>\n ` : ''}\n ${filters.map(filter => `\n ${optgroup !== filter.optgroup ? `\n ${optgroup !== null ? `</optgroup>` : ''}\n ${(optgroup = filter.optgroup) !== null ? `\n <optgroup label=\"${translate(settings.optgroups[optgroup])}\">\n ` : ''}\n ` : ''}\n <option value=\"${filter.id}\" ${filter.icon ? `data-icon=\"${filter.icon}\"` : ''}>${translate(filter.label)}</option>\n `).join('')}\n ${optgroup !== null ? '</optgroup>' : ''}\n</select>`;\n};\n\nQueryBuilder.templates.operatorSelect = ({ rule, operators, icons, settings, translate, builder }) => {\n let optgroup = null;\n return `\n${operators.length === 1 ? `\n<span class=\"rule-operator\">\n${translate(\"operators\", operators[0].type)}\n</span>\n` : ''}\n${operators.length > 1 ? `\n<select class=\"form-select ${operators.length === 1 ? 'hide' : ''}\" name=\"${rule.id}_operator\">\n ${operators.map(operator => `\n ${optgroup !== operator.optgroup ? `\n ${optgroup !== null ? `</optgroup>` : ''}\n ${(optgroup = operator.optgroup) !== null ? `\n <optgroup label=\"${translate(settings.optgroups[optgroup])}\">\n ` : ''}\n ` : ''}\n <option value=\"${operator.type}\" ${operator.icon ? `data-icon=\"${operator.icon}\"` : ''}>${translate(\"operators\", operator.type)}</option>\n `).join('')}\n ${optgroup !== null ? '</optgroup>' : ''}\n</select>\n` : ''}`;\n};\n\nQueryBuilder.templates.ruleValueSelect = ({ name, rule, icons, settings, translate, builder }) => {\n let optgroup = null;\n return `\n <select class=\"form-select\" name=\"${name}\" ${rule.filter.multiple ? 'multiple' : ''}>\n ${rule.filter.placeholder ? `\n <option value=\"${rule.filter.placeholder_value}\" disabled selected>${rule.filter.placeholder}</option>\n ` : ''}\n ${rule.filter.values.map(entry => `\n ${optgroup !== entry.optgroup ? `\n ${optgroup !== null ? `</optgroup>` : ''}\n ${(optgroup = entry.optgroup) !== null ? `\n <optgroup label=\"${translate(settings.optgroups[optgroup])}\">\n ` : ''}\n ` : ''}\n <option value=\"${entry.value}\">${entry.label}</option>\n `).join('')}\n ${optgroup !== null ? '</optgroup>' : ''}\n </select>`;\n};\n\nQueryBuilder.templates.ruleValueCheck = ({ name, rule, icons, settings, translate, builder }) => rule.filter.values.map((entry, i) => `\n<div class=\"form-check${rule.filter.vertical ? '' : ' form-check-inline'}\">\n <input class=\"form-check-input\" type=\"${rule.filter.type}\" name=\"${name}\" id=\"${name + '_' + i}\" value=\"${entry.value}\">\n <label class=\"form-check-label\" for=\"${name + '_' + i}\">${entry.value}</label>\n</div>\n`).join('');\n\n/**\n * Returns group's HTML\n * @param {string} group_id\n * @param {int} level\n * @returns {string}\n * @fires QueryBuilder.changer:getGroupTemplate\n * @private\n */\nQueryBuilder.prototype.getGroupTemplate = function(group_id, level) {\n var h = this.templates.group({\n builder: this,\n group_id: group_id,\n level: level,\n conditions: this.settings.conditions,\n icons: this.icons,\n settings: this.settings,\n translate: this.translate.bind(this)\n }).trim();\n\n /**\n * Modifies the raw HTML of a group\n * @event changer:getGroupTemplate\n * @memberof QueryBuilder\n * @param {string} html\n * @param {int} level\n * @returns {string}\n */\n return this.change('getGroupTemplate', h, level);\n};\n\n/**\n * Returns rule's HTML\n * @param {string} rule_id\n * @returns {string}\n * @fires QueryBuilder.changer:getRuleTemplate\n * @private\n */\nQueryBuilder.prototype.getRuleTemplate = function(rule_id) {\n var h = this.templates.rule({\n builder: this,\n rule_id: rule_id,\n icons: this.icons,\n settings: this.settings,\n translate: this.translate.bind(this)\n }).trim();\n\n /**\n * Modifies the raw HTML of a rule\n * @event changer:getRuleTemplate\n * @memberof QueryBuilder\n * @param {string} html\n * @returns {string}\n */\n return this.change('getRuleTemplate', h);\n};\n\n/**\n * Returns rule's filter HTML\n * @param {Rule} rule\n * @param {object[]} filters\n * @returns {string}\n * @fires QueryBuilder.changer:getRuleFilterTemplate\n * @private\n */\nQueryBuilder.prototype.getRuleFilterSelect = function(rule, filters) {\n var h = this.templates.filterSelect({\n builder: this,\n rule: rule,\n filters: filters,\n icons: this.icons,\n settings: this.settings,\n translate: this.translate.bind(this)\n }).trim();\n\n /**\n * Modifies the raw HTML of the rule's filter dropdown\n * @event changer:getRuleFilterSelect\n * @memberof QueryBuilder\n * @param {string} html\n * @param {Rule} rule\n * @param {QueryBuilder.Filter[]} filters\n * @returns {string}\n */\n return this.change('getRuleFilterSelect', h, rule, filters);\n};\n\n/**\n * Returns rule's operator HTML\n * @param {Rule} rule\n * @param {object[]} operators\n * @returns {string}\n * @fires QueryBuilder.changer:getRuleOperatorTemplate\n * @private\n */\nQueryBuilder.prototype.getRuleOperatorSelect = function(rule, operators) {\n var h = this.templates.operatorSelect({\n builder: this,\n rule: rule,\n operators: operators,\n icons: this.icons,\n settings: this.settings,\n translate: this.translate.bind(this)\n }).trim();\n\n /**\n * Modifies the raw HTML of the rule's operator dropdown\n * @event changer:getRuleOperatorSelect\n * @memberof QueryBuilder\n * @param {string} html\n * @param {Rule} rule\n * @param {QueryBuilder.Operator[]} operators\n * @returns {string}\n */\n return this.change('getRuleOperatorSelect', h, rule, operators);\n};\n\n/**\n * Returns the rule's value select HTML\n * @param {string} name\n * @param {Rule} rule\n * @returns {string}\n * @fires QueryBuilder.changer:getRuleValueSelect\n * @private\n */\nQueryBuilder.prototype.getRuleValueSelect = function(name, rule) {\n var h = this.templates.ruleValueSelect({\n builder: this,\n name: name,\n rule: rule,\n icons: this.icons,\n settings: this.settings,\n translate: this.translate.bind(this)\n }).trim();\n\n /**\n * Modifies the raw HTML of the rule's value dropdown (in case of a \"select\" filter)\n * @event changer:getRuleValueSelect\n * @memberof QueryBuilder\n * @param {string} html\n * @param [string} name\n * @param {Rule} rule\n * @returns {string}\n */\n return this.change('getRuleValueSelect', h, name, rule);\n};\n\n/**\n * Returns the rule's value check/radio HTML\n * @param {string} name\n * @param {Rule} rule\n * @returns {string}\n * @fires QueryBuilder.changer:getRuleValueCheck\n * @private\n */\n QueryBuilder.prototype.getRuleValueCheck = function(name, rule) { //***\n var h = this.templates.ruleValueCheck({\n builder: this,\n name: name,\n rule: rule,\n icons: this.icons,\n settings: this.settings,\n translate: this.translate.bind(this)\n });\n\n /**\n * Modifies the raw HTML of the rule's value dropdown (in case of a \"checkbox\" or \"radio\" filter)\n * @event changer:getRuleValueCheck\n * @memberof QueryBuilder\n * @param {string} html\n * @param [string} name\n * @param {Rule} rule\n * @returns {string}\n */\n return this.change('getRuleValueCheck', h, name, rule);\n};\n\n/**\n * Returns the rule's value HTML\n * @param {Rule} rule\n * @param {int} value_id\n * @returns {string}\n * @fires QueryBuilder.changer:getRuleInput\n * @private\n */\nQueryBuilder.prototype.getRuleInput = function(rule, value_id) {\n var filter = rule.filter;\n var validation = rule.filter.validation || {};\n var name = rule.id + '_value_' + value_id;\n // var c = filter.vertical ? ' class=block' : '';\n var h = '';\n var placeholder = Array.isArray(filter.placeholder) ? filter.placeholder[value_id] : filter.placeholder;\n\n if (typeof filter.input == 'function') {\n h = filter.input.call(this, rule, name);\n }\n else {\n switch (filter.input) {\n case 'radio':\n case 'checkbox':\n h = this.getRuleValueCheck(name, rule); //***\n break;\n\n case 'select':\n h = this.getRuleValueSelect(name, rule);\n break;\n\n case 'textarea':\n h += '<textarea class=\"form-control\" name=\"' + name + '\"';\n if (filter.size) h += ' cols=\"' + filter.size + '\"';\n if (filter.rows) h += ' rows=\"' + filter.rows + '\"';\n if (validation.min !== undefined) h += ' minlength=\"' + validation.min + '\"';\n if (validation.max !== undefined) h += ' maxlength=\"' + validation.max + '\"';\n if (placeholder) h += ' placeholder=\"' + placeholder + '\"';\n h += '></textarea>';\n break;\n\n case 'number':\n h += '<input class=\"form-control\" type=\"number\" name=\"' + name + '\"';\n if (validation.step !== undefined) h += ' step=\"' + validation.step + '\"';\n if (validation.min !== undefined) h += ' min=\"' + validation.min + '\"';\n if (validation.max !== undefined) h += ' max=\"' + validation.max + '\"';\n if (placeholder) h += ' placeholder=\"' + placeholder + '\"';\n if (filter.size) h += ' size=\"' + filter.size + '\"';\n h += '>';\n break;\n\n default:\n h += '<input class=\"form-control\" type=\"text\" name=\"' + name + '\"';\n if (placeholder) h += ' placeholder=\"' + placeholder + '\"';\n if (filter.type === 'string' && validation.min !== undefined) h += ' minlength=\"' + validation.min + '\"';\n if (filter.type === 'string' && validation.max !== undefined) h += ' maxlength=\"' + validation.max + '\"';\n if (filter.size) h += ' size=\"' + filter.size + '\"';\n h += '>';\n }\n }\n\n /**\n * Modifies the raw HTML of the rule's input\n * @event changer:getRuleInput\n * @memberof QueryBuilder\n * @param {string} html\n * @param {Rule} rule\n * @param {string} name - the name that the input must have\n * @returns {string}\n */\n return this.change('getRuleInput', h, rule, name);\n};\n\n\n/**\n * @namespace\n */\nvar Utils = {};\n\n/**\n * @member {object}\n * @memberof QueryBuilder\n * @see Utils\n */\nQueryBuilder.utils = Utils;\n\n/**\n * @callback Utils#OptionsIteratee\n * @param {string} key\n * @param {string} value\n * @param {string} [optgroup]\n */\n\n/**\n * Iterates over radio/checkbox/selection options, it accept four formats\n *\n * @example\n * // array of values\n * options = ['one', 'two', 'three']\n * @example\n * // simple key-value map\n * options = {1: 'one', 2: 'two', 3: 'three'}\n * @example\n * // array of 1-element maps\n * options = [{1: 'one'}, {2: 'two'}, {3: 'three'}]\n * @example\n * // array of elements\n * options = [{value: 1, label: 'one', optgroup: 'group'}, {value: 2, label: 'two'}]\n *\n * @param {object|array} options\n * @param {Utils#OptionsIteratee} tpl\n */\nUtils.iterateOptions = function(options, tpl) {\n if (options) {\n if (Array.isArray(options)) {\n options.forEach(function(entry, index) { //***\n if ($.isPlainObject(entry)) {\n // array of elements\n if ('value' in entry) {\n tpl(entry.value, entry.label || entry.value, entry.optgroup);\n }\n // array of one-element maps\n else {\n $.each(entry, function(key, val) {\n tpl(key, val);\n return false; // break after first entry\n });\n }\n }\n // array of values\n else {\n tpl(entry, entry, index); //***\n }\n });\n }\n // unordered map\n else {\n $.each(options, function(key, val) {\n tpl(key, val);\n });\n }\n }\n};\n\n/**\n * Replaces {0}, {1}, ... in a string\n * @param {string} str\n * @param {...*} args\n * @returns {string}\n */\nUtils.fmt = function(str, args) {\n if (!Array.isArray(args)) {\n args = Array.prototype.slice.call(arguments, 1);\n }\n\n return str.replace(/{([0-9]+)}/g, function(m, i) {\n return args[parseInt(i)];\n });\n};\n\n/**\n * Throws an Error object with custom name or logs an error\n * @param {boolean} [doThrow=true]\n * @param {string} type\n * @param {string} message\n * @param {...*} args\n */\nUtils.error = function() {\n var i = 0;\n var doThrow = typeof arguments[i] === 'boolean' ? arguments[i++] : true;\n var type = arguments[i++];\n var message = arguments[i++];\n var args = Array.isArray(arguments[i]) ? arguments[i] : Array.prototype.slice.call(arguments, i);\n\n if (doThrow) {\n var err = new Error(Utils.fmt(message, args));\n err.name = type + 'Error';\n err.args = args;\n throw err;\n }\n else {\n console.error(type + 'Error: ' + Utils.fmt(message, args));\n }\n};\n\n/**\n * Changes the type of a value to int, float or bool //***\n * @param {*} value\n * @param {object} filter\n * @param {string} filter.type - 'integer', 'double', 'boolean' or anything else (passthrough)\n * @returns {*}\n */\nUtils.changeType = function(value, filter) {\n if (value === '' || value === undefined) {\n return undefined;\n }\n\n switch (filter.type) {\n // @formatter:off\n case 'integer':\n // if (typeof value === 'string' && !/^-?\\d+$/.test(value)) {\n // return value;\n // }\n // return parseInt(value);\n case 'double':\n // if (typeof value === 'string' && !/^-?\\d+\\.?\\d*$/.test(value)) {\n // return value;\n // }\n // return parseFloat(value);\n return ew.parseNumber(value);\n case 'datetime':\n return ew.parseDateTime(value, filter.data.format).toSQLDate();\n case 'boolean':\n return ew.convertToBool(value);\n default:\n return value;\n // @formatter:on\n }\n};\n\n/**\n * Escapes a string like PHP's mysql_real_escape_string does\n * @param {string} value\n * @param {string} [additionalEscape] additionnal chars to escape\n * @returns {string}\n */\nUtils.escapeString = function(value, additionalEscape) {\n if (typeof value != 'string') {\n return value;\n }\n\n var escaped = value\n .replace(/[\\0\\n\\r\\b\\\\\\'\\\"]/g, function(s) {\n switch (s) {\n // @formatter:off\n case '\\0': return '\\\\0';\n case '\\n': return '\\\\n';\n case '\\r': return '\\\\r';\n case '\\b': return '\\\\b';\n case '\\'': return '\\'\\'';\n default: return '\\\\' + s;\n // @formatter:off\n }\n })\n // uglify compliant\n .replace(/\\t/g, '\\\\t')\n .replace(/\\x1a/g, '\\\\Z');\n\n if (additionalEscape) {\n escaped = escaped\n .replace(new RegExp('[' + additionalEscape + ']', 'g'), function(s) {\n return '\\\\' + s;\n });\n }\n\n return escaped;\n};\n\n/**\n * Escapes a string for use in regex\n * @param {string} str\n * @returns {string}\n */\nUtils.escapeRegExp = function(str) {\n return str.replace(/[\\-\\[\\]\\/\\{\\}\\(\\)\\*\\+\\?\\.\\\\\\^\\$\\|]/g, '\\\\$&');\n};\n\n/**\n * Escapes a string for use in HTML element id\n * @param {string} str\n * @returns {string}\n */\nUtils.escapeElementId = function(str) {\n // Regex based on that suggested by:\n // https://learn.jquery.com/using-jquery-core/faq/how-do-i-select-an-element-by-an-id-that-has-characters-used-in-css-notation/\n // - escapes : . [ ] ,\n // - avoids escaping already escaped values\n return (str) ? str.replace(/(\\\\)?([:.\\[\\],])/g,\n function( $0, $1, $2 ) { return $1 ? $0 : '\\\\' + $2; }) : str;\n};\n\n/**\n * Sorts objects by grouping them by `key`, preserving initial order when possible\n * @param {object[]} items\n * @param {string} key\n * @returns {object[]}\n */\nUtils.groupSort = function(items, key) {\n var optgroups = [];\n var newItems = [];\n\n items.forEach(function(item) {\n var idx;\n\n if (item[key]) {\n idx = optgroups.lastIndexOf(item[key]);\n\n if (idx == -1) {\n idx = optgroups.length;\n }\n else {\n idx++;\n }\n }\n else {\n idx = optgroups.length;\n }\n\n optgroups.splice(idx, 0, item[key]);\n newItems.splice(idx, 0, item);\n });\n\n return newItems;\n};\n\n/**\n * Defines properties on an Node prototype with getter and setter.<br>\n * Update events are emitted in the setter through root Model (if any).<br>\n * The object must have a `__` object, non enumerable property to store values.\n * @param {function} obj\n * @param {string[]} fields\n */\nUtils.defineModelProperties = function(obj, fields) {\n fields.forEach(function(field) {\n Object.defineProperty(obj.prototype, field, {\n enumerable: true,\n get: function() {\n return this.__[field];\n },\n set: function(value) {\n var previousValue = (this.__[field] !== null && typeof this.__[field] == 'object') ?\n $.extend({}, this.__[field]) :\n this.__[field];\n\n this.__[field] = value;\n\n if (this.model !== null) {\n /**\n * After a value of the model changed\n * @event model:update\n * @memberof Model\n * @param {Node} node\n * @param {string} field\n * @param {*} value\n * @param {*} previousValue\n */\n this.model.trigger('update', this, field, value, previousValue);\n }\n }\n });\n });\n};\n\n\n/**\n * Main object storing data model and emitting model events\n * @constructor\n */\nfunction Model() {\n /**\n * @member {Group}\n * @readonly\n */\n this.root = null;\n\n /**\n * Base for event emitting\n * @member {jQuery}\n * @readonly\n * @private\n */\n this.$ = $(this);\n}\n\n$.extend(Model.prototype, /** @lends Model.prototype */ {\n /**\n * Triggers an event on the model\n * @param {string} type\n * @returns {$.Event}\n */\n trigger: function(type) {\n var event = new $.Event(type);\n this.$.triggerHandler(event, Array.prototype.slice.call(arguments, 1));\n return event;\n },\n\n /**\n * Attaches an event listener on the model\n * @param {string} type\n * @param {function} cb\n * @returns {Model}\n */\n on: function() {\n this.$.on.apply(this.$, Array.prototype.slice.call(arguments));\n return this;\n },\n\n /**\n * Removes an event listener from the model\n * @param {string} type\n * @param {function} [cb]\n * @returns {Model}\n */\n off: function() {\n this.$.off.apply(this.$, Array.prototype.slice.call(arguments));\n return this;\n },\n\n /**\n * Attaches an event listener called once on the model\n * @param {string} type\n * @param {function} cb\n * @returns {Model}\n */\n once: function() {\n this.$.one.apply(this.$, Array.prototype.slice.call(arguments));\n return this;\n }\n});\n\n\n/**\n * Root abstract object\n * @constructor\n * @param {Node} [parent]\n * @param {jQuery} $el\n */\nvar Node = function(parent, $el) {\n if (!(this instanceof Node)) {\n return new Node(parent, $el);\n }\n\n Object.defineProperty(this, '__', { value: {} });\n\n $el.data('queryBuilderModel', this);\n\n /**\n * @name level\n * @member {int}\n * @memberof Node\n * @instance\n * @readonly\n */\n this.__.level = 1;\n\n /**\n * @name error\n * @member {string}\n * @memberof Node\n * @instance\n */\n this.__.error = null;\n\n /**\n * @name flags\n * @member {object}\n * @memberof Node\n * @instance\n * @readonly\n */\n this.__.flags = {};\n\n /**\n * @name data\n * @member {object}\n * @memberof Node\n * @instance\n */\n this.__.data = undefined;\n\n /**\n * @member {jQuery}\n * @readonly\n */\n this.$el = $el;\n\n /**\n * @member {string}\n * @readonly\n */\n this.id = $el[0].id;\n\n /**\n * @member {Model}\n * @readonly\n */\n this.model = null;\n\n /**\n * @member {Group}\n * @readonly\n */\n this.parent = parent;\n};\n\nUtils.defineModelProperties(Node, ['level', 'error', 'data', 'flags']);\n\nObject.defineProperty(Node.prototype, 'parent', {\n enumerable: true,\n get: function() {\n return this.__.parent;\n },\n set: function(value) {\n this.__.parent = value;\n this.level = value === null ? 1 : value.level + 1;\n this.model = value === null ? null : value.model;\n }\n});\n\n/**\n * Checks if this Node is the root\n * @returns {boolean}\n */\nNode.prototype.isRoot = function() {\n return (this.level === 1);\n};\n\n/**\n * Returns the node position inside its parent\n * @returns {int}\n */\nNode.prototype.getPos = function() {\n if (this.isRoot()) {\n return -1;\n }\n else {\n return this.parent.getNodePos(this);\n }\n};\n\n/**\n * Deletes self\n * @fires Model.model:drop\n */\nNode.prototype.drop = function() {\n var model = this.model;\n\n if (!!this.parent) {\n this.parent.removeNode(this);\n }\n\n this.$el.removeData('queryBuilderModel');\n\n if (model !== null) {\n /**\n * After a node of the model has been removed\n * @event model:drop\n * @memberof Model\n * @param {Node} node\n */\n model.trigger('drop', this);\n }\n};\n\n/**\n * Moves itself after another Node\n * @param {Node} target\n * @fires Model.model:move\n */\nNode.prototype.moveAfter = function(target) {\n if (!this.isRoot()) {\n this.move(target.parent, target.getPos() + 1);\n }\n};\n\n/**\n * Moves itself at the beginning of parent or another Group\n * @param {Group} [target]\n * @fires Model.model:move\n */\nNode.prototype.moveAtBegin = function(target) {\n if (!this.isRoot()) {\n if (target === undefined) {\n target = this.parent;\n }\n\n this.move(target, 0);\n }\n};\n\n/**\n * Moves itself at the end of parent or another Group\n * @param {Group} [target]\n * @fires Model.model:move\n */\nNode.prototype.moveAtEnd = function(target) {\n if (!this.isRoot()) {\n if (target === undefined) {\n target = this.parent;\n }\n\n this.move(target, target.length() === 0 ? 0 : target.length() - 1);\n }\n};\n\n/**\n * Moves itself at specific position of Group\n * @param {Group} target\n * @param {int} index\n * @fires Model.model:move\n */\nNode.prototype.move = function(target, index) {\n if (!this.isRoot()) {\n if (typeof target === 'number') {\n index = target;\n target = this.parent;\n }\n\n this.parent.removeNode(this);\n target.insertNode(this, index, false);\n\n if (this.model !== null) {\n /**\n * After a node of the model has been moved\n * @event model:move\n * @memberof Model\n * @param {Node} node\n * @param {Node} target\n * @param {int} index\n */\n this.model.trigger('move', this, target, index);\n }\n }\n};\n\n\n/**\n * Group object\n * @constructor\n * @extends Node\n * @param {Group} [parent]\n * @param {jQuery} $el\n */\nvar Group = function(parent, $el) {\n if (!(this instanceof Group)) {\n return new Group(parent, $el);\n }\n\n Node.call(this, parent, $el);\n\n /**\n * @member {object[]}\n * @readonly\n */\n this.rules = [];\n\n /**\n * @name condition\n * @member {string}\n * @memberof Group\n * @instance\n */\n this.__.condition = null;\n};\n\nGroup.prototype = Object.create(Node.prototype);\nGroup.prototype.constructor = Group;\n\nUtils.defineModelProperties(Group, ['condition']);\n\n/**\n * Removes group's content\n */\nGroup.prototype.empty = function() {\n this.each('reverse', function(rule) {\n rule.drop();\n }, function(group) {\n group.drop();\n });\n};\n\n/**\n * Deletes self\n */\nGroup.prototype.drop = function() {\n this.empty();\n Node.prototype.drop.call(this);\n};\n\n/**\n * Returns the number of children\n * @returns {int}\n */\nGroup.prototype.length = function() {\n return this.rules.length;\n};\n\n/**\n * Adds a Node at specified index\n * @param {Node} node\n * @param {int} [index=end]\n * @param {boolean} [trigger=false] - fire 'add' event\n * @returns {Node} the inserted node\n * @fires Model.model:add\n */\nGroup.prototype.insertNode = function(node, index, trigger) {\n if (index === undefined) {\n index = this.length();\n }\n\n this.rules.splice(index, 0, node);\n node.parent = this;\n\n if (trigger && this.model !== null) {\n /**\n * After a node of the model has been added\n * @event model:add\n * @memberof Model\n * @param {Node} parent\n * @param {Node} node\n * @param {int} index\n */\n this.model.trigger('add', this, node, index);\n }\n\n return node;\n};\n\n/**\n * Adds a new Group at specified index\n * @param {jQuery} $el\n * @param {int} [index=end]\n * @returns {Group}\n * @fires Model.model:add\n */\nGroup.prototype.addGroup = function($el, index) {\n return this.insertNode(new Group(this, $el), index, true);\n};\n\n/**\n * Adds a new Rule at specified index\n * @param {jQuery} $el\n * @param {int} [index=end]\n * @returns {Rule}\n * @fires Model.model:add\n */\nGroup.prototype.addRule = function($el, index) {\n return this.insertNode(new Rule(this, $el), index, true);\n};\n\n/**\n * Deletes a specific Node\n * @param {Node} node\n */\nGroup.prototype.removeNode = function(node) {\n var index = this.getNodePos(node);\n if (index !== -1) {\n node.parent = null;\n this.rules.splice(index, 1);\n }\n};\n\n/**\n * Returns the position of a child Node\n * @param {Node} node\n * @returns {int}\n */\nGroup.prototype.getNodePos = function(node) {\n return this.rules.indexOf(node);\n};\n\n/**\n * @callback Model#GroupIteratee\n * @param {Node} node\n * @returns {boolean} stop the iteration\n */\n\n/**\n * Iterate over all Nodes\n * @param {boolean} [reverse=false] - iterate in reverse order, required if you delete nodes\n * @param {Model#GroupIteratee} cbRule - callback for Rules (can be `null` but not omitted)\n * @param {Model#GroupIteratee} [cbGroup] - callback for Groups\n * @param {object} [context] - context for callbacks\n * @returns {boolean} if the iteration has been stopped by a callback\n */\nGroup.prototype.each = function(reverse, cbRule, cbGroup, context) {\n if (typeof reverse !== 'boolean' && typeof reverse !== 'string') {\n context = cbGroup;\n cbGroup = cbRule;\n cbRule = reverse;\n reverse = false;\n }\n context = context === undefined ? null : context;\n\n var i = reverse ? this.rules.length - 1 : 0;\n var l = reverse ? 0 : this.rules.length - 1;\n var c = reverse ? -1 : 1;\n var next = function() {\n return reverse ? i >= l : i <= l;\n };\n var stop = false;\n\n for (; next(); i += c) {\n if (this.rules[i] instanceof Group) {\n if (!!cbGroup) {\n stop = cbGroup.call(context, this.rules[i]) === false;\n }\n }\n else if (!!cbRule) {\n stop = cbRule.call(context, this.rules[i]) === false;\n }\n\n if (stop) {\n break;\n }\n }\n\n return !stop;\n};\n\n/**\n * Checks if the group contains a particular Node\n * @param {Node} node\n * @param {boolean} [recursive=false]\n * @returns {boolean}\n */\nGroup.prototype.contains = function(node, recursive) {\n if (this.getNodePos(node) !== -1) {\n return true;\n }\n else if (!recursive) {\n return false;\n }\n else {\n // the loop will return with false as soon as the Node is found\n return !this.each(function() {\n return true;\n }, function(group) {\n return !group.contains(node, true);\n });\n }\n};\n\n\n/**\n * Rule object\n * @constructor\n * @extends Node\n * @param {Group} parent\n * @param {jQuery} $el\n */\nvar Rule = function(parent, $el) {\n if (!(this instanceof Rule)) {\n return new Rule(parent, $el);\n }\n\n Node.call(this, parent, $el);\n\n this._updating_value = false;\n this._updating_input = false;\n\n /**\n * @name filter\n * @member {QueryBuilder.Filter}\n * @memberof Rule\n * @instance\n */\n this.__.filter = null;\n\n /**\n * @name operator\n * @member {QueryBuilder.Operator}\n * @memberof Rule\n * @instance\n */\n this.__.operator = null;\n\n /**\n * @name value\n * @member {*}\n * @memberof Rule\n * @instance\n */\n this.__.value = undefined;\n};\n\nRule.prototype = Object.create(Node.prototype);\nRule.prototype.constructor = Rule;\n\nUtils.defineModelProperties(Rule, ['filter', 'operator', 'value']);\n\n/**\n * Checks if this Node is the root\n * @returns {boolean} always false\n */\nRule.prototype.isRoot = function() {\n return false;\n};\n\n\n/**\n * @member {function}\n * @memberof QueryBuilder\n * @see Group\n */\nQueryBuilder.Group = Group;\n\n/**\n * @member {function}\n * @memberof QueryBuilder\n * @see Rule\n */\nQueryBuilder.Rule = Rule;\n\n\n/**\n * The {@link http://learn.jquery.com/plugins/|jQuery Plugins} namespace\n * @external \"jQuery.fn\"\n */\n\n/**\n * Instanciates or accesses the {@link QueryBuilder} on an element\n * @function\n * @memberof external:\"jQuery.fn\"\n * @param {*} option - initial configuration or method name\n * @param {...*} args - method arguments\n *\n * @example\n * $('#builder').queryBuilder({ /** configuration object *\\/ });\n * @example\n * $('#builder').queryBuilder('methodName', methodParam1, methodParam2);\n */\n$.fn.queryBuilder = function(option) {\n if (this.length === 0) {\n Utils.error('Config', 'No target defined');\n }\n if (this.length > 1) {\n Utils.error('Config', 'Unable to initialize on multiple target');\n }\n\n var data = this.data('queryBuilder');\n var options = (typeof option == 'object' && option) || {};\n\n if (!data && option == 'destroy') {\n return this;\n }\n if (!data) {\n var builder = new QueryBuilder(this, options);\n this.data('queryBuilder', builder);\n builder.init(options.rules);\n }\n if (typeof option == 'string') {\n return data[option].apply(data, Array.prototype.slice.call(arguments, 1));\n }\n\n return this;\n};\n\n/**\n * @function\n * @memberof external:\"jQuery.fn\"\n * @see QueryBuilder\n */\n$.fn.queryBuilder.constructor = QueryBuilder;\n\n/**\n * @function\n * @memberof external:\"jQuery.fn\"\n * @see QueryBuilder.defaults\n */\n$.fn.queryBuilder.defaults = QueryBuilder.defaults;\n\n/**\n * @function\n * @memberof external:\"jQuery.fn\"\n * @see QueryBuilder.defaults\n */\n$.fn.queryBuilder.extend = QueryBuilder.extend;\n\n/**\n * @function\n * @memberof external:\"jQuery.fn\"\n * @see QueryBuilder.define\n */\n$.fn.queryBuilder.define = QueryBuilder.define;\n\n/**\n * @function\n * @memberof external:\"jQuery.fn\"\n * @see QueryBuilder.regional\n */\n$.fn.queryBuilder.regional = QueryBuilder.regional;\n\n\n/**\n * @class ChangeFilters\n * @memberof module:plugins\n * @description Allows to change available filters after plugin initialization.\n */\n\nQueryBuilder.extend(/** @lends module:plugins.ChangeFilters.prototype */ {\n /**\n * Change the filters of the builder\n * @param {boolean} [deleteOrphans=false] - delete rules using old filters\n * @param {QueryBuilder[]} filters\n * @fires module:plugins.ChangeFilters.changer:setFilters\n * @fires module:plugins.ChangeFilters.afterSetFilters\n * @throws ChangeFilterError\n */\n setFilters: function(deleteOrphans, filters) {\n var self = this;\n\n if (filters === undefined) {\n filters = deleteOrphans;\n deleteOrphans = false;\n }\n\n filters = this.checkFilters(filters);\n\n /**\n * Modifies the filters before {@link module:plugins.ChangeFilters.setFilters} method\n * @event changer:setFilters\n * @memberof module:plugins.ChangeFilters\n * @param {QueryBuilder.Filter[]} filters\n * @returns {QueryBuilder.Filter[]}\n */\n filters = this.change('setFilters', filters);\n\n var filtersIds = filters.map(function(filter) {\n return filter.id;\n });\n\n // check for orphans\n if (!deleteOrphans) {\n (function checkOrphans(node) {\n node.each(\n function(rule) {\n if (rule.filter && filtersIds.indexOf(rule.filter.id) === -1) {\n Utils.error('ChangeFilter', 'A rule is using filter \"{0}\"', rule.filter.id);\n }\n },\n checkOrphans\n );\n }(this.model.root));\n }\n\n // replace filters\n this.filters = filters;\n\n // apply on existing DOM\n (function updateBuilder(node) {\n node.each(true,\n function(rule) {\n if (rule.filter && filtersIds.indexOf(rule.filter.id) === -1) {\n rule.drop();\n\n self.trigger('rulesChanged');\n }\n else {\n self.createRuleFilters(rule);\n\n rule.$el.find(QueryBuilder.selectors.rule_filter).val(rule.filter ? rule.filter.id : '-1');\n self.trigger('afterUpdateRuleFilter', rule);\n }\n },\n updateBuilder\n );\n }(this.model.root));\n\n // update plugins\n if (this.settings.plugins) {\n if (this.settings.plugins['unique-filter']) {\n this.updateDisabledFilters();\n }\n if (this.settings.plugins['bt-selectpicker']) {\n this.$el.find(QueryBuilder.selectors.rule_filter).selectpicker('render');\n }\n }\n\n // reset the default_filter if does not exist anymore\n if (this.settings.default_filter) {\n try {\n this.getFilterById(this.settings.default_filter);\n }\n catch (e) {\n this.settings.default_filter = null;\n }\n }\n\n /**\n * After {@link module:plugins.ChangeFilters.setFilters} method\n * @event afterSetFilters\n * @memberof module:plugins.ChangeFilters\n * @param {QueryBuilder.Filter[]} filters\n */\n this.trigger('afterSetFilters', filters);\n },\n\n /**\n * Adds a new filter to the builder\n * @param {QueryBuilder.Filter|Filter[]} newFilters\n * @param {int|string} [position=#end] - index or '#start' or '#end'\n * @fires module:plugins.ChangeFilters.changer:setFilters\n * @fires module:plugins.ChangeFilters.afterSetFilters\n * @throws ChangeFilterError\n */\n addFilter: function(newFilters, position) {\n if (position === undefined || position == '#end') {\n position = this.filters.length;\n }\n else if (position == '#start') {\n position = 0;\n }\n\n if (!Array.isArray(newFilters)) {\n newFilters = [newFilters];\n }\n\n var filters = $.extend(true, [], this.filters);\n\n // numeric position\n if (parseInt(position) == position) {\n Array.prototype.splice.apply(filters, [position, 0].concat(newFilters));\n }\n else {\n // after filter by its id\n if (this.filters.some(function(filter, index) {\n if (filter.id == position) {\n position = index + 1;\n return true;\n }\n })\n ) {\n Array.prototype.splice.apply(filters, [position, 0].concat(newFilters));\n }\n // defaults to end of list\n else {\n Array.prototype.push.apply(filters, newFilters);\n }\n }\n\n this.setFilters(filters);\n },\n\n /**\n * Removes a filter from the builder\n * @param {string|string[]} filterIds\n * @param {boolean} [deleteOrphans=false] delete rules using old filters\n * @fires module:plugins.ChangeFilters.changer:setFilters\n * @fires module:plugins.ChangeFilters.afterSetFilters\n * @throws ChangeFilterError\n */\n removeFilter: function(filterIds, deleteOrphans) {\n var filters = $.extend(true, [], this.filters);\n if (typeof filterIds === 'string') {\n filterIds = [filterIds];\n }\n\n filters = filters.filter(function(filter) {\n return filterIds.indexOf(filter.id) === -1;\n });\n\n this.setFilters(deleteOrphans, filters);\n }\n});\n\n\n/**\n * @class FilterDescription\n * @memberof module:plugins\n * @description Provides three ways to display a description about a filter: inline or Bootsrap Popover\n * @param {object} [options]\n * @param {string} [options.icon='fa-solid fa-info']\n * @param {string} [options.mode='tooltip'] - inline or tooltip\n */\nQueryBuilder.define('filter-description', function(options) {\n // Inline\n if (options.mode === 'inline') {\n this.on('afterUpdateRuleFilter afterUpdateRuleOperator', function(e, rule) {\n var $p = rule.$el.find('p.filter-description');\n var description = e.builder.getFilterDescription(rule.filter, rule);\n\n if (!description) {\n $p.hide();\n }\n else {\n if ($p.length === 0) {\n $p = $($.parseHTML('<p class=\"filter-description\"></p>'));\n $p.appendTo(rule.$el);\n }\n else {\n $p.css('display', '');\n }\n\n $p.html('<i class=\"' + options.icon + '\"></i> ' + description);\n }\n });\n }\n // Tooltip\n else if (options.mode === 'tooltip') {\n this.on('afterUpdateRuleFilter afterUpdateRuleOperator', function(e, rule) {\n var $b = rule.$el.find('button.filter-description');\n var description = e.builder.getFilterDescription(rule.filter, rule);\n\n if (!description) {\n $b.hide();\n\n if ($b.data('bs.tooltip')) {\n $b.tooltip('hide');\n }\n }\n else {\n if ($b.length === 0) {\n $b = $($.parseHTML('<button type=\"button\" class=\"btn btn-sm btn-light filter-description float-end me-2\" data-bs-toggle=\"tooltip\"><i class=\"' + options.icon + '\"></i></button>'));\n rule.$el.find(QueryBuilder.selectors.rule_actions).after($b);\n\n $b.tooltip({\n placement: document.dir == 'rtl' ? 'right' : 'left',\n container: e.builder.$el[0],\n html: true,\n trigger: 'hover',\n title: description\n });\n\n // $b.on('mouseout', function() {\n // $b.tooltip('hide');\n // });\n }\n else {\n $b.css('display', '');\n }\n\n if ($b.attr('aria-describedby')) {\n $b.tooltip('show');\n }\n }\n });\n }\n}, {\n icon: 'fa-solid fa-info',\n mode: 'tooltip'\n});\n\nQueryBuilder.extend(/** @lends module:plugins.FilterDescription.prototype */ {\n /**\n * Returns the description of a filter for a particular rule (if present)\n * @param {object} filter\n * @param {Rule} [rule]\n * @returns {string}\n * @private\n */\n getFilterDescription: function(filter, rule) {\n if (!filter) {\n return undefined;\n }\n else if (typeof filter.description == 'function') {\n return filter.description.call(this, rule);\n }\n else {\n return filter.description;\n }\n }\n});\n\n\n/**\n * @class Invert\n * @memberof module:plugins\n * @description Allows to invert a rule operator, a group condition or the entire builder.\n * @param {object} [options]\n * @param {string} [options.icon='fa-solid fa-shuffle']\n * @param {boolean} [options.recursive=true]\n * @param {boolean} [options.invert_rules=true]\n * @param {boolean} [options.display_rules_button=false]\n * @param {boolean} [options.silent_fail=false]\n */\nQueryBuilder.define('invert', function(options) {\n var self = this;\n var Selectors = QueryBuilder.selectors;\n\n // Bind events\n this.on('afterInit', function () {\n self.$el.on('click.queryBuilder', '[data-invert=group]', function() {\n var $group = $(this).closest(Selectors.group_container);\n self.invert(self.getModel($group), options);\n });\n\n if (options.display_rules_button && options.invert_rules) {\n self.$el.on('click.queryBuilder', '[data-invert=rule]', function() {\n var $rule = $(this).closest(Selectors.rule_container);\n self.invert(self.getModel($rule), options);\n });\n }\n });\n\n // Modify templates\n if (!options.disable_template) {\n this.on('getGroupTemplate.filter', function(h) {\n var $h = $($.parseHTML(h.value));\n $h.find(Selectors.condition_container).after(\n`<button\n type=\"button\"\n class=\"btn btn-sm btn-secondary\"\n data-bs-toggle=\"tooltip\"\n title=\"${self.translate('invert')}\"\n data-invert=\"group\">\n <i class=\"${options.icon}\"></i>\n</button>`\n );\n h.value = $h.prop('outerHTML');\n });\n\n if (options.display_rules_button && options.invert_rules) {\n this.on('getRuleTemplate.filter', function(h) {\n var $h = $($.parseHTML(h.value));\n $h.find(Selectors.rule_actions).after(\n`<button\n type=\"button\"\n class=\"btn btn-sm btn-secondary\"\n data-bs-toggle=\"tooltip\"\n title=\"${self.translate('invert')}\"\n data-invert=\"rule\">\n <i class=\"${options.icon}\"></i>\n</button>`\n );\n h.value = $h.prop('outerHTML');\n });\n }\n }\n}, {\n icon: 'fa-solid fa-shuffle',\n recursive: true,\n invert_rules: true,\n display_rules_button: false,\n silent_fail: false,\n disable_template: false\n});\n\nQueryBuilder.defaults({\n operatorOpposites: {\n 'equal': 'not_equal',\n 'not_equal': 'equal',\n 'in': 'not_in',\n 'not_in': 'in',\n 'less': 'greater_or_equal',\n 'less_or_equal': 'greater',\n 'greater': 'less_or_equal',\n 'greater_or_equal': 'less',\n 'between': 'not_between',\n 'not_between': 'between',\n 'begins_with': 'not_begins_with',\n 'not_begins_with': 'begins_with',\n 'contains': 'not_contains',\n 'not_contains': 'contains',\n 'ends_with': 'not_ends_with',\n 'not_ends_with': 'ends_with',\n 'is_empty': 'is_not_empty',\n 'is_not_empty': 'is_empty',\n 'is_null': 'is_not_null',\n 'is_not_null': 'is_null'\n },\n\n conditionOpposites: {\n 'AND': 'OR',\n 'OR': 'AND'\n }\n});\n\nQueryBuilder.extend(/** @lends module:plugins.Invert.prototype */ {\n /**\n * Invert a Group, a Rule or the whole builder\n * @param {Node} [node]\n * @param {object} [options] {@link module:plugins.Invert}\n * @fires module:plugins.Invert.afterInvert\n * @throws InvertConditionError, InvertOperatorError\n */\n invert: function(node, options) {\n if (!(node instanceof Node)) {\n if (!this.model.root) return;\n options = node;\n node = this.model.root;\n }\n\n if (typeof options != 'object') options = {};\n if (options.recursive === undefined) options.recursive = true;\n if (options.invert_rules === undefined) options.invert_rules = true;\n if (options.silent_fail === undefined) options.silent_fail = false;\n if (options.trigger === undefined) options.trigger = true;\n\n if (node instanceof Group) {\n // invert group condition\n if (this.settings.conditionOpposites[node.condition]) {\n node.condition = this.settings.conditionOpposites[node.condition];\n }\n else if (!options.silent_fail) {\n Utils.error('InvertCondition', 'Unknown inverse of condition \"{0}\"', node.condition);\n }\n\n // recursive call\n if (options.recursive) {\n var tempOpts = $.extend({}, options, { trigger: false });\n node.each(function(rule) {\n if (options.invert_rules) {\n this.invert(rule, tempOpts);\n }\n }, function(group) {\n this.invert(group, tempOpts);\n }, this);\n }\n }\n else if (node instanceof Rule) {\n if (node.operator && node.filter && !node.filter.no_invert) { //***\n // invert rule operator\n if (this.settings.operatorOpposites[node.operator.type]) {\n var invert = this.settings.operatorOpposites[node.operator.type];\n // check if the invert is \"authorized\"\n if (!node.filter.operators || node.filter.operators.indexOf(invert) != -1) {\n node.operator = this.getOperatorByType(invert);\n }\n }\n else if (!options.silent_fail) {\n Utils.error('InvertOperator', 'Unknown inverse of operator \"{0}\"', node.operator.type);\n }\n }\n }\n\n if (options.trigger) {\n /**\n * After {@link module:plugins.Invert.invert} method\n * @event afterInvert\n * @memberof module:plugins.Invert\n * @param {Node} node - the main group or rule that has been modified\n * @param {object} options\n */\n this.trigger('afterInvert', node, options);\n\n this.trigger('rulesChanged');\n }\n }\n});\n\n\n/**\n * @class NotGroup\n * @memberof module:plugins\n * @description Adds a \"Not\" checkbox in front of group conditions.\n * @param {object} [options]\n */\nQueryBuilder.define('not-group', function(options) {\n var self = this;\n\n // Bind events\n this.on('afterInit', function() {\n self.$el.on('click.queryBuilder', '[data-not=group]', function() {\n var $group = $(this).closest(QueryBuilder.selectors.group_container);\n var group = self.getModel($group);\n group.not = !group.not;\n });\n\n self.model.on('update', function(e, node, field) {\n if (node instanceof Group && field === 'not') {\n self.updateGroupNot(node);\n }\n });\n });\n\n // Init \"not\" property\n this.on('afterAddGroup', function(e, group) {\n group.__.not = false;\n });\n\n // Modify templates\n if (!options.disable_template) {\n this.on('getGroupTemplate.filter', function(h) {\n var $h = $($.parseHTML(h.value));\n $h.find(QueryBuilder.selectors.condition_container).before(`<div class=\"form-check form-switch float-start me-2\">\n <input class=\"form-check-input\" type=\"checkbox\" role=\"switch\" data-not=\"group\">\n <label class=\"form-check-label\">${self.translate('NOT')}</label>\n</div>`);\n h.value = $h.prop('outerHTML');\n });\n }\n\n // Export \"not\" to JSON\n this.on('groupToJson.filter', function(e, group) {\n e.value.not = group.not;\n });\n\n // Read \"not\" from JSON\n this.on('jsonToGroup.filter', function(e, json) {\n e.value.not = !!json.not;\n });\n\n // Export \"not\" to SQL\n this.on('groupToSQL.filter', function(e, group) {\n if (group.not) {\n e.value = 'NOT ( ' + e.value + ' )';\n }\n });\n\n // Parse \"NOT\" function from sqlparser\n this.on('parseSQLNode.filter', function(e) {\n if (e.value.name && e.value.name.toUpperCase() == 'NOT') {\n e.value = e.value.arguments.value[0];\n\n // if the there is no sub-group, create one\n if (['AND', 'OR'].indexOf(e.value.operation.toUpperCase()) === -1) {\n e.value = new SQLParser.nodes.Op(\n self.settings.default_condition,\n e.value,\n null\n );\n }\n\n e.value.not = true;\n }\n });\n\n // Request to create sub-group if the \"not\" flag is set\n this.on('sqlGroupsDistinct.filter', function(e, group, data, i) {\n if (data.not && i > 0) {\n e.value = true;\n }\n });\n\n // Read \"not\" from parsed SQL\n this.on('sqlToGroup.filter', function(e, data) {\n e.value.not = !!data.not;\n });\n\n // Export \"not\" to Mongo\n this.on('groupToMongo.filter', function(e, group) {\n var key = '$' + group.condition.toLowerCase();\n if (group.not && e.value[key]) {\n e.value = { '$nor': [e.value] };\n }\n });\n\n // Parse \"$nor\" operator from Mongo\n this.on('parseMongoNode.filter', function(e) {\n var keys = Object.keys(e.value);\n\n if (keys[0] == '$nor') {\n e.value = e.value[keys[0]][0];\n e.value.not = true;\n }\n });\n\n // Read \"not\" from parsed Mongo\n this.on('mongoToGroup.filter', function(e, data) {\n e.value.not = !!data.not;\n });\n}, {\n disable_template: false\n});\n\n/**\n * From {@link module:plugins.NotGroup}\n * @name not\n * @member {boolean}\n * @memberof Group\n * @instance\n */\nUtils.defineModelProperties(Group, ['not']);\n\nQueryBuilder.extend(/** @lends module:plugins.NotGroup.prototype */ {\n /**\n * Performs actions when a group's not changes\n * @param {Group} group\n * @fires module:plugins.NotGroup.afterUpdateGroupNot\n * @private\n */\n updateGroupNot: function(group) {\n /**\n * After the group's not flag has been modified\n * @event afterUpdateGroupNot\n * @memberof module:plugins.NotGroup\n * @param {Group} group\n */\n this.trigger('afterUpdateGroupNot', group);\n\n this.trigger('rulesChanged');\n }\n});\n\n\n/**\n * @class Select2\n * @memberof module:plugins\n * @descriptioon Applies Select2 on filters, operators and values selection lists\n * @param {object} [options]\n */\nQueryBuilder.define('select2', function(options) {\n var Selectors = QueryBuilder.selectors;\n\n // Init Select2\n this.on('afterCreateRuleFilters', function (e, rule) {\n var filter = rule.filter;\n if (options.applyToFilter)\n rule.$el.find(Selectors.rule_filter).select2(options.filterSelect2Options ?? {});\n if (options.applyToOperator)\n rule.$el.find(Selectors.rule_operator).select2($.extend({}, filter?.operatorSelect2Options ?? {}, options.operatorSelect2Options ?? {}));\n if (options.applyToValue)\n rule.$el.find(Selectors.rule_value).filter('select').select2($.extend({}, filter?.valueSelect2Options ?? {}, options.valueSelect2Options ?? {}));\n });\n\n // Update select2 on change\n this.on('afterUpdateRuleFilter', function(e, rule) {\n //***rule.$el.find(Selectors.rule_filter).trigger('change'); //???\n });\n\n this.on('beforeDeleteRule', function (e, rule) {\n if (options.applyToFilter)\n rule.$el.find(Selectors.rule_filter).select2('destroy');\n if (options.applyToOperator)\n rule.$el.find(Selectors.rule_operator).select2('destroy');\n if (options.applyToValue)\n rule.$el.find(Selectors.rule_value).filter('select').select2('destroy');\n });\n}, {\n applyToFilter: true, // Apply Select2 to filter\n applyToOperator: false, // Apply Select2 to operator\n applyToValue: true, // Apply Select2 to value\n filterSelect2Options: null, // Select2 options for filter\n operatorSelect2Options: null, // Select2 options for operator\n valueSelect2Options: null, // Select2 options for value\n});\n\n\n/**\n * @class SqlSupport\n * @memberof module:plugins\n * @description Allows to export rules as a SQL WHERE statement as well as populating the builder from an SQL query.\n * @param {object} [options]\n * @param {boolean} [options.boolean_as_integer=true] - `true` to convert boolean values to integer in the SQL output\n */\nQueryBuilder.define('sql-support', function(options) {\n\n}, {\n boolean_as_integer: true\n});\n\nQueryBuilder.defaults({\n // operators for internal -> SQL conversion\n sqlOperators: {\n equal: { op: '= ?' },\n not_equal: { op: '!= ?' },\n in: { op: 'IN(?)', sep: ', ' },\n not_in: { op: 'NOT IN(?)', sep: ', ' },\n less: { op: '< ?' },\n less_or_equal: { op: '<= ?' },\n greater: { op: '> ?' },\n greater_or_equal: { op: '>= ?' },\n between: { op: 'BETWEEN ?', sep: ' AND ' },\n not_between: { op: 'NOT BETWEEN ?', sep: ' AND ' },\n begins_with: { op: 'LIKE ?', mod: '{0}%', escape: '%_' },\n not_begins_with: { op: 'NOT LIKE ?', mod: '{0}%', escape: '%_' },\n contains: { op: 'LIKE ?', mod: '%{0}%', escape: '%_' },\n not_contains: { op: 'NOT LIKE ?', mod: '%{0}%', escape: '%_' },\n ends_with: { op: 'LIKE ?', mod: '%{0}', escape: '%_' },\n not_ends_with: { op: 'NOT LIKE ?', mod: '%{0}', escape: '%_' },\n is_empty: { op: '= \\'\\'' },\n is_not_empty: { op: '!= \\'\\'' },\n is_null: { op: 'IS NULL' },\n is_not_null: { op: 'IS NOT NULL' }\n },\n\n // operators for SQL -> internal conversion\n sqlRuleOperator: {\n '=': function(v) {\n return {\n val: v,\n op: v === '' ? 'is_empty' : 'equal'\n };\n },\n '!=': function(v) {\n return {\n val: v,\n op: v === '' ? 'is_not_empty' : 'not_equal'\n };\n },\n 'LIKE': function(v) {\n if (v.slice(0, 1) == '%' && v.slice(-1) == '%') {\n return {\n val: v.slice(1, -1),\n op: 'contains'\n };\n }\n else if (v.slice(0, 1) == '%') {\n return {\n val: v.slice(1),\n op: 'ends_with'\n };\n }\n else if (v.slice(-1) == '%') {\n return {\n val: v.slice(0, -1),\n op: 'begins_with'\n };\n }\n else {\n Utils.error('SQLParse', 'Invalid value for LIKE operator \"{0}\"', v);\n }\n },\n 'NOT LIKE': function(v) {\n if (v.slice(0, 1) == '%' && v.slice(-1) == '%') {\n return {\n val: v.slice(1, -1),\n op: 'not_contains'\n };\n }\n else if (v.slice(0, 1) == '%') {\n return {\n val: v.slice(1),\n op: 'not_ends_with'\n };\n }\n else if (v.slice(-1) == '%') {\n return {\n val: v.slice(0, -1),\n op: 'not_begins_with'\n };\n }\n else {\n Utils.error('SQLParse', 'Invalid value for NOT LIKE operator \"{0}\"', v);\n }\n },\n 'IN': function(v) {\n return { val: v, op: 'in' };\n },\n 'NOT IN': function(v) {\n return { val: v, op: 'not_in' };\n },\n '<': function(v) {\n return { val: v, op: 'less' };\n },\n '<=': function(v) {\n return { val: v, op: 'less_or_equal' };\n },\n '>': function(v) {\n return { val: v, op: 'greater' };\n },\n '>=': function(v) {\n return { val: v, op: 'greater_or_equal' };\n },\n 'BETWEEN': function(v) {\n return { val: v, op: 'between' };\n },\n 'NOT BETWEEN': function(v) {\n return { val: v, op: 'not_between' };\n },\n 'IS': function(v) {\n if (v !== null) {\n Utils.error('SQLParse', 'Invalid value for IS operator');\n }\n return { val: null, op: 'is_null' };\n },\n 'IS NOT': function(v) {\n if (v !== null) {\n Utils.error('SQLParse', 'Invalid value for IS operator');\n }\n return { val: null, op: 'is_not_null' };\n }\n },\n\n // statements for internal -> SQL conversion\n sqlStatements: {\n 'question_mark': function() {\n var params = [];\n return {\n add: function(rule, value) {\n params.push(value);\n return '?';\n },\n run: function() {\n return params;\n }\n };\n },\n\n 'numbered': function(char) {\n if (!char || char.length > 1) char = '$';\n var index = 0;\n var params = [];\n return {\n add: function(rule, value) {\n params.push(value);\n index++;\n return char + index;\n },\n run: function() {\n return params;\n }\n };\n },\n\n 'named': function(char) {\n if (!char || char.length > 1) char = ':';\n var indexes = {};\n var params = {};\n return {\n add: function(rule, value) {\n if (!indexes[rule.field]) indexes[rule.field] = 1;\n var key = rule.field + '_' + (indexes[rule.field]++);\n params[key] = value;\n return char + key;\n },\n run: function() {\n return params;\n }\n };\n }\n },\n\n // statements for SQL -> internal conversion\n sqlRuleStatement: {\n 'question_mark': function(values) {\n var index = 0;\n return {\n parse: function(v) {\n return v == '?' ? values[index++] : v;\n },\n esc: function(sql) {\n return sql.replace(/\\?/g, '\\'?\\'');\n }\n };\n },\n\n 'numbered': function(values, char) {\n if (!char || char.length > 1) char = '$';\n var regex1 = new RegExp('^\\\\' + char + '[0-9]+$');\n var regex2 = new RegExp('\\\\' + char + '([0-9]+)', 'g');\n return {\n parse: function(v) {\n return regex1.test(v) ? values[v.slice(1) - 1] : v;\n },\n esc: function(sql) {\n return sql.replace(regex2, '\\'' + (char == '$' ? '$$' : char) + '$1\\'');\n }\n };\n },\n\n 'named': function(values, char) {\n if (!char || char.length > 1) char = ':';\n var regex1 = new RegExp('^\\\\' + char);\n var regex2 = new RegExp('\\\\' + char + '(' + Object.keys(values).join('|') + ')\\\\b', 'g');\n return {\n parse: function(v) {\n return regex1.test(v) ? values[v.slice(1)] : v;\n },\n esc: function(sql) {\n return sql.replace(regex2, '\\'' + (char == '$' ? '$$' : char) + '$1\\'');\n }\n };\n }\n }\n});\n\n/**\n * @typedef {object} SqlQuery\n * @memberof module:plugins.SqlSupport\n * @property {string} sql\n * @property {object} params\n */\n\nQueryBuilder.extend(/** @lends module:plugins.SqlSupport.prototype */ {\n /**\n * Returns rules as a SQL query\n * @param {boolean|string} [stmt] - use prepared statements: false, 'question_mark', 'numbered', 'numbered(@)', 'named', 'named(@)'\n * @param {boolean} [nl=false] output with new lines\n * @param {object} [data] - current rules by default\n * @returns {module:plugins.SqlSupport.SqlQuery}\n * @fires module:plugins.SqlSupport.changer:getSQLField\n * @fires module:plugins.SqlSupport.changer:ruleToSQL\n * @fires module:plugins.SqlSupport.changer:groupToSQL\n * @throws UndefinedSQLConditionError, UndefinedSQLOperatorError\n */\n getSQL: function(stmt, nl, data) {\n data = (data === undefined) ? this.getRules() : data;\n\n if (!data) {\n return null;\n }\n\n nl = !!nl ? '\\n' : ' ';\n var boolean_as_integer = this.getPluginOptions('sql-support', 'boolean_as_integer');\n\n if (stmt === true) {\n stmt = 'question_mark';\n }\n if (typeof stmt == 'string') {\n var config = getStmtConfig(stmt);\n stmt = this.settings.sqlStatements[config[1]](config[2]);\n }\n\n var self = this;\n\n var sql = (function parse(group) {\n if (!group.condition) {\n group.condition = self.settings.default_condition;\n }\n if (['AND', 'OR'].indexOf(group.condition.toUpperCase()) === -1) {\n Utils.error('UndefinedSQLCondition', 'Unable to build SQL query with condition \"{0}\"', group.condition);\n }\n\n if (!group.rules) {\n return '';\n }\n\n var parts = [];\n\n group.rules.forEach(function(rule) {\n if (rule.rules && rule.rules.length > 0) {\n parts.push('(' + nl + parse(rule) + nl + ')' + nl);\n }\n else {\n var sql = self.settings.sqlOperators[rule.operator];\n var ope = self.getOperatorByType(rule.operator);\n var value = '';\n\n if (sql === undefined) {\n Utils.error('UndefinedSQLOperator', 'Unknown SQL operation for operator \"{0}\"', rule.operator);\n }\n\n if (ope.nb_inputs !== 0) {\n if (!(rule.value instanceof Array)) {\n rule.value = [rule.value];\n }\n\n rule.value.forEach(function(v, i) {\n if (i > 0) {\n value += sql.sep;\n }\n\n if (rule.type == 'boolean' && boolean_as_integer) {\n v = v ? 1 : 0;\n }\n else if (!stmt && rule.type !== 'integer' && rule.type !== 'double' && rule.type !== 'boolean') {\n v = Utils.escapeString(v, sql.escape);\n }\n\n if (sql.mod) {\n v = Utils.fmt(sql.mod, v);\n }\n\n if (stmt) {\n value += stmt.add(rule, v);\n }\n else {\n if (typeof v == 'string') {\n v = '\\'' + v + '\\'';\n }\n\n value += v;\n }\n });\n }\n\n var sqlFn = function(v) {\n return sql.op.replace('?', function() {\n return v;\n });\n };\n\n /**\n * Modifies the SQL field used by a rule\n * @event changer:getSQLField\n * @memberof module:plugins.SqlSupport\n * @param {string} field\n * @param {Rule} rule\n * @returns {string}\n */\n var field = self.change('getSQLField', rule.field, rule);\n\n var ruleExpression = field + ' ' + sqlFn(value);\n\n /**\n * Modifies the SQL generated for a rule\n * @event changer:ruleToSQL\n * @memberof module:plugins.SqlSupport\n * @param {string} expression\n * @param {Rule} rule\n * @param {*} value\n * @param {function} valueWrapper - function that takes the value and adds the operator\n * @returns {string}\n */\n parts.push(self.change('ruleToSQL', ruleExpression, rule, value, sqlFn));\n }\n });\n\n var groupExpression = parts.join(' ' + group.condition + nl);\n\n /**\n * Modifies the SQL generated for a group\n * @event changer:groupToSQL\n * @memberof module:plugins.SqlSupport\n * @param {string} expression\n * @param {Group} group\n * @returns {string}\n */\n return self.change('groupToSQL', groupExpression, group);\n }(data));\n\n if (stmt) {\n return {\n sql: sql,\n params: stmt.run()\n };\n }\n else {\n return {\n sql: sql\n };\n }\n },\n\n /**\n * Convert a SQL query to rules\n * @param {string|module:plugins.SqlSupport.SqlQuery} query\n * @param {boolean|string} stmt\n * @returns {object}\n * @fires module:plugins.SqlSupport.changer:parseSQLNode\n * @fires module:plugins.SqlSupport.changer:getSQLFieldID\n * @fires module:plugins.SqlSupport.changer:sqlToRule\n * @fires module:plugins.SqlSupport.changer:sqlToGroup\n * @throws MissingLibraryError, SQLParseError, UndefinedSQLOperatorError\n */\n getRulesFromSQL: function(query, stmt) {\n if (!('SQLParser' in window)) {\n Utils.error('MissingLibrary', 'SQLParser is required to parse SQL queries. Get it here https://github.com/mistic100/sql-parser');\n }\n\n var self = this;\n\n if (typeof query == 'string') {\n query = { sql: query };\n }\n\n if (stmt === true) stmt = 'question_mark';\n if (typeof stmt == 'string') {\n var config = getStmtConfig(stmt);\n stmt = this.settings.sqlRuleStatement[config[1]](query.params, config[2]);\n }\n\n if (stmt) {\n query.sql = stmt.esc(query.sql);\n }\n\n if (query.sql.toUpperCase().indexOf('SELECT') !== 0) {\n query.sql = 'SELECT * FROM table WHERE ' + query.sql;\n }\n\n var parsed = SQLParser.parse(query.sql);\n\n if (!parsed.where) {\n Utils.error('SQLParse', 'No WHERE clause found');\n }\n\n /**\n * Custom parsing of an AST node generated by SQLParser, you can return a sub-part of the tree, or a well formed group or rule JSON\n * @event changer:parseSQLNode\n * @memberof module:plugins.SqlSupport\n * @param {object} AST node\n * @returns {object} tree, rule or group\n */\n var data = self.change('parseSQLNode', parsed.where.conditions);\n\n // a plugin returned a group\n if ('rules' in data && 'condition' in data) {\n return data;\n }\n\n // a plugin returned a rule\n if ('id' in data && 'operator' in data && 'value' in data) {\n return {\n condition: this.settings.default_condition,\n rules: [data]\n };\n }\n\n // create root group\n var out = self.change('sqlToGroup', {\n condition: this.settings.default_condition,\n rules: []\n }, data);\n\n // keep track of current group\n var curr = out;\n\n (function flatten(data, i) {\n if (data === null) {\n return;\n }\n\n // allow plugins to manually parse or handle special cases\n data = self.change('parseSQLNode', data);\n\n // a plugin returned a group\n if ('rules' in data && 'condition' in data) {\n curr.rules.push(data);\n return;\n }\n\n // a plugin returned a rule\n if ('id' in data && 'operator' in data && 'value' in data) {\n curr.rules.push(data);\n return;\n }\n\n // data must be a SQL parser node\n if (!('left' in data) || !('right' in data) || !('operation' in data)) {\n Utils.error('SQLParse', 'Unable to parse WHERE clause');\n }\n\n // it's a node\n if (['AND', 'OR'].indexOf(data.operation.toUpperCase()) !== -1) {\n // create a sub-group if the condition is not the same and it's not the first level\n\n /**\n * Given an existing group and an AST node, determines if a sub-group must be created\n * @event changer:sqlGroupsDistinct\n * @memberof module:plugins.SqlSupport\n * @param {boolean} create - true by default if the group condition is different\n * @param {object} group\n * @param {object} AST\n * @param {int} current group level\n * @returns {boolean}\n */\n var createGroup = self.change('sqlGroupsDistinct', i > 0 && curr.condition != data.operation.toUpperCase(), curr, data, i);\n\n if (createGroup) {\n /**\n * Modifies the group generated from the SQL expression (this is called before the group is filled with rules)\n * @event changer:sqlToGroup\n * @memberof module:plugins.SqlSupport\n * @param {object} group\n * @param {object} AST\n * @returns {object}\n */\n var group = self.change('sqlToGroup', {\n condition: self.settings.default_condition,\n rules: []\n }, data);\n\n curr.rules.push(group);\n curr = group;\n }\n\n curr.condition = data.operation.toUpperCase();\n i++;\n\n // some magic !\n var next = curr;\n flatten(data.left, i);\n\n curr = next;\n flatten(data.right, i);\n }\n // it's a leaf\n else {\n if ($.isPlainObject(data.right.value)) {\n Utils.error('SQLParse', 'Value format not supported for {0}.', data.left.value);\n }\n\n // convert array\n var value;\n if ($.isArray(data.right.value)) {\n value = data.right.value.map(function(v) {\n return v.value;\n });\n }\n else {\n value = data.right.value;\n }\n\n // get actual values\n if (stmt) {\n if ($.isArray(value)) {\n value = value.map(stmt.parse);\n }\n else {\n value = stmt.parse(value);\n }\n }\n\n // convert operator\n var operator = data.operation.toUpperCase();\n if (operator == '<>') {\n operator = '!=';\n }\n\n var sqlrl = self.settings.sqlRuleOperator[operator];\n if (sqlrl === undefined) {\n Utils.error('UndefinedSQLOperator', 'Invalid SQL operation \"{0}\".', data.operation);\n }\n\n var opVal = sqlrl.call(this, value, data.operation);\n\n // find field name\n var field;\n if ('values' in data.left) {\n field = data.left.values.join('.');\n }\n else if ('value' in data.left) {\n field = data.left.value;\n }\n else {\n Utils.error('SQLParse', 'Cannot find field name in {0}', JSON.stringify(data.left));\n }\n\n // unescape chars declared by the operator\n var finalValue = opVal.val;\n var sql = self.settings.sqlOperators[opVal.op];\n if (!stmt && sql && sql.escape) {\n var searchChars = sql.escape.split('').map(function(c) {\n return '\\\\\\\\' + c;\n }).join('|');\n finalValue = finalValue\n .replace(new RegExp('(' + searchChars + ')', 'g'), function(s) {\n return s[1];\n });\n }\n\n var id = self.getSQLFieldID(field, value);\n\n /**\n * Modifies the rule generated from the SQL expression\n * @event changer:sqlToRule\n * @memberof module:plugins.SqlSupport\n * @param {object} rule\n * @param {object} AST\n * @returns {object}\n */\n var rule = self.change('sqlToRule', {\n id: id,\n field: field,\n operator: opVal.op,\n value: finalValue\n }, data);\n\n curr.rules.push(rule);\n }\n }(data, 0));\n\n return out;\n },\n\n /**\n * Sets the builder's rules from a SQL query\n * @see module:plugins.SqlSupport.getRulesFromSQL\n */\n setRulesFromSQL: function(query, stmt) {\n this.setRules(this.getRulesFromSQL(query, stmt));\n },\n\n /**\n * Returns a filter identifier from the SQL field.\n * Automatically use the only one filter with a matching field, fires a changer otherwise.\n * @param {string} field\n * @param {*} value\n * @fires module:plugins.SqlSupport:changer:getSQLFieldID\n * @returns {string}\n * @private\n */\n getSQLFieldID: function(field, value) {\n var matchingFilters = this.filters.filter(function(filter) {\n return filter.field.toLowerCase() === field.toLowerCase();\n });\n\n var id;\n if (matchingFilters.length === 1) {\n id = matchingFilters[0].id;\n }\n else {\n /**\n * Returns a filter identifier from the SQL field\n * @event changer:getSQLFieldID\n * @memberof module:plugins.SqlSupport\n * @param {string} field\n * @param {*} value\n * @returns {string}\n */\n id = this.change('getSQLFieldID', field, value);\n }\n\n return id;\n }\n});\n\n/**\n * Parses the statement configuration\n * @memberof module:plugins.SqlSupport\n * @param {string} stmt\n * @returns {Array} null, mode, option\n * @private\n */\nfunction getStmtConfig(stmt) {\n var config = stmt.match(/(question_mark|numbered|named)(?:\\((.)\\))?/);\n if (!config) config = [null, 'question_mark', undefined];\n return config;\n}\n\n\n/**\n * @class UniqueFilter\n * @memberof module:plugins\n * @description Allows to define some filters as \"unique\": ie which can be used for only one rule, globally or in the same group.\n */\nQueryBuilder.define('unique-filter', function() {\n this.status.used_filters = {};\n\n this.on('afterUpdateRuleFilter', this.updateDisabledFilters);\n this.on('afterDeleteRule', this.updateDisabledFilters);\n this.on('afterCreateRuleFilters', this.applyDisabledFilters);\n this.on('afterReset', this.clearDisabledFilters);\n this.on('afterClear', this.clearDisabledFilters);\n\n // Ensure that the default filter is not already used if unique\n this.on('getDefaultFilter.filter', function(e, model) {\n var self = e.builder;\n\n self.updateDisabledFilters();\n\n if (e.value.id in self.status.used_filters) {\n var found = self.filters.some(function(filter) {\n if (!(filter.id in self.status.used_filters) || self.status.used_filters[filter.id].length > 0 && self.status.used_filters[filter.id].indexOf(model.parent) === -1) {\n e.value = filter;\n return true;\n }\n });\n\n if (!found) {\n Utils.error(false, 'UniqueFilter', 'No more non-unique filters available');\n e.value = undefined;\n }\n }\n });\n});\n\nQueryBuilder.extend(/** @lends module:plugins.UniqueFilter.prototype */ {\n /**\n * Updates the list of used filters\n * @param {$.Event} [e]\n * @private\n */\n updateDisabledFilters: function(e) {\n var self = e ? e.builder : this;\n\n self.status.used_filters = {};\n\n if (!self.model) {\n return;\n }\n\n // get used filters\n (function walk(group) {\n group.each(function(rule) {\n if (rule.filter && rule.filter.unique) {\n if (!self.status.used_filters[rule.filter.id]) {\n self.status.used_filters[rule.filter.id] = [];\n }\n if (rule.filter.unique == 'group') {\n self.status.used_filters[rule.filter.id].push(rule.parent);\n }\n }\n }, function(group) {\n walk(group);\n });\n }(self.model.root));\n\n self.applyDisabledFilters(e);\n },\n\n /**\n * Clear the list of used filters\n * @param {$.Event} [e]\n * @private\n */\n clearDisabledFilters: function(e) {\n var self = e ? e.builder : this;\n\n self.status.used_filters = {};\n\n self.applyDisabledFilters(e);\n },\n\n /**\n * Disabled filters depending on the list of used ones\n * @param {$.Event} [e]\n * @private\n */\n applyDisabledFilters: function(e) {\n var self = e ? e.builder : this;\n\n // re-enable everything\n self.$el.find(QueryBuilder.selectors.filter_container + ' option').prop('disabled', false);\n\n // disable some\n $.each(self.status.used_filters, function(filterId, groups) {\n if (groups.length === 0) {\n self.$el.find(QueryBuilder.selectors.filter_container + ' option[value=\"' + filterId + '\"]:not(:selected)').prop('disabled', true);\n }\n else {\n groups.forEach(function(group) {\n group.each(function(rule) {\n rule.$el.find(QueryBuilder.selectors.filter_container + ' option[value=\"' + filterId + '\"]:not(:selected)').prop('disabled', true);\n });\n });\n }\n });\n\n // update Selectpicker\n if (self.settings.plugins && self.settings.plugins['bt-selectpicker']) {\n self.$el.find(QueryBuilder.selectors.rule_filter).selectpicker('render');\n }\n }\n});\n\n\n/*!\n * jQuery QueryBuilder 2.7.0\n * Locale: English (en)\n * Author: Damien \"Mistic\" Sorel, http://www.strangeplanet.fr\n * Licensed under MIT (https://opensource.org/licenses/MIT)\n */\n\nQueryBuilder.regional['en'] = {\n \"__locale\": \"English (en)\",\n \"__author\": \"Damien \\\"Mistic\\\" Sorel, http://www.strangeplanet.fr\",\n \"add_rule\": \"Add rule\",\n \"add_group\": \"Add group\",\n \"delete_rule\": \"Delete\",\n \"delete_group\": \"Delete\",\n \"conditions\": {\n \"AND\": \"AND\",\n \"OR\": \"OR\"\n },\n \"operators\": {\n \"equal\": \"equal\",\n \"not_equal\": \"not equal\",\n \"in\": \"in\",\n \"not_in\": \"not in\",\n \"less\": \"less\",\n \"less_or_equal\": \"less or equal\",\n \"greater\": \"greater\",\n \"greater_or_equal\": \"greater or equal\",\n \"between\": \"between\",\n \"not_between\": \"not between\",\n \"begins_with\": \"begins with\",\n \"not_begins_with\": \"doesn't begin with\",\n \"contains\": \"contains\",\n \"not_contains\": \"doesn't contain\",\n \"ends_with\": \"ends with\",\n \"not_ends_with\": \"doesn't end with\",\n \"is_empty\": \"is empty\",\n \"is_not_empty\": \"is not empty\",\n \"is_null\": \"is null\",\n \"is_not_null\": \"is not null\"\n },\n \"errors\": {\n \"no_filter\": \"No filter selected\",\n \"empty_group\": \"The group is empty\",\n \"radio_empty\": \"No value selected\",\n \"checkbox_empty\": \"No value selected\",\n \"select_empty\": \"No value selected\",\n \"string_empty\": \"Empty value\",\n \"string_exceed_min_length\": \"Must contain at least {0} characters\",\n \"string_exceed_max_length\": \"Must not contain more than {0} characters\",\n \"string_invalid_format\": \"Invalid format ({0})\",\n \"number_nan\": \"Not a number\",\n \"number_not_integer\": \"Not an integer\",\n \"number_not_double\": \"Not a real number\",\n \"number_exceed_min\": \"Must be greater than {0}\",\n \"number_exceed_max\": \"Must be lower than {0}\",\n \"number_wrong_step\": \"Must be a multiple of {0}\",\n \"number_between_invalid\": \"Invalid values, {0} is greater than {1}\",\n \"datetime_empty\": \"Empty value\",\n \"datetime_invalid\": \"Invalid date format ({0})\",\n \"datetime_exceed_min\": \"Must be after {0}\",\n \"datetime_exceed_max\": \"Must be before {0}\",\n \"datetime_between_invalid\": \"Invalid values, {0} is greater than {1}\",\n \"boolean_not_valid\": \"Not a boolean\",\n \"operator_not_multiple\": \"Operator \\\"{1}\\\" cannot accept multiple values\"\n },\n \"invert\": \"Invert\",\n \"NOT\": \"NOT\"\n};\n\nQueryBuilder.defaults({ lang_code: 'en' });\nreturn QueryBuilder;\n\n}));\n"],"mappings":"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"}