@@ -54,7 +54,6 @@ import { IgxTooltipDirective } from '../directives/tooltip/tooltip.directive';
5454import { IgxTooltipTargetDirective } from '../directives/tooltip/tooltip-target.directive' ;
5555import { IgxQueryBuilderSearchValueTemplateDirective } from './query-builder.directives' ;
5656import { IgxQueryBuilderComponent } from './query-builder.component' ;
57- import { isTree , recreateTree } from '../data-operations/expressions-tree-util' ;
5857
5958const DEFAULT_PIPE_DATE_FORMAT = 'mediumDate' ;
6059const DEFAULT_PIPE_TIME_FORMAT = 'mediumTime' ;
@@ -229,16 +228,13 @@ export class IgxQueryBuilderTreeComponent implements AfterViewInit, OnDestroy {
229228 */
230229 @Input ( )
231230 public set expressionTree ( expressionTree : IExpressionTree ) {
232- if ( JSON . stringify ( expressionTree ) !== JSON . stringify ( this . _expressionTree ) ) {
233- this . _expressionTree = expressionTree ;
234-
235- if ( ! expressionTree ) {
236- this . _selectedEntity = null ;
237- this . _selectedReturnFields = [ ] ;
238- }
239-
240- this . init ( ) ;
231+ this . _expressionTree = expressionTree ;
232+ if ( ! expressionTree ) {
233+ this . _selectedEntity = null ;
234+ this . _selectedReturnFields = [ ] ;
241235 }
236+
237+ this . init ( ) ;
242238 }
243239
244240 /**
@@ -282,10 +278,6 @@ export class IgxQueryBuilderTreeComponent implements AfterViewInit, OnDestroy {
282278
283279 /**
284280 * Event fired as the expression tree is changed.
285- *
286- * ```html
287- * <igx-query-builder (expressionTreeChange)='onExpressionTreeChange()'></igx-query-builder>
288- * ```
289281 */
290282 @Output ( )
291283 public expressionTreeChange = new EventEmitter < IExpressionTree > ( ) ;
@@ -392,6 +384,11 @@ export class IgxQueryBuilderTreeComponent implements AfterViewInit, OnDestroy {
392384 @ViewChildren ( IgxQueryBuilderTreeComponent )
393385 private innerQueries : QueryList < IgxQueryBuilderTreeComponent > ;
394386
387+ /**
388+ * @hidden @internal
389+ */
390+ public innerQueryNewExpressionTree : IExpressionTree ;
391+
395392 /**
396393 * @hidden @internal
397394 */
@@ -470,7 +467,6 @@ export class IgxQueryBuilderTreeComponent implements AfterViewInit, OnDestroy {
470467
471468 private destroy$ = new Subject < any > ( ) ;
472469 private _parentExpression : ExpressionOperandItem ;
473- private _initialExpressionTree : IExpressionTree ;
474470 private _selectedEntity : EntityType ;
475471 private _selectedReturnFields : string | string [ ] ;
476472 private _selectedField : FieldType ;
@@ -543,6 +539,13 @@ export class IgxQueryBuilderTreeComponent implements AfterViewInit, OnDestroy {
543539 this . destroy$ . complete ( ) ;
544540 }
545541
542+ /**
543+ * @hidden @internal
544+ */
545+ public set selectedEntity ( value : string ) {
546+ this . _selectedEntity = this . entities ?. find ( el => el . name === value ) ;
547+ }
548+
546549 /**
547550 * @hidden @internal
548551 */
@@ -588,16 +591,13 @@ export class IgxQueryBuilderTreeComponent implements AfterViewInit, OnDestroy {
588591 this . _selectedEntity . fields = [ ] ;
589592 }
590593 this . fields = this . _entityNewValue ? this . _entityNewValue . fields : [ ] ;
591-
592594 this . _selectedReturnFields = this . _entityNewValue . fields ?. map ( f => f . field ) ;
593595
594596 if ( this . _expressionTree ) {
595- this . _expressionTree . entity = this . _selectedEntity . name ;
596- this . _expressionTree . returnFields = [ ] ;
597- this . _expressionTree . filteringOperands = [ ] ;
598-
599597 this . _editedExpression = null ;
600- this . expressionTreeChange . emit ( this . _expressionTree ) ;
598+ if ( ! this . parentExpression ) {
599+ this . expressionTreeChange . emit ( this . _expressionTree ) ;
600+ }
601601
602602 this . addAndGroup ( ) ;
603603 }
@@ -610,21 +610,21 @@ export class IgxQueryBuilderTreeComponent implements AfterViewInit, OnDestroy {
610610 this . entitySelect . close ( ) ;
611611
612612 this . _entityNewValue = null ;
613+ this . innerQueryNewExpressionTree = null ;
613614 }
614615
615616 /**
616617 * @hidden @internal
617618 */
618619 public set selectedReturnFields ( value : string [ ] ) {
619- const oldValue = this . _selectedReturnFields ;
620-
621- if ( this . _selectedReturnFields !== value && oldValue !== value ) {
620+ if ( this . _selectedReturnFields !== value ) {
622621 this . _selectedReturnFields = value ;
623622
624- if ( this . _expressionTree ) {
623+ if ( this . _expressionTree && ! this . parentExpression ) {
625624 this . _expressionTree . returnFields = value ;
626625 this . expressionTreeChange . emit ( this . _expressionTree ) ;
627626 }
627+
628628 }
629629 }
630630
@@ -749,20 +749,12 @@ export class IgxQueryBuilderTreeComponent implements AfterViewInit, OnDestroy {
749749
750750 const innerQuery = this . innerQueries . filter ( q => q . isInEditMode ( ) ) [ 0 ]
751751 if ( innerQuery && this . selectedField ?. filters ?. condition ( this . selectedCondition ) ?. isNestedQuery ) {
752- if ( ! this . _editedExpression . expression . searchTree && innerQuery . expressionTree ) {
753- this . _editedExpression . expression . searchTree = new FilteringExpressionsTree ( innerQuery . expressionTree . operator ) ;
754- }
755-
756- if ( this . _editedExpression . expression . searchTree ) {
757- this . _editedExpression . expression . searchTree . entity = innerQuery . selectedEntity . name ;
758- this . _editedExpression . expression . searchTree . returnFields = innerQuery . selectedReturnFields ;
759- this . _editedExpression . expression . searchTree . filteringOperands = innerQuery . expressionTree ?. filteringOperands ;
760- this . _editedExpression . expression . searchTree . operator = innerQuery . expressionTree ?. operator ;
761- this . _editedExpression . expression . searchTree . fieldName = innerQuery . expressionTree ?. fieldName ;
762- }
752+ this . _editedExpression . expression . searchTree = this . getExpressionTreeCopy ( innerQuery . expressionTree ) ;
753+ this . _editedExpression . expression . searchTree . returnFields = innerQuery . selectedReturnFields ;
763754 } else {
764755 this . _editedExpression . expression . searchTree = null ;
765756 }
757+ this . innerQueryNewExpressionTree = null ;
766758
767759 if ( this . selectedField . filters . condition ( this . selectedCondition ) ?. isUnary ) {
768760 this . _editedExpression . expression . searchVal = null ;
@@ -773,7 +765,9 @@ export class IgxQueryBuilderTreeComponent implements AfterViewInit, OnDestroy {
773765 }
774766
775767 this . _expressionTree = this . createExpressionTreeFromGroupItem ( this . rootGroup , this . selectedEntity ?. name , this . selectedReturnFields ) ;
776- this . expressionTreeChange . emit ( this . _expressionTree ) ;
768+ if ( ! this . parentExpression ) {
769+ this . expressionTreeChange . emit ( this . _expressionTree ) ;
770+ }
777771 }
778772
779773 /**
@@ -793,11 +787,12 @@ export class IgxQueryBuilderTreeComponent implements AfterViewInit, OnDestroy {
793787 if ( this . innerQueries ) {
794788 const innerQuery = this . innerQueries . filter ( q => q . isInEditMode ( ) ) [ 0 ] ;
795789 if ( innerQuery ) {
796- innerQuery . expressionTree = this . _initialExpressionTree ;
797-
798790 if ( innerQuery . _editedExpression ) {
799791 innerQuery . cancelOperandEdit ( ) ;
800792 }
793+
794+ innerQuery . expressionTree = this . getExpressionTreeCopy ( this . _editedExpression . expression . searchTree ) ;
795+ this . innerQueryNewExpressionTree = null ;
801796 }
802797 }
803798
@@ -817,6 +812,7 @@ export class IgxQueryBuilderTreeComponent implements AfterViewInit, OnDestroy {
817812 */
818813 public operandCanBeCommitted ( ) : boolean {
819814 const innerQuery = this . innerQueries . filter ( q => q . isInEditMode ( ) ) [ 0 ] ;
815+
820816 return this . selectedField && this . selectedCondition &&
821817 (
822818 (
@@ -948,12 +944,6 @@ export class IgxQueryBuilderTreeComponent implements AfterViewInit, OnDestroy {
948944
949945 expressionItem . inEditMode = true ;
950946 this . _editedExpression = expressionItem ;
951- if ( expressionItem . expression . searchTree ) {
952- this . _initialExpressionTree = expressionItem . expression . searchTree ;
953- } else {
954- this . _initialExpressionTree = null ;
955- }
956-
957947 this . cdr . detectChanges ( ) ;
958948
959949 this . entitySelectOverlaySettings . target = this . entitySelect . element ;
@@ -962,12 +952,18 @@ export class IgxQueryBuilderTreeComponent implements AfterViewInit, OnDestroy {
962952 this . returnFieldSelectOverlaySettings . target = this . selectedReturnFieldsCombo . getEditElement ( ) ;
963953 this . returnFieldSelectOverlaySettings . excludeFromOutsideClick = [ this . selectedReturnFieldsCombo . getEditElement ( ) as HTMLElement ] ;
964954 this . returnFieldSelectOverlaySettings . positionStrategy = new AutoPositionStrategy ( ) ;
965- this . fieldSelectOverlaySettings . target = this . fieldSelect . element ;
966- this . fieldSelectOverlaySettings . excludeFromOutsideClick = [ this . fieldSelect . element as HTMLElement ] ;
967- this . fieldSelectOverlaySettings . positionStrategy = new AutoPositionStrategy ( ) ;
968- this . conditionSelectOverlaySettings . target = this . conditionSelect . element ;
969- this . conditionSelectOverlaySettings . excludeFromOutsideClick = [ this . conditionSelect . element as HTMLElement ] ;
970- this . conditionSelectOverlaySettings . positionStrategy = new AutoPositionStrategy ( ) ;
955+
956+ if ( this . fieldSelect ) {
957+ this . fieldSelectOverlaySettings . target = this . fieldSelect . element ;
958+ this . fieldSelectOverlaySettings . excludeFromOutsideClick = [ this . fieldSelect . element as HTMLElement ] ;
959+ this . fieldSelectOverlaySettings . positionStrategy = new AutoPositionStrategy ( ) ;
960+ }
961+ if ( this . conditionSelect ) {
962+ this . conditionSelectOverlaySettings . target = this . conditionSelect . element ;
963+ this . conditionSelectOverlaySettings . excludeFromOutsideClick = [ this . conditionSelect . element as HTMLElement ] ;
964+ this . conditionSelectOverlaySettings . positionStrategy = new AutoPositionStrategy ( ) ;
965+ }
966+
971967
972968 if ( ! this . selectedField ) {
973969 this . fieldSelect . input . nativeElement . focus ( ) ;
@@ -1271,6 +1267,28 @@ export class IgxQueryBuilderTreeComponent implements AfterViewInit, OnDestroy {
12711267 }
12721268 }
12731269
1270+ public getExpressionTreeCopy ( expressionTree : IExpressionTree , shouldAssignInnerQueryExprTree ?: boolean ) : IExpressionTree {
1271+ if ( ! expressionTree ) {
1272+ return null ;
1273+ }
1274+
1275+ const exprTreeCopy =
1276+ {
1277+ filteringOperands : [ ] ,
1278+ operator : expressionTree . operator ,
1279+ fieldName : expressionTree . fieldName ,
1280+ entity : expressionTree . entity ,
1281+ returnFields : expressionTree . returnFields
1282+ } ;
1283+ expressionTree . filteringOperands . forEach ( o => o instanceof FilteringExpressionsTree ? exprTreeCopy . filteringOperands . push ( this . getExpressionTreeCopy ( o ) ) : exprTreeCopy . filteringOperands . push ( o ) ) ;
1284+
1285+ if ( ! this . innerQueryNewExpressionTree && shouldAssignInnerQueryExprTree ) {
1286+ this . innerQueryNewExpressionTree = exprTreeCopy ;
1287+ }
1288+
1289+ return exprTreeCopy ;
1290+ }
1291+
12741292 public onSelectAllClicked ( _event ) {
12751293 if (
12761294 ( this . _selectedReturnFields . length > 0 && this . _selectedReturnFields . length < this . _selectedEntity . fields . length ) ||
@@ -1380,7 +1398,7 @@ export class IgxQueryBuilderTreeComponent implements AfterViewInit, OnDestroy {
13801398 }
13811399
13821400 for ( const expr of expressionTree . filteringOperands ) {
1383- if ( isTree ( expr ) ) {
1401+ if ( expr instanceof FilteringExpressionsTree ) {
13841402 groupItem . children . push ( this . createExpressionGroupItem ( expr , groupItem , expressionTree . entity ) ) ;
13851403 } else {
13861404 const filteringExpr = expr as IFilteringExpression ;
@@ -1389,7 +1407,7 @@ export class IgxQueryBuilderTreeComponent implements AfterViewInit, OnDestroy {
13891407 condition : filteringExpr . condition ,
13901408 conditionName : filteringExpr . condition ?. name || filteringExpr . conditionName ,
13911409 searchVal : filteringExpr . searchVal ,
1392- searchTree : filteringExpr . searchTree , // this.createExpressionGroupItem(filteringExpr.searchTree, groupItem),
1410+ searchTree : filteringExpr . searchTree ,
13931411 ignoreCase : filteringExpr . ignoreCase
13941412 } ;
13951413 const operandItem = new ExpressionOperandItem ( exprCopy , groupItem ) ;
@@ -1506,7 +1524,9 @@ export class IgxQueryBuilderTreeComponent implements AfterViewInit, OnDestroy {
15061524 this . deleteItem ( expressionItem . parent ) ;
15071525 }
15081526
1509- this . expressionTreeChange . emit ( this . _expressionTree ) ;
1527+ if ( ! this . parentExpression ) {
1528+ this . expressionTreeChange . emit ( this . _expressionTree ) ;
1529+ }
15101530 }
15111531
15121532 private createGroup ( operator : FilteringLogic ) {
0 commit comments