I'm trying to solve a problem for some days but I can't do it.
This code is using Jquery Query Builder and the plugin selectize, to allow me selecting multiple values.
Everything is okay, except that I could't get the values selected in the input. The screen below shows how the graphic interface works:
The JS code follows below:
$(document).ready(() => {
let builder = $('#builder');
const optionsValue = {
request_type: [
{ value: 'request1', label: 'Request 1' },
{ value: 'request2', label: 'Request 2' },
{ value: 'request3', label: 'Request 3' }
],
priority: [
{ value: 'high', label: 'High' },
{ value: 'medium', label: 'Medium' },
{ value: 'low', label: 'Low' }
]
};
const buildOptions = (result) => {
let options = {};
let filters = [];
for (let key in result) {
let values = result[key];
for (let key_value in values) {
let value = values[key_value];
value.optgroup = key;
value.field = values[key_value].id;
value.valueSetter = function(rule, val) {
rule.$el.find('.rule-value-container input')[0].selectize.setValue(eval("[" + val + "]"));
}
value.valueGetter = function(rule) {
return rule.$el.find('.rule-value-container input')[0].selectize.getValue().split(',');
}
value.plugin_config = {
valueField: 'value',
labelField: 'label',
searchField: 'label',
sortField: 'label',
plugins: ['remove_button'],
};
filters.push(value);
}
}
options.allow_empty = { allow_empty: true };
options.filters = filters;
return options;
}
const getData = () => {
return fetch('./request/getdata.php')
.then(response => response.text())
.then(data => {
let result = JSON.parse(data);
let options = buildOptions(result);
builder.queryBuilder(options);
})
.catch(error => {
console.error('Error:', error);
});
}
const clickSelect = () => {
$(document).on('change', '.rules-list li .rule-filter-container select', function() {
let parent = $(this).closest(".rule-container");
let input_text = parent.find(".rule-value-container input");
let selectedValue = $(this).val();
input_text.selectize({
plugins: ["restore_on_backspace", "clear_button", "remove_button"],
delimiter: " - ",
persist: true,
maxItems: null,
valueField: "value",
labelField: "label",
searchField: ["label", "value"],
options: optionsValue[selectedValue],
allowEmptyOption: true,
multiple: true,
input: 'selectize'
});
});
}
const getQueryBuilderData = () => {
$("#qbinfo").on("click", function(){
var rules = builder.queryBuilder('getRules');
console.log(rules);
});
}
getData().then(() => {
clickSelect();
getQueryBuilderData();
});
});
When it executes the method getQueryBuilderData(), the result is this:
The field value in the inputs return empty :(
I believe that the problem is in one of these tow methods:
value.valueSetter = function(rule, val) {
rule.$el.find('.rule-value-container input')[0].selectize.setValue(eval("[" + val + "]"));
}
value.valueGetter = function(rule) {
return rule.$el.find('.rule-value-container input')[0].selectize.getValue().split(',');
}
Because when I use debug, I can't obtain the values from the input, but I am not sure that the problem is here.