Skip to content

Commit f930e1d

Browse files
committed
Merge branch 'dmdimitrov/query-builder-improvements' of https://github.com/IgniteUI/igniteui-angular into dmdimitrov/query-builder-improvements
2 parents 8cfeb42 + 9c5729e commit f930e1d

22 files changed

+125
-12
lines changed

projects/igniteui-angular-i18n/src/i18n/BG/query-builder-resources.ts

+1
Original file line numberDiff line numberDiff line change
@@ -76,4 +76,5 @@ export const QueryBuilderResourceStringsBG = {
7676
igx_query_builder_dialog_checkbox_text: 'Не показвай този диалогов прозорец отново',
7777
igx_query_builder_dialog_cancel: 'Отказ',
7878
igx_query_builder_dialog_confirm: 'Потвърди',
79+
igx_query_builder_drop_ghost_text: 'Drop here to insert'
7980
} satisfies MakeRequired<IQueryBuilderResourceStrings>;

projects/igniteui-angular-i18n/src/i18n/CS/query-builder-resources.ts

+1
Original file line numberDiff line numberDiff line change
@@ -76,4 +76,5 @@ export const QueryBuilderResourceStringsCS = {
7676
igx_query_builder_dialog_checkbox_text: 'Tento dialog již příště nezobrazovat',
7777
igx_query_builder_dialog_cancel: 'Zrušení',
7878
igx_query_builder_dialog_confirm: 'Potvrdit',
79+
igx_query_builder_drop_ghost_text: 'Drop here to insert'
7980
} satisfies MakeRequired<IQueryBuilderResourceStrings>;

projects/igniteui-angular-i18n/src/i18n/DA/query-builder-resources.ts

+1
Original file line numberDiff line numberDiff line change
@@ -76,4 +76,5 @@ export const QueryBuilderResourceStringsDA = {
7676
igx_query_builder_dialog_checkbox_text: 'Vis ikke denne dialogboks igen',
7777
igx_query_builder_dialog_cancel: 'Annuller',
7878
igx_query_builder_dialog_confirm: 'Bekræft',
79+
igx_query_builder_drop_ghost_text: 'Drop here to insert'
7980
} satisfies MakeRequired<IQueryBuilderResourceStrings>;

projects/igniteui-angular-i18n/src/i18n/DE/query-builder-resources.ts

+1
Original file line numberDiff line numberDiff line change
@@ -76,4 +76,5 @@ export const QueryBuilderResourceStringsDE = {
7676
igx_query_builder_dialog_checkbox_text: 'Dieses Dialogfeld nicht mehr anzeigen',
7777
igx_query_builder_dialog_cancel: 'Abbrechen',
7878
igx_query_builder_dialog_confirm: 'Bestätigen',
79+
igx_query_builder_drop_ghost_text: 'Drop here to insert'
7980
} satisfies MakeRequired<IQueryBuilderResourceStrings>;

projects/igniteui-angular-i18n/src/i18n/ES/query-builder-resources.ts

+1
Original file line numberDiff line numberDiff line change
@@ -76,4 +76,5 @@ export const QueryBuilderResourceStringsES = {
7676
igx_query_builder_dialog_checkbox_text: 'No volver a mostrar este cuadro de diálogo',
7777
igx_query_builder_dialog_cancel: 'Cancelar',
7878
igx_query_builder_dialog_confirm: 'Confirmar',
79+
igx_query_builder_drop_ghost_text: 'Drop here to insert'
7980
} satisfies MakeRequired<IQueryBuilderResourceStrings>;

projects/igniteui-angular-i18n/src/i18n/FR/query-builder-resources.ts

+1
Original file line numberDiff line numberDiff line change
@@ -76,4 +76,5 @@ export const QueryBuilderResourceStringsFR = {
7676
igx_query_builder_dialog_checkbox_text: 'Ne plus afficher cette boîte de dialogue',
7777
igx_query_builder_dialog_cancel: 'Annuler',
7878
igx_query_builder_dialog_confirm: 'Confirmer',
79+
igx_query_builder_drop_ghost_text: 'Drop here to insert'
7980
} satisfies MakeRequired<IQueryBuilderResourceStrings>;

projects/igniteui-angular-i18n/src/i18n/HU/query-builder-resources.ts

+1
Original file line numberDiff line numberDiff line change
@@ -76,4 +76,5 @@ export const QueryBuilderResourceStringsHU = {
7676
igx_query_builder_dialog_checkbox_text: 'Ne jelenjen meg többet ez a párbeszédpanel',
7777
igx_query_builder_dialog_cancel: 'Mégse',
7878
igx_query_builder_dialog_confirm: 'Megerősítés',
79+
igx_query_builder_drop_ghost_text: 'Drop here to insert'
7980
} satisfies MakeRequired<IQueryBuilderResourceStrings>;

projects/igniteui-angular-i18n/src/i18n/IT/query-builder-resources.ts

+1
Original file line numberDiff line numberDiff line change
@@ -76,4 +76,5 @@ export const QueryBuilderResourceStringsIT = {
7676
igx_query_builder_dialog_checkbox_text: 'Non visualizzare più questo messaggio',
7777
igx_query_builder_dialog_cancel: 'Annulla',
7878
igx_query_builder_dialog_confirm: 'Conferma',
79+
igx_query_builder_drop_ghost_text: 'Drop here to insert'
7980
} satisfies MakeRequired<IQueryBuilderResourceStrings>;

projects/igniteui-angular-i18n/src/i18n/JA/query-builder-resources.ts

+1
Original file line numberDiff line numberDiff line change
@@ -76,4 +76,5 @@ export const QueryBuilderResourceStringsJA = {
7676
igx_query_builder_dialog_checkbox_text: '今後このダイアログを表示しない',
7777
igx_query_builder_dialog_cancel: 'キャンセル',
7878
igx_query_builder_dialog_confirm: '確認',
79+
igx_query_builder_drop_ghost_text: 'Drop here to insert'
7980
} satisfies MakeRequired<IQueryBuilderResourceStrings>;

projects/igniteui-angular-i18n/src/i18n/KO/query-builder-resources.ts

+1
Original file line numberDiff line numberDiff line change
@@ -76,4 +76,5 @@ export const QueryBuilderResourceStringsKO = {
7676
igx_query_builder_dialog_checkbox_text: '이 대화 상자를 다시 표시하지 않기',
7777
igx_query_builder_dialog_cancel: '취소',
7878
igx_query_builder_dialog_confirm: '확인',
79+
igx_query_builder_drop_ghost_text: 'Drop here to insert'
7980
} satisfies MakeRequired<IQueryBuilderResourceStrings>;

projects/igniteui-angular-i18n/src/i18n/NB/query-builder-resources.ts

+1
Original file line numberDiff line numberDiff line change
@@ -76,4 +76,5 @@ export const QueryBuilderResourceStringsNB = {
7676
igx_query_builder_dialog_checkbox_text: 'Ikke vis denne dialogboksen igjen',
7777
igx_query_builder_dialog_cancel: 'Avbryt',
7878
igx_query_builder_dialog_confirm: 'Bekreft',
79+
igx_query_builder_drop_ghost_text: 'Drop here to insert'
7980
} satisfies MakeRequired<IQueryBuilderResourceStrings>;

projects/igniteui-angular-i18n/src/i18n/NL/query-builder-resources.ts

+1
Original file line numberDiff line numberDiff line change
@@ -76,4 +76,5 @@ export const QueryBuilderResourceStringsNL = {
7676
igx_query_builder_dialog_checkbox_text: 'Deze dialoog niet meer weergeven',
7777
igx_query_builder_dialog_cancel: 'Annuleren',
7878
igx_query_builder_dialog_confirm: 'Bevestigen',
79+
igx_query_builder_drop_ghost_text: 'Drop here to insert'
7980
} satisfies MakeRequired<IQueryBuilderResourceStrings>;

projects/igniteui-angular-i18n/src/i18n/PL/query-builder-resources.ts

+1
Original file line numberDiff line numberDiff line change
@@ -76,4 +76,5 @@ export const QueryBuilderResourceStringsPL = {
7676
igx_query_builder_dialog_checkbox_text: 'Nie pokazuj tego okna dialogowego ponownie',
7777
igx_query_builder_dialog_cancel: 'Anuluj',
7878
igx_query_builder_dialog_confirm: 'Potwierdź',
79+
igx_query_builder_drop_ghost_text: 'Drop here to insert'
7980
} satisfies MakeRequired<IQueryBuilderResourceStrings>;

projects/igniteui-angular-i18n/src/i18n/PT/query-builder-resources.ts

+1
Original file line numberDiff line numberDiff line change
@@ -76,4 +76,5 @@ export const QueryBuilderResourceStringsPT = {
7676
igx_query_builder_dialog_checkbox_text: 'Não voltar a mostrar esta caixa de diálogo',
7777
igx_query_builder_dialog_cancel: 'Cancelar',
7878
igx_query_builder_dialog_confirm: 'Confirmar',
79+
igx_query_builder_drop_ghost_text: 'Drop here to insert'
7980
} satisfies MakeRequired<IQueryBuilderResourceStrings>;

projects/igniteui-angular-i18n/src/i18n/RO/query-builder-resources.ts

+1
Original file line numberDiff line numberDiff line change
@@ -76,4 +76,5 @@ export const QueryBuilderResourceStringsRO = {
7676
igx_query_builder_dialog_checkbox_text: 'Nu se mai afișează această casetă de dialog',
7777
igx_query_builder_dialog_cancel: 'Anulare',
7878
igx_query_builder_dialog_confirm: 'Confirmare',
79+
igx_query_builder_drop_ghost_text: 'Drop here to insert'
7980
} satisfies MakeRequired<IQueryBuilderResourceStrings>;

projects/igniteui-angular-i18n/src/i18n/SV/query-builder-resources.ts

+1
Original file line numberDiff line numberDiff line change
@@ -76,4 +76,5 @@ export const QueryBuilderResourceStringsSV = {
7676
igx_query_builder_dialog_checkbox_text: 'Visa inte den här dialogrutan igen',
7777
igx_query_builder_dialog_cancel: 'Avbryt',
7878
igx_query_builder_dialog_confirm: 'Bekräfta',
79+
igx_query_builder_drop_ghost_text: 'Drop here to insert'
7980
} satisfies MakeRequired<IQueryBuilderResourceStrings>;

projects/igniteui-angular-i18n/src/i18n/TR/query-builder-resources.ts

+1
Original file line numberDiff line numberDiff line change
@@ -76,4 +76,5 @@ export const QueryBuilderResourceStringsTR = {
7676
igx_query_builder_dialog_checkbox_text: 'Bu iletişim kutusunu bir daha gösterme',
7777
igx_query_builder_dialog_cancel: 'İptal',
7878
igx_query_builder_dialog_confirm: 'Onayla',
79+
igx_query_builder_drop_ghost_text: 'Drop here to insert'
7980
} satisfies MakeRequired<IQueryBuilderResourceStrings>;

projects/igniteui-angular-i18n/src/i18n/ZH-HANS/query-builder-resources.ts

+1
Original file line numberDiff line numberDiff line change
@@ -76,4 +76,5 @@ export const QueryBuilderResourceStringsZHHANS = {
7676
igx_query_builder_dialog_checkbox_text: '不再显示此对话框',
7777
igx_query_builder_dialog_cancel: '取消',
7878
igx_query_builder_dialog_confirm: '确认',
79+
igx_query_builder_drop_ghost_text: 'Drop here to insert'
7980
} satisfies MakeRequired<IQueryBuilderResourceStrings>;

projects/igniteui-angular-i18n/src/i18n/ZH-HANT/query-builder-resources.ts

+1
Original file line numberDiff line numberDiff line change
@@ -76,4 +76,5 @@ export const QueryBuilderResourceStringsZHHANT = {
7676
igx_query_builder_dialog_checkbox_text: '不要再顯示這個對話方塊',
7777
igx_query_builder_dialog_cancel: '取消',
7878
igx_query_builder_dialog_confirm: '確認',
79+
igx_query_builder_drop_ghost_text: 'Drop here to insert'
7980
} satisfies MakeRequired<IQueryBuilderResourceStrings>;

projects/igniteui-angular/src/lib/core/i18n/query-builder-resources.ts

+2
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,7 @@ export interface IQueryBuilderResourceStrings {
7171
igx_query_builder_dialog_checkbox_text?: string;
7272
igx_query_builder_dialog_cancel?: string;
7373
igx_query_builder_dialog_confirm?: string;
74+
igx_query_builder_drop_ghost_text?: string;
7475
}
7576

7677
export const QueryBuilderResourceStringsEN: IQueryBuilderResourceStrings = {
@@ -146,4 +147,5 @@ export const QueryBuilderResourceStringsEN: IQueryBuilderResourceStrings = {
146147
igx_query_builder_dialog_checkbox_text: 'Do not show this dialog again',
147148
igx_query_builder_dialog_cancel: 'Cancel',
148149
igx_query_builder_dialog_confirm: 'Confirm',
150+
igx_query_builder_drop_ghost_text: 'Drop here to insert'
149151
};

projects/igniteui-angular/src/lib/query-builder/query-builder-drag.service.ts

+1-2
Original file line numberDiff line numberDiff line change
@@ -240,8 +240,7 @@ export class IgxQueryBuilderDragService {
240240

241241
if (!keyboardMode) {
242242
var span = document.createElement('span')
243-
//TODO Localize string
244-
span.innerHTML = "Drop here to insert";
243+
span.innerHTML = this._queryBuilderTreeComponent.resourceStrings.igx_query_builder_drop_ghost_text;
245244

246245
dragCopy.firstChild.firstChild.removeChild(dragCopy.firstChild.firstChild.childNodes[1]);
247246
dragCopy.firstChild.firstChild.removeChild(dragCopy.firstChild.firstChild.childNodes[1]);

projects/igniteui-angular/src/lib/query-builder/query-builder.component.spec.ts

+103-10
Original file line numberDiff line numberDiff line change
@@ -2380,7 +2380,8 @@ describe('IgxQueryBuilder', () => {
23802380
igx_query_builder_dialog_message: 'My changing entity message',
23812381
igx_query_builder_dialog_checkbox_text: 'My do not show this dialog again',
23822382
igx_query_builder_dialog_cancel: 'My Cancel',
2383-
igx_query_builder_dialog_confirm: 'My Confirm'
2383+
igx_query_builder_dialog_confirm: 'My Confirm',
2384+
igx_query_builder_drop_ghost_text: 'My Drop here to insert'
23842385
});
23852386
fix.detectChanges();
23862387

@@ -2415,6 +2416,18 @@ describe('IgxQueryBuilder', () => {
24152416
expect(dialogOutlet.querySelector('.igx-query-builder-dialog').children[1].textContent.trim()).toBe('My do not show this dialog again');
24162417
expect(dialogOutlet.querySelector('.igx-dialog__window-actions').children[0].textContent.trim()).toBe('My Cancel');
24172418
expect(dialogOutlet.querySelector('.igx-dialog__window-actions').children[1].textContent.trim()).toBe('My Confirm');
2419+
2420+
//Drag ghost text check
2421+
queryBuilder.expressionTree = QueryBuilderFunctions.generateExpressionTree();
2422+
fix.detectChanges();
2423+
tick(100);
2424+
fix.detectChanges();
2425+
const draggedChip = fix.debugElement.queryAll(By.directive(IgxChipComponent))[3].componentInstance;
2426+
UIInteractions.moveDragDirective(fix, draggedChip.dragDirective, 10, 10, false);
2427+
const dropGhost = QueryBuilderFunctions.getDropGhost(fix) as HTMLElement;
2428+
expect(draggedChip.dragDirective.ghostElement).toBeTruthy();
2429+
expect(dropGhost).toBeDefined();
2430+
expect(dropGhost.innerText).toBe('My Drop here to insert');
24182431
}));
24192432
});
24202433

@@ -2917,64 +2930,144 @@ describe('IgxQueryBuilder', () => {
29172930
expect(QueryBuilderFunctions.getChipContent(newGroupConditions[0])).toBe("OrderDate Today");
29182931
});
29192932

2920-
it('should render drop ghost properly when keyboard dragged.', async () => {
2933+
it('should render drop ghost properly when keyboard dragged.', () => {
29212934
const draggedIndicator = fix.debugElement.queryAll(By.css('.igx-drag-indicator'))[1];
29222935
const tree = fix.debugElement.query(By.css('.igx-filter-tree'));
2923-
let keyPress = new KeyboardEvent('keydown', { code: 'ArrowDown' });
29242936

29252937
draggedIndicator.triggerEventHandler('focus', {});
29262938
draggedIndicator.nativeElement.focus();
29272939

29282940
spyOn(tree.nativeElement, 'dispatchEvent').and.callThrough();
29292941
const dropGhostContent = QueryBuilderFunctions.GetChipsContentAsArray(fix)[1];
29302942

2943+
//pass 1 down to bottom
2944+
let keyPress = new KeyboardEvent('keydown', { code: 'ArrowDown' });
29312945
for (let i = 0; i <= 5; i++) {
29322946
tree.nativeElement.dispatchEvent(keyPress);
2933-
await wait();
2947+
wait();
29342948
fix.detectChanges();
29352949

2950+
const dropGhost = QueryBuilderFunctions.getDropGhost(fix);
2951+
const prevElement = dropGhost && dropGhost.previousElementSibling ? QueryBuilderFunctions.getChipContent(dropGhost.previousElementSibling) : null;
2952+
const nextElement = dropGhost && dropGhost.nextElementSibling ? QueryBuilderFunctions.getChipContent(dropGhost.nextElementSibling) : null;
29362953
const newChipContents = QueryBuilderFunctions.GetChipsContentAsArray(fix);
29372954

29382955
switch (true) {
29392956
case i === 0:
2957+
expect(dropGhost).toBeDefined();
2958+
expect(prevElement).toBeNull();
2959+
expect(nextElement).toEqual("OrderName Ends With a");
29402960
expect(newChipContents[4]).toBe(dropGhostContent);
29412961
break;
29422962
case i === 1:
2963+
expect(dropGhost).toBeDefined();
2964+
expect(prevElement).toEqual("OrderName Ends With a");
2965+
expect(nextElement).toBeUndefined();
29432966
expect(newChipContents[5]).toBe(dropGhostContent);
29442967
break;
2945-
case i >= 2:
2968+
case i === 2:
2969+
expect(dropGhost).toBeDefined();
2970+
expect(prevElement).toEqual("OrderDate Today");
2971+
expect(nextElement).toBeUndefined();
2972+
expect(newChipContents[6]).toBe(dropGhostContent);
2973+
break;
2974+
case i >= 3:
2975+
expect(dropGhost).toBeDefined();
2976+
expect(prevElement).toEqual("or OrderName Ends With a OrderDate Today");
2977+
expect(nextElement).toBeNull();
29462978
expect(newChipContents[6]).toBe(dropGhostContent);
29472979
break;
29482980
}
29492981
}
29502982

2983+
//pass 2 up to top
29512984
keyPress = new KeyboardEvent('keydown', { code: 'ArrowUp' });
2952-
29532985
for (let i = 0; i <= 10; i++) {
29542986
tree.nativeElement.dispatchEvent(keyPress);
2955-
await wait();
2987+
wait();
29562988
fix.detectChanges();
29572989

2990+
const dropGhost = QueryBuilderFunctions.getDropGhost(fix);
2991+
const prevElement = dropGhost && dropGhost.previousElementSibling ? QueryBuilderFunctions.getChipContent(dropGhost.previousElementSibling) : null;
2992+
const nextElement = dropGhost && dropGhost.nextElementSibling ? QueryBuilderFunctions.getChipContent(dropGhost.nextElementSibling) : null;
29582993
const newChipContents = QueryBuilderFunctions.GetChipsContentAsArray(fix);
29592994

29602995
switch (true) {
29612996
case i === 0:
2997+
expect(dropGhost).toBeDefined();
2998+
expect(prevElement).toEqual("OrderDate Today");
2999+
expect(nextElement).toBeUndefined();
29623000
expect(newChipContents[6]).toBe(dropGhostContent);
29633001
break;
29643002
case i === 1:
3003+
expect(dropGhost).toBeDefined();
3004+
expect(prevElement).toBeUndefined();
3005+
expect(nextElement).toEqual("OrderDate Today");
29653006
expect(newChipContents[5]).toBe(dropGhostContent);
29663007
break;
29673008
case i === 2:
3009+
expect(dropGhost).toBeDefined();
3010+
expect(prevElement).toBeNull();
3011+
expect(nextElement).toEqual("OrderName Ends With a");
29683012
expect(newChipContents[4]).toBe(dropGhostContent);
29693013
break;
29703014
case i === 3:
3015+
expect(dropGhost).toBeDefined();
3016+
expect(prevElement).toBeUndefined();
3017+
expect(nextElement).toEqual("or OrderName Ends With a OrderDate Today");
29713018
expect(newChipContents[4]).toBe(dropGhostContent);
29723019
break;
2973-
case i === 4:
3020+
case i >= 4:
3021+
expect(dropGhost).toBeDefined();
3022+
expect(prevElement).toBeNull();
3023+
expect(nextElement).toEqual("OrderName Equals foo");
29743024
expect(newChipContents[0]).toBe(dropGhostContent);
29753025
break;
2976-
case i >= 5:
2977-
expect(newChipContents[0]).toBe(dropGhostContent);
3026+
}
3027+
}
3028+
3029+
//pass 3 down to bottom again
3030+
keyPress = new KeyboardEvent('keydown', { code: 'ArrowDown' });
3031+
for (let i = 0; i <= 10; i++) {
3032+
tree.nativeElement.dispatchEvent(keyPress);
3033+
wait();
3034+
fix.detectChanges();
3035+
3036+
const dropGhost = QueryBuilderFunctions.getDropGhost(fix);
3037+
const prevElement = dropGhost && dropGhost.previousElementSibling ? QueryBuilderFunctions.getChipContent(dropGhost.previousElementSibling) : null;
3038+
const nextElement = dropGhost && dropGhost.nextElementSibling ? QueryBuilderFunctions.getChipContent(dropGhost.nextElementSibling) : null;
3039+
const newChipContents = QueryBuilderFunctions.GetChipsContentAsArray(fix);
3040+
3041+
switch (true) {
3042+
case i === 0:
3043+
expect(dropGhost).toBeDefined();
3044+
expect(prevElement).toEqual("OrderName Equals foo");
3045+
expect(nextElement).toBeUndefined();
3046+
expect(newChipContents[1]).toBe(dropGhostContent);
3047+
break;
3048+
case i === 1:
3049+
expect(dropGhost).toBeDefined();
3050+
expect(prevElement).toBeNull();
3051+
expect(nextElement).toEqual("OrderName Ends With a");
3052+
expect(newChipContents[4]).toBe(dropGhostContent);
3053+
break;
3054+
case i === 2:
3055+
expect(dropGhost).toBeDefined();
3056+
expect(prevElement).toEqual("OrderName Ends With a");
3057+
expect(nextElement).toBeUndefined();
3058+
expect(newChipContents[5]).toBe(dropGhostContent);
3059+
break;
3060+
case i === 3:
3061+
expect(dropGhost).toBeDefined();
3062+
expect(prevElement).toEqual("OrderDate Today");
3063+
expect(nextElement).toBeUndefined();
3064+
expect(newChipContents[6]).toBe(dropGhostContent);
3065+
break;
3066+
case i >= 4:
3067+
expect(dropGhost).toBeDefined();
3068+
expect(prevElement).toEqual("or OrderName Ends With a OrderDate Today");
3069+
expect(nextElement).toBeNull();
3070+
expect(newChipContents[6]).toBe(dropGhostContent);
29783071
break;
29793072
}
29803073
}

0 commit comments

Comments
 (0)