Skip to content

Commit add6df6

Browse files
committed
Fix mistic100#405 add allow_empty_value filter property
1 parent 5e3934e commit add6df6

File tree

4 files changed

+79
-33
lines changed

4 files changed

+79
-33
lines changed

examples/index.html

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -180,6 +180,7 @@ <h3>Output</h3>
180180
type: 'string',
181181
optgroup: 'core',
182182
default_value: 'Mistic',
183+
allow_empty_value: true,
183184
size: 30,
184185
unique: true
185186
},

src/data.js

Lines changed: 33 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -41,15 +41,19 @@ QueryBuilder.prototype.validateValueInternal = function(rule, value) {
4141
for (var i = 0; i < operator.nb_inputs; i++) {
4242
switch (filter.input) {
4343
case 'radio':
44-
if (value[i] === undefined) {
45-
result = ['radio_empty'];
44+
if (value[i] === undefined || value[i].length === 0) {
45+
if (!filter.allow_empty_value) {
46+
result = ['radio_empty'];
47+
}
4648
break;
4749
}
4850
break;
4951

5052
case 'checkbox':
5153
if (value[i] === undefined || value[i].length === 0) {
52-
result = ['checkbox_empty'];
54+
if (!filter.allow_empty_value) {
55+
result = ['checkbox_empty'];
56+
}
5357
break;
5458
}
5559
else if (!operator.multiple && value[i].length > 1) {
@@ -59,29 +63,25 @@ QueryBuilder.prototype.validateValueInternal = function(rule, value) {
5963
break;
6064

6165
case 'select':
62-
if (filter.multiple) {
63-
if (value[i] === undefined || value[i].length === 0 || (filter.placeholder && value[i] == filter.placeholder_value)) {
66+
if (value[i] === undefined || value[i].length === 0 || (filter.placeholder && value[i] == filter.placeholder_value)) {
67+
if (!filter.allow_empty_value) {
6468
result = ['select_empty'];
65-
break;
66-
}
67-
else if (!operator.multiple && value[i].length > 1) {
68-
result = ['operator_not_multiple', operator.type];
69-
break;
7069
}
70+
break;
7171
}
72-
else {
73-
if (value[i] === undefined || (filter.placeholder && value[i] == filter.placeholder_value)) {
74-
result = ['select_empty'];
75-
break;
76-
}
72+
if (filter.multiple && !operator.multiple && value[i].length > 1) {
73+
result = ['operator_not_multiple', operator.type];
74+
break;
7775
}
7876
break;
7977

8078
default:
8179
switch (QueryBuilder.types[filter.type]) {
8280
case 'string':
8381
if (value[i] === undefined || value[i].length === 0) {
84-
result = ['string_empty'];
82+
if (!filter.allow_empty_value) {
83+
result = ['string_empty'];
84+
}
8585
break;
8686
}
8787
if (validation.min !== undefined) {
@@ -108,7 +108,13 @@ QueryBuilder.prototype.validateValueInternal = function(rule, value) {
108108
break;
109109

110110
case 'number':
111-
if (value[i] === undefined || isNaN(value[i])) {
111+
if (value[i] === undefined || value[i].length === 0) {
112+
if (!filter.allow_empty_value) {
113+
result = ['number_nan'];
114+
}
115+
break;
116+
}
117+
if (isNaN(value[i])) {
112118
result = ['number_nan'];
113119
break;
114120
}
@@ -147,7 +153,9 @@ QueryBuilder.prototype.validateValueInternal = function(rule, value) {
147153

148154
case 'datetime':
149155
if (value[i] === undefined || value[i].length === 0) {
150-
result = ['datetime_empty'];
156+
if (!filter.allow_empty_value) {
157+
result = ['datetime_empty'];
158+
}
151159
break;
152160
}
153161

@@ -180,7 +188,13 @@ QueryBuilder.prototype.validateValueInternal = function(rule, value) {
180188
break;
181189

182190
case 'boolean':
183-
tmp = value[i].trim().toLowerCase();
191+
if (value[i] === undefined || value[i].length === 0) {
192+
if (!filter.allow_empty_value) {
193+
result = ['boolean_not_valid'];
194+
}
195+
break;
196+
}
197+
tmp = ('' + value[i]).trim().toLowerCase();
184198
if (tmp !== 'true' && tmp !== 'false' && tmp !== '1' && tmp !== '0' && value[i] !== 1 && value[i] !== 0) {
185199
result = ['boolean_not_valid'];
186200
break;

src/public.js

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -249,10 +249,8 @@ QueryBuilder.prototype.setRules = function(data, options) {
249249
data.condition = self.settings.default_condition;
250250
}
251251
else if (self.settings.conditions.indexOf(data.condition) == -1) {
252-
if (options.allow_invalid) {
253-
data.condition = self.settings.default_condition;
254-
}
255252
Utils.error(!options.allow_invalid, 'UndefinedCondition', 'Invalid condition "{0}"', data.condition);
253+
data.condition = self.settings.default_condition;
256254
}
257255

258256
group.condition = data.condition;
@@ -262,10 +260,8 @@ QueryBuilder.prototype.setRules = function(data, options) {
262260

263261
if (item.rules !== undefined) {
264262
if (self.settings.allow_groups !== -1 && self.settings.allow_groups < group.level) {
265-
if (!options.allow_invalid) {
266-
self.reset();
267-
}
268263
Utils.error(!options.allow_invalid, 'RulesParse', 'No more than {0} groups are allowed', self.settings.allow_groups);
264+
self.reset();
269265
}
270266
else {
271267
model = self.addGroup(group, false, item.data, self.parseGroupFlags(item));
@@ -279,10 +275,8 @@ QueryBuilder.prototype.setRules = function(data, options) {
279275
else {
280276
if (!item.empty) {
281277
if (item.id === undefined) {
282-
if (options.allow_invalid) {
283-
item.empty = true;
284-
}
285278
Utils.error(!options.allow_invalid, 'RulesParse', 'Missing rule field id');
279+
item.empty = true;
286280
}
287281
if (item.operator === undefined) {
288282
item.operator = 'equal';

tests/data.module.js

Lines changed: 42 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -155,11 +155,6 @@ $(function(){
155155
/number_not_integer/
156156
);
157157

158-
assert.validationError($b,
159-
{ id: 'double', value: 'abc' },
160-
/number_not_double/
161-
);
162-
163158
assert.validationError($b,
164159
{ id: 'integer', value: -15 },
165160
/number_exceed_min/
@@ -431,6 +426,27 @@ $(function(){
431426
);
432427
});
433428

429+
/**
430+
* Test allow_empty_value option
431+
*/
432+
QUnit.test('allow empty value', function(assert) {
433+
var filters = $.extend(true, [], basic_filters);
434+
filters.forEach(function(filter) {
435+
filter.allow_empty_value = true;
436+
});
437+
438+
$b.queryBuilder({
439+
filters: filters,
440+
rules: empty_rules
441+
});
442+
443+
assert.rulesMatch(
444+
$b.queryBuilder('getRules'),
445+
empty_rules,
446+
'Should allow empty value for all filters'
447+
);
448+
});
449+
434450

435451
var validation_filters = [{
436452
id: 'radio',
@@ -502,4 +518,25 @@ $(function(){
502518
}
503519
}
504520
}];
521+
522+
var empty_rules = {
523+
condition: 'AND',
524+
rules: [{
525+
id: 'name',
526+
operator: 'equal',
527+
value: ''
528+
}, {
529+
id: 'category',
530+
operator: 'equal',
531+
value: []
532+
}, {
533+
id: 'in_stock',
534+
operator: 'equal',
535+
value: undefined
536+
}, {
537+
id: 'price',
538+
operator: 'equal',
539+
value: ''
540+
}]
541+
};
505542
});

0 commit comments

Comments
 (0)