Skip to content
Closed
Show file tree
Hide file tree
Changes from 28 commits
Commits
Show all changes
46 commits
Select commit Hold shift + click to select a range
1746f32
refactor(query-builder): drag and drop without DOM manipulations
ivanvpetrov Mar 6, 2025
75c9dc1
test(query-builder): fix failing keyboard test
ivanvpetrov Mar 6, 2025
7d5f618
fix(query-builder): test improved drag ghost siblings
ivanvpetrov Mar 7, 2025
b641658
fix(query-builder): test mouse drag test
ivanvpetrov Mar 7, 2025
b3d2efc
fix(query-builder): test all passing now
ivanvpetrov Mar 7, 2025
2779468
fix(query-builder): circular reference
ivanvpetrov Mar 7, 2025
c6e564d
fix(query-builder): test mosue drag now passing
ivanvpetrov Mar 10, 2025
5df2da4
test(query-builder): exclude disconnecting test
ivanvpetrov Mar 11, 2025
97ee8e4
test(query-builder): exclude disconnecting test
ivanvpetrov Mar 11, 2025
dfcbe55
test(query-builder): exclude disconnecting test
ivanvpetrov Mar 11, 2025
cbc5d89
test(query-builder): exclude disconnecting test
ivanvpetrov Mar 11, 2025
62fc540
test(query-builder): exclude disconnecting test
ivanvpetrov Mar 11, 2025
35a5c42
test(query-builder): exclude disconnecting test
ivanvpetrov Mar 11, 2025
c3f73a0
test(query-builder): exclude disconnecting test
ivanvpetrov Mar 11, 2025
9f4005c
test(query-builder): exclude disconnecting test
ivanvpetrov Mar 11, 2025
4dd7da4
test(query-builder): exclude disconnecting test
ivanvpetrov Mar 11, 2025
89101c4
test(query-builder): exclude disconnecting test
ivanvpetrov Mar 11, 2025
522acba
test(query-builder): exclude disconnecting test
ivanvpetrov Mar 11, 2025
57814b8
test(query-builder): exclude disconnecting test
ivanvpetrov Mar 11, 2025
ac55f29
test(query-builder): exclude disconnecting test
ivanvpetrov Mar 11, 2025
cf99cb1
test(query-builder): exclude disconnecting test
ivanvpetrov Mar 11, 2025
4bb68b2
test(query-builder): exclude disconnecting test
ivanvpetrov Mar 11, 2025
78e22e6
test(query-builder): exclude disconnecting test
ivanvpetrov Mar 11, 2025
bf1fa3e
test(query-builder): exclude disconnecting test
ivanvpetrov Mar 11, 2025
f377ca0
test(query-builder): exclude disconnecting test
ivanvpetrov Mar 11, 2025
440c280
test(query-builder): exclude disconnecting test
ivanvpetrov Mar 11, 2025
526413d
test(query-builder): exclude disconnecting test
ivanvpetrov Mar 11, 2025
049a1bd
test(query-builder): exclude disconnecting test
ivanvpetrov Mar 11, 2025
bc8240a
test(query-builder): exclude disconnecting test
ivanvpetrov Mar 11, 2025
9c0a920
test(query-builder): exclude disconnecting test
ivanvpetrov Mar 11, 2025
220d05b
chore(query-builder): constant no longer in use
ivanvpetrov Mar 11, 2025
74e4eb7
refactor(query-builder): class for mouse drag placeholder class
ivanvpetrov Mar 12, 2025
2174a24
test(query-builder): exclude disconnecting test
ivanvpetrov Mar 12, 2025
eeb2402
test(query-builder): exclude disconnecting test
ivanvpetrov Mar 12, 2025
01c4716
Merge branch '19.1.x' into ipetrov/query-builder-drag-and-drop-refactor
ivanvpetrov Mar 12, 2025
3000304
test(query-builder): exclude disconnecting test
ivanvpetrov Mar 13, 2025
5ec1d0e
fix(query-builder): drag&drop dropped chip highlight bug fixed
ivanvpetrov Mar 13, 2025
a14da94
test(query-builder): exclude disconnecting test
ivanvpetrov Mar 13, 2025
9b10757
fix(query-builder): fix drop placeholder and keyboard ghost element s…
desig9stein Mar 13, 2025
1a0d413
refactor(query-builder): change how drag service is provided
teodosiah Mar 13, 2025
fb827df
fix(query-builder): keyboard ghost element styles shadow based on theme
desig9stein Mar 13, 2025
fecf2d6
chore(query-builder): apply code suggestion
ivanvpetrov Mar 14, 2025
2b715fd
fix(query-builder): test style name fix
ivanvpetrov Mar 14, 2025
1941d1f
fix(query-builder): color of the keyboard drop ghost set
ivanvpetrov Mar 14, 2025
ca2df30
fix(query-builder): Use the shadow variable for the chip
desig9stein Mar 14, 2025
d058289
Merge branch '19.1.x' into ipetrov/query-builder-drag-and-drop-refactor
gedinakova Mar 17, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
Expand Up @@ -865,7 +865,7 @@ export class QueryBuilderFunctions {
}

