Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
54 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
4f5da5d
Merge branch 'ipetrov/query-builder-drag-and-drop-refactor' into ipet…
ivanvpetrov Mar 18, 2025
44f1663
Merge branch '19.1.x' into ipetrov/query-builder-drag-and-drop-refact…
ChronosSF Mar 18, 2025
bda64d5
test(query-builder): add keyboard drag commit and cancel tests
ivanvpetrov Mar 18, 2025
df22f4b
chore(query-builder): removed todo comment
ivanvpetrov Mar 18, 2025
aeee803
Merge branch 'ipetrov/query-builder-drag-and-drop-refactor-remake' in…
ivanvpetrov Mar 18, 2025
38d61b4
fix(query-builder): test commit upon Enter
ivanvpetrov Mar 18, 2025
dda9485
chore(query-builder): actions Trigger GitHub Actions
ivanvpetrov Mar 18, 2025
4802ab0
Merge branch '19.1.x' into ipetrov/query-builder-drag-and-drop-refact…
ivanvpetrov Mar 18, 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
Original file line number Diff line number Diff line change
Expand Up @@ -107,12 +107,12 @@
@extend %filter-tree__expression-item !optional;
}

@include e(expression-item-ghost) {
@include e(expression-item-drop-ghost) {
@extend %filter-tree__expression-item-ghost !optional;
}

@include e(expression-item-drop-ghost) {
@extend %filter-tree__expression-drop-item-ghost !optional;
@include e(expression-item-keyboard-ghost) {
@extend %filter-tree__expression-item-keyboard-ghost !optional;
}

@include e(expression-column) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -480,18 +480,25 @@


%filter-tree__expression-item-ghost {
&.igx-chip__item {
.igx-chip__item {
@include type-style('body-2');

--ig-body-2-text-transform: unset;

padding-inline: rem(32px);

color: color($color: 'gray', $variant: if($theme-variant == 'light', 600, 900));
border: rem(1px) dashed color($color: 'gray', $variant: if($theme-variant == 'light', 600, 300));
background: transparent;
}

color: color($color: 'gray', $variant: if($theme-variant == 'light', 600, 900));
border: rem(1px) dashed color($color: 'gray', $variant: if($theme-variant == 'light', 600, 300));
background: transparent;
}

%filter-tree__expression-item-keyboard-ghost {
.igx-chip__item {
box-shadow: var(--ghost-shadow);
background: var(--ghost-background);
}
}

%filter-tree__expression-column {
padding: 0 rem(8px);
Expand Down

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 All @@ -883,7 +883,8 @@ export class QueryBuilderFunctions {

public static getDropGhost(fixture: ComponentFixture<any>): Element {
var expressionsContainer = QueryBuilderFunctions.getQueryBuilderExpressionsContainer(fixture);
return expressionsContainer.querySelector(`div.${QueryBuilderSelectors.FILTER_TREE_EXPRESSION_ITEM_DROP_GHOST}`);
return expressionsContainer.querySelector(`div.${QueryBuilderSelectors.FILTER_TREE_EXPRESSION_ITEM_DROP_GHOST}`) ??
expressionsContainer.querySelector(`div.${QueryBuilderSelectors.FILTER_TREE_EXPRESSION_ITEM_KEYBOARD_GHOST}`);
}

public static getDropGhostBounds(fixture: ComponentFixture<any>): DOMRect {
Expand All @@ -910,4 +911,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,24 @@

<ng-template #operandTemplate let-expressionItem>
@if (!expressionItem.inEditMode) {
@if(dragService.dropGhostExpression && expressionItem === dragService.dropGhostExpression && dragService.isKeyboardDrag === false){
<div class="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-keyboard-ghost': expressionItem === dragService.dropGhostExpression
}"
(mouseenter)="expressionItem.hovered = true"
(mouseleave)="expressionItem.hovered = false"
(focusin)="onExpressionFocus(expressionItem)"
Expand Down Expand Up @@ -263,6 +273,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 @@ -102,9 +102,19 @@ const DEFAULT_CHIP_FOCUS_DELAY = 50;
],
providers: [
IgxQueryBuilderDragService
]
],
})
export class IgxQueryBuilderTreeComponent implements AfterViewInit, OnDestroy {
/**
* @hidden @internal
*/
public _expressionTree: IExpressionTree;

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

/**
* @hidden @internal
*/
Expand Down Expand Up @@ -288,8 +298,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 @@ -459,7 +472,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 @@ -475,7 +487,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 @@ -1037,7 +1049,6 @@ export class IgxQueryBuilderTreeComponent implements AfterViewInit, OnDestroy {
this._lastFocusedChipIndex = index;
this.focusEditedExpressionChip();
}

/**
* @hidden @internal
*/
Expand Down Expand Up @@ -1139,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 @@ -1175,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 @@ -1315,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 @@ -1547,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
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,7 @@ export const QueryBuilderSelectors = {
FILTER_TREE_EXPRESSION_CONTEXT_MENU: IGX_FILTER_TREE + '__expression-context-menu',
FILTER_TREE_EXPRESSION_ITEM: IGX_FILTER_TREE + '__expression-item',
FILTER_TREE_EXPRESSION_ITEM_DROP_GHOST: IGX_FILTER_TREE + '__expression-item-drop-ghost',
FILTER_TREE_EXPRESSION_ITEM_KEYBOARD_GHOST: IGX_FILTER_TREE + '__expression-item-keyboard-ghost',
FILTER_TREE_EXPRESSION_ITEM_GHOST: IGX_FILTER_TREE + '__expression-item-ghost',
FILTER_TREE_EXPRESSION_SECTION: IGX_FILTER_TREE + '__expression-section',

Expand All @@ -80,10 +81,4 @@ export const QueryBuilderSelectors = {
QUERY_BUILDER_BODY: IGX_QUERY_BUILDER + '__main',
QUERY_BUILDER_HEADER: IGX_QUERY_BUILDER + '__header',
QUERY_BUILDER_TREE: IGX_QUERY_BUILDER + '-tree',

VIABLE_DROP_AREA:
`.${IGX_FILTER_TREE}__expression-item[igxDrop]:not(.${IGX_FILTER_TREE + '__expression-item-drop-ghost'}),` + /*Condition chip*/
`.${IGX_FILTER_TREE}__subquery:has([igxDrop]),` + /*Chip in edit*/
`.${IGX_FILTER_TREE}__buttons > .igx-button[igxDrop]:first-of-type,` + /*Add Condition Button*/
`.${IGX_FILTER_TREE}__expression-context-menu[igxDrop]` /*AND/OR group root*/
}
Loading
Loading