@@ -72,9 +72,15 @@ QueryBuilder.prototype.getModel = function(target) {
7272
7373/**
7474 * Validate the whole builder
75+ * @param {object } options
76+ * - skip_empty: false[default] | true(skips validating rules that have no filter selected)
7577 * @return {boolean }
7678 */
77- QueryBuilder . prototype . validate = function ( ) {
79+ QueryBuilder . prototype . validate = function ( options ) {
80+ options = $ . extend ( {
81+ skip_empty : false
82+ } , options ) ;
83+
7884 this . clearErrors ( ) ;
7985
8086 var self = this ;
@@ -84,6 +90,10 @@ QueryBuilder.prototype.validate = function() {
8490 var errors = 0 ;
8591
8692 group . each ( function ( rule ) {
93+ if ( ! rule . filter && options . skip_empty ) {
94+ return ;
95+ }
96+
8797 if ( ! rule . filter ) {
8898 self . triggerValidationError ( rule , 'no_filter' , null ) ;
8999 errors ++ ;
@@ -109,17 +119,21 @@ QueryBuilder.prototype.validate = function() {
109119 done ++ ;
110120
111121 } , function ( group ) {
112- if ( parse ( group ) ) {
122+ var res = parse ( group ) ;
123+ if ( res === true ) {
113124 done ++ ;
114125 }
115- else {
126+ else if ( res === false ) {
116127 errors ++ ;
117128 }
118129 } ) ;
119130
120131 if ( errors > 0 ) {
121132 return false ;
122133 }
134+ else if ( done === 0 && ! group . isRoot ( ) && options . skip_empty ) {
135+ return null ;
136+ }
123137 else if ( done === 0 && ( ! self . settings . allow_empty || ! group . isRoot ( ) ) ) {
124138 self . triggerValidationError ( group , 'empty_group' , null ) ;
125139 return false ;
@@ -137,15 +151,17 @@ QueryBuilder.prototype.validate = function() {
137151 * @param {object } options
138152 * - get_flags: false[default] | true(only changes from default flags) | 'all'
139153 * - allow_invalid: false[default] | true(returns rules even if they are invalid)
154+ * - skip_empty: false[default] | true(remove rules that have no filter selected)
140155 * @return {object }
141156 */
142157QueryBuilder . prototype . getRules = function ( options ) {
143158 options = $ . extend ( {
144159 get_flags : false ,
145- allow_invalid : false
160+ allow_invalid : false ,
161+ skip_empty : false
146162 } , options ) ;
147163
148- var valid = this . validate ( ) ;
164+ var valid = this . validate ( options ) ;
149165 if ( ! valid && ! options . allow_invalid ) {
150166 return null ;
151167 }
@@ -170,6 +186,10 @@ QueryBuilder.prototype.getRules = function(options) {
170186 }
171187
172188 group . each ( function ( rule ) {
189+ if ( ! rule . filter && options . skip_empty ) {
190+ return ;
191+ }
192+
173193 var value = null ;
174194 if ( ! rule . operator || rule . operator . nb_inputs !== 0 ) {
175195 value = rule . value ;
@@ -198,7 +218,10 @@ QueryBuilder.prototype.getRules = function(options) {
198218 groupData . rules . push ( self . change ( 'ruleToJson' , ruleData , rule ) ) ;
199219
200220 } , function ( model ) {
201- groupData . rules . push ( parse ( model ) ) ;
221+ var data = parse ( model ) ;
222+ if ( data . rules . length !== 0 || ! options . skip_empty ) {
223+ groupData . rules . push ( data ) ;
224+ }
202225 } , this ) ;
203226
204227 return self . change ( 'groupToJson' , groupData , group ) ;
0 commit comments