public static getChipContent(chip: Element): string {
if (chip.checkVisibility()) {
if (chip && chip.checkVisibility()) {
let text: string = '';

Array.from(chip.querySelectorAll('span')).forEach(element => {
Expand Down Expand Up @@ -910,4 +910,27 @@ export class QueryBuilderFunctions {
dragDirective.onPointerUp({ pointerId: 1, pageX: X, pageY: Y });
}
}

public static getDropGhostAndItsSiblings(fixture: ComponentFixture<any>): [Element, string, string, string[]] {
const dropGhost = this.getDropGhost(fixture);
const newChipContents = QueryBuilderFunctions.GetChipsContentAsArray(fixture);
let prevElement: string, nextElement: string;

if (dropGhost) {
if (dropGhost.previousElementSibling?.className &&
dropGhost.previousElementSibling?.className?.indexOf(QueryBuilderSelectors.FILTER_TREE_SUBQUERY) !== -1) {
prevElement = QueryBuilderFunctions.getChipContent(dropGhost.previousElementSibling.previousElementSibling);
} else if (dropGhost.previousElementSibling?.previousElementSibling) {
prevElement = QueryBuilderFunctions.getChipContent(dropGhost.previousElementSibling);
}

nextElement = QueryBuilderFunctions.getChipContent(dropGhost.nextElementSibling?.nextElementSibling);
nextElement ??= QueryBuilderFunctions.getChipContent(dropGhost.nextElementSibling?.nextElementSibling?.nextElementSibling?.nextElementSibling);
}

prevElement ??= null;
nextElement ??= null;

return [dropGhost, prevElement, nextElement, newChipContents];
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -125,14 +125,26 @@

<ng-template #operandTemplate let-expressionItem>
@if (!expressionItem.inEditMode) {
@if(dragService.dropGhostExpression && expressionItem === dragService.dropGhostExpression && dragService.isKeyboardDrag === false){
<!-- TODO style properly -->
<div [ngClass]="'igx-filter-tree__expression-item igx-filter-tree__expression-item-drop-ghost'">
<igx-chip [data]="expressionItem">
{{this.resourceStrings.igx_query_builder_drop_ghost_text}}
</igx-chip>
</div>
}
@else {
<div
#dragRef
igxDrop
(enter)="dragService.onChipEnter(dragRef, expressionItem)"
(over)="dragService.onDivOver(dragRef, expressionItem)"
(leave)="dragService.onChipLeave()"
(dropped)="dragService.onDivDropped(expressionItem)"
class="igx-filter-tree__expression-item"
[ngClass]="{
'igx-filter-tree__expression-item': true,
'igx-filter-tree__expression-item-drop-ghost': expressionItem === dragService.dropGhostExpression
}"
(mouseenter)="expressionItem.hovered = true"
(mouseleave)="expressionItem.hovered = false"
(focusin)="onExpressionFocus(expressionItem)"
Expand Down Expand Up @@ -263,6 +275,7 @@
}
</div>
}
}
<div #editingInputsContainer class="igx-filter-tree__subquery" >
@if (expressionItem.inEditMode) {
<div
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -68,40 +68,50 @@ const DEFAULT_CHIP_FOCUS_DELAY = 50;
templateUrl: './query-builder-tree.component.html',
host: { 'class': 'igx-query-builder-tree' },
imports: [
DatePipe,
FormsModule,
IgxButtonDirective,
IgxCheckboxComponent,
IgxChipComponent,
IgxComboComponent,
IgxComboHeaderDirective,
IgxDatePickerComponent,
IgxDateTimeEditorDirective,
IgxDialogComponent,
IgxDragIgnoreDirective,
IgxDropDirective,
IgxDropDownComponent,
IgxDropDownItemComponent,
IgxDropDownItemNavigationDirective,
IgxFieldFormatterPipe,
IgxIconButtonDirective,
IgxIconComponent,
IgxInputDirective,
IgxInputGroupComponent,
IgxOverlayOutletDirective,
IgxPickerClearComponent,
IgxPickerToggleComponent,
IgxPrefixDirective,
IgxSelectComponent,
IgxSelectItemComponent,
IgxTimePickerComponent,
IgxTooltipDirective,
IgxTooltipTargetDirective,
NgClass,
NgTemplateOutlet
]
DatePipe,
FormsModule,
IgxButtonDirective,
IgxCheckboxComponent,
IgxChipComponent,
IgxComboComponent,
IgxComboHeaderDirective,
IgxDatePickerComponent,
IgxDateTimeEditorDirective,
IgxDialogComponent,
IgxDragIgnoreDirective,
IgxDropDirective,
IgxDropDownComponent,
IgxDropDownItemComponent,
IgxDropDownItemNavigationDirective,
IgxFieldFormatterPipe,
IgxIconButtonDirective,
IgxIconComponent,
IgxInputDirective,
IgxInputGroupComponent,
IgxOverlayOutletDirective,
IgxPickerClearComponent,
IgxPickerToggleComponent,
IgxPrefixDirective,
IgxSelectComponent,
IgxSelectItemComponent,
IgxTimePickerComponent,
IgxTooltipDirective,
IgxTooltipTargetDirective,
NgClass,
NgTemplateOutlet
]
})
export class IgxQueryBuilderTreeComponent implements AfterViewInit, OnDestroy {
/**
* @hidden @internal
*/
public _expressionTree: IExpressionTree;

/**
* @hidden @internal
*/
public _expressionTreeCopy: IExpressionTree;

/**
* @hidden @internal
*/
Expand Down Expand Up @@ -285,8 +295,11 @@ export class IgxQueryBuilderTreeComponent implements AfterViewInit, OnDestroy {
@ViewChild('groupContextMenuDropDown', { read: IgxDropDownComponent })
private groupContextMenuDropDown: IgxDropDownComponent;

/**
* @hidden @internal
*/
@ViewChildren(IgxChipComponent, { read: IgxChipComponent })
private expressionsChips: QueryList<IgxChipComponent>;
public expressionsChips: QueryList<IgxChipComponent>;

@ViewChild('editingInputsContainer', { read: ElementRef })
protected set editingInputsContainer(value: ElementRef) {
Expand Down Expand Up @@ -456,7 +469,6 @@ export class IgxQueryBuilderTreeComponent implements AfterViewInit, OnDestroy {
private _prevFocusedContainer: ElementRef;
private _expandedExpressions: IFilteringExpression[] = [];
private _fields: FieldType[];
private _expressionTree: IExpressionTree;
private _locale;
private _entityNewValue: EntityType;
private _resourceStrings = getCurrentResourceStrings(QueryBuilderResourceStringsEN);
Expand All @@ -472,7 +484,7 @@ export class IgxQueryBuilderTreeComponent implements AfterViewInit, OnDestroy {
/**
* Returns if the fields combo at the root level is disabled.
*/
public get disableReturnFieldsChange(): boolean {
public get disableReturnFieldsChange(): boolean {

return !this.selectedEntity || this.queryBuilder.disableReturnFieldsChange;
}
Expand Down Expand Up @@ -1031,7 +1043,11 @@ export class IgxQueryBuilderTreeComponent implements AfterViewInit, OnDestroy {
/**
* @hidden @internal
*/
public dragService: IgxQueryBuilderDragService = new IgxQueryBuilderDragService(this, this.el, this.deleteItem, this.focusChipAfterDrag);
public dragService: IgxQueryBuilderDragService = new IgxQueryBuilderDragService(
this,
this.el,
this.deleteItem,
this.focusChipAfterDrag);

/**
* @hidden @internal
Expand Down Expand Up @@ -1134,8 +1150,8 @@ export class IgxQueryBuilderTreeComponent implements AfterViewInit, OnDestroy {
expressionItem.expression.condition.name :
null;
this.searchValue.value = expressionItem.expression.searchVal instanceof Set ?
Array.from(expressionItem.expression.searchVal) :
expressionItem.expression.searchVal;
Array.from(expressionItem.expression.searchVal) :
expressionItem.expression.searchVal;

expressionItem.inEditMode = true;
this._editedExpression = expressionItem;
Expand Down Expand Up @@ -1170,7 +1186,7 @@ export class IgxQueryBuilderTreeComponent implements AfterViewInit, OnDestroy {
input?.focus();
}

(this.editingInputs?.nativeElement.parentElement as HTMLElement)?.scrollIntoView({block: "nearest", inline: "nearest"});
(this.editingInputs?.nativeElement.parentElement as HTMLElement)?.scrollIntoView({ block: "nearest", inline: "nearest" });
}

/**
Expand Down Expand Up @@ -1310,7 +1326,7 @@ export class IgxQueryBuilderTreeComponent implements AfterViewInit, OnDestroy {
* @hidden @internal
*/
public invokeClick(eventArgs: KeyboardEvent) {
if (!this.dragService.dropGhostChipNode && this.platform.isActivationKey(eventArgs)) {
if (!this.dragService.dropGhostExpression && this.platform.isActivationKey(eventArgs)) {
eventArgs.preventDefault();
(eventArgs.currentTarget as HTMLElement).click();
}
Expand Down Expand Up @@ -1542,7 +1558,7 @@ export class IgxQueryBuilderTreeComponent implements AfterViewInit, OnDestroy {
return groupItem;
}

for (let i = 0 ; i < expressionTree.filteringOperands.length; i++) {
for (let i = 0; i < expressionTree.filteringOperands.length; i++) {
const expr = expressionTree.filteringOperands[i];

if (isTree(expr)) {
Expand Down
Loading