From 93a6243779d136d7b4ac3600bf8c9c97225b0bb2 Mon Sep 17 00:00:00 2001 From: Deborah Date: Thu, 9 May 2024 15:40:35 +0100 Subject: [PATCH 01/60] accordion: fix broken unit test --- .../components/accordion/accordion.spec.ts | 60 ++++++++++++++++--- 1 file changed, 53 insertions(+), 7 deletions(-) diff --git a/src/app/components/accordion/accordion.spec.ts b/src/app/components/accordion/accordion.spec.ts index 58652aaa707..25fb5c0348e 100755 --- a/src/app/components/accordion/accordion.spec.ts +++ b/src/app/components/accordion/accordion.spec.ts @@ -3,7 +3,7 @@ import { By } from '@angular/platform-browser'; import { Accordion } from './accordion'; import { AccordionTab } from './accordion'; import { NoopAnimationsModule } from '@angular/platform-browser/animations'; -import { Component, DebugElement, NO_ERRORS_SCHEMA } from '@angular/core'; +import { Component, NO_ERRORS_SCHEMA } from '@angular/core'; @Component({ template: ` @@ -175,15 +175,61 @@ describe('Accordion', () => { expect(secondAccordionTabHeaderEl.className).toContain('p-highlight'); }); - it('should be closed', () => { - fixture.detectChanges(); - - const secondAccordionTabOpenEl = fixture.debugElement.children[0].children[0].children[1].query(By.css('a')).nativeElement; - let spaceEvent = { which: 32, preventDefault() {} }; - secondAccordionTab.onKeydown(spaceEvent as KeyboardEvent); + it('should be toggle on space and enter keydown event', () => { fixture.detectChanges(); const secondAccordionTabHeaderEl = fixture.debugElement.children[0].children[0].children[1].query(By.css('.p-accordion-header')).nativeElement; + expect(secondAccordionTabHeaderEl.className).not.toContain('p-highlight'); + + //toggle when enter is pressed + const spaceEvent = new KeyboardEvent('keydown', { key: 'Enter', code: 'Enter' }); + secondAccordionTab.onKeydown(spaceEvent); + expect(secondAccordionTabHeaderEl.className).toContain('p-highlight'); + + //toggle when space is pressed + const keyDownEvent = new KeyboardEvent('keydown', { key: 'Space', code: 'Space' }); + secondAccordionTab.onKeydown(keyDownEvent); + fixture.detectChanges(); + + expect(secondAccordionTabHeaderEl.className).not.toContain('p-highlight'); + }); + + describe('onKeydown', () => { + let firstAccordionTabOpenEl; + let secondAccordionTabOpenEl; + + beforeEach(() => { + firstAccordionTabOpenEl = fixture.debugElement.children[0].children[0].children[0].query(By.css('a')).nativeElement; + secondAccordionTabOpenEl = fixture.debugElement.children[0].children[0].children[1].query(By.css('a')).nativeElement; + }); + + const testKeyBoardEvent = (keyCode, eventTarget, activeTab) => { + fixture.detectChanges(); + + const keyDownEvent = new KeyboardEvent('keydown', { code: keyCode }); + spyOnProperty(keyDownEvent, 'target', 'get').and.returnValue(eventTarget); + + accordion.onKeydown(keyDownEvent); + fixture.detectChanges(); + + expect(document.activeElement).toEqual(activeTab); + }; + + it('ArrowDown should focus on the next tab', () => { + testKeyBoardEvent('ArrowDown', firstAccordionTabOpenEl, secondAccordionTabOpenEl); + }); + + it('ArrowUp should focus on the next tab', () => { + testKeyBoardEvent('ArrowUp', secondAccordionTabOpenEl, firstAccordionTabOpenEl); + }); + + it('Home should focus on the first tab', () => { + testKeyBoardEvent('Home', secondAccordionTabOpenEl, firstAccordionTabOpenEl); + }); + + it('End should focus on the last tab', () => { + testKeyBoardEvent('End', firstAccordionTabOpenEl, secondAccordionTabOpenEl); + }); }); }); From 6dc4cc7e3691ad04e5f177a5076d9c288f6c9bf5 Mon Sep 17 00:00:00 2001 From: Deborah Date: Thu, 9 May 2024 15:42:57 +0100 Subject: [PATCH 02/60] rename variable --- src/app/components/accordion/accordion.spec.ts | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/app/components/accordion/accordion.spec.ts b/src/app/components/accordion/accordion.spec.ts index 25fb5c0348e..63dec232e57 100755 --- a/src/app/components/accordion/accordion.spec.ts +++ b/src/app/components/accordion/accordion.spec.ts @@ -196,12 +196,12 @@ describe('Accordion', () => { }); describe('onKeydown', () => { - let firstAccordionTabOpenEl; - let secondAccordionTabOpenEl; + let firstAccordionTabEl; + let secondAccordionTabEl; beforeEach(() => { - firstAccordionTabOpenEl = fixture.debugElement.children[0].children[0].children[0].query(By.css('a')).nativeElement; - secondAccordionTabOpenEl = fixture.debugElement.children[0].children[0].children[1].query(By.css('a')).nativeElement; + firstAccordionTabEl = fixture.debugElement.children[0].children[0].children[0].query(By.css('a')).nativeElement; + secondAccordionTabEl = fixture.debugElement.children[0].children[0].children[1].query(By.css('a')).nativeElement; }); const testKeyBoardEvent = (keyCode, eventTarget, activeTab) => { @@ -217,19 +217,19 @@ describe('Accordion', () => { }; it('ArrowDown should focus on the next tab', () => { - testKeyBoardEvent('ArrowDown', firstAccordionTabOpenEl, secondAccordionTabOpenEl); + testKeyBoardEvent('ArrowDown', firstAccordionTabEl, secondAccordionTabEl); }); it('ArrowUp should focus on the next tab', () => { - testKeyBoardEvent('ArrowUp', secondAccordionTabOpenEl, firstAccordionTabOpenEl); + testKeyBoardEvent('ArrowUp', secondAccordionTabEl, firstAccordionTabEl); }); it('Home should focus on the first tab', () => { - testKeyBoardEvent('Home', secondAccordionTabOpenEl, firstAccordionTabOpenEl); + testKeyBoardEvent('Home', secondAccordionTabEl, firstAccordionTabEl); }); it('End should focus on the last tab', () => { - testKeyBoardEvent('End', firstAccordionTabOpenEl, secondAccordionTabOpenEl); + testKeyBoardEvent('End', firstAccordionTabEl, secondAccordionTabEl); }); }); }); From 8b2ca3c7ac0532ef2322898013eaae65c3b2acf2 Mon Sep 17 00:00:00 2001 From: Cihan Polat Date: Fri, 3 May 2024 13:49:30 +0200 Subject: [PATCH 03/60] fix: tieredMenuSub improve self-positioning in viewPort when viewPort has been resized between activations --- src/app/components/tieredmenu/tieredmenu.ts | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/src/app/components/tieredmenu/tieredmenu.ts b/src/app/components/tieredmenu/tieredmenu.ts index 652869106bd..b0c1d8af3f1 100755 --- a/src/app/components/tieredmenu/tieredmenu.ts +++ b/src/app/components/tieredmenu/tieredmenu.ts @@ -189,7 +189,7 @@ import { ObjectUtils, UniqueComponentId, ZIndexUtils } from 'primeng/utils'; class: 'p-element' } }) -export class TieredMenuSub implements AfterContentInit { +export class TieredMenuSub { @Input() items: any[]; @Input() itemTemplate: HTMLElement | undefined; @@ -239,21 +239,20 @@ export class TieredMenuSub implements AfterContentInit { }); } - ngAfterContentInit(): void { - this.positionSubmenu(); - } - positionSubmenu() { if (isPlatformBrowser(this.tieredMenu.platformId)) { const sublist = this.sublistViewChild && this.sublistViewChild.nativeElement; - if (sublist && !DomHandler.hasClass(sublist, 'p-submenu-list-flipped')) { + if (sublist) { const parentItem = sublist.parentElement.parentElement; const containerOffset = DomHandler.getOffset(parentItem); const viewport = DomHandler.getViewport(); const sublistWidth = sublist.offsetParent ? sublist.offsetWidth : DomHandler.getOuterWidth(sublist); const itemOuterWidth = DomHandler.getOuterWidth(parentItem.children[0]); + const sublistFlippedClass = 'p-submenu-list-flipped'; if (parseInt(containerOffset.left, 10) + itemOuterWidth + sublistWidth > viewport.width - DomHandler.calculateScrollbarWidth()) { - DomHandler.addClass(sublist, 'p-submenu-list-flipped'); + DomHandler.addClass(sublist, sublistFlippedClass); + } else if (DomHandler.hasClass(sublist, sublistFlippedClass)) { + DomHandler.removeClass(sublist, sublistFlippedClass); } } } From 9ce30fd095e6152a8f5018d54a195a4af0132cf5 Mon Sep 17 00:00:00 2001 From: Cihan Polat Date: Fri, 10 May 2024 10:26:34 +0200 Subject: [PATCH 04/60] fix(fileUplaod): template context aligned with apidocs: chooseCallback/clearCallback missing in template context --- src/app/components/fileupload/fileupload.ts | 2 +- src/app/showcase/doc/apidoc/index.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/app/components/fileupload/fileupload.ts b/src/app/components/fileupload/fileupload.ts index 41a361de907..2582bce2b90 100755 --- a/src/app/components/fileupload/fileupload.ts +++ b/src/app/components/fileupload/fileupload.ts @@ -140,7 +140,7 @@ import { FileBeforeUploadEvent, FileProgressEvent, FileRemoveEvent, FileSelectEv
diff --git a/src/app/showcase/doc/apidoc/index.json b/src/app/showcase/doc/apidoc/index.json index 4c1b4563b4e..0779ac4e76d 100644 --- a/src/app/showcase/doc/apidoc/index.json +++ b/src/app/showcase/doc/apidoc/index.json @@ -12084,7 +12084,7 @@ "type": "{\n \t $implicit: any, // File list.\n \t uploadedFiles: any, // Uploaded files list.\n \t chooseCallback: VoidFunction, // Callback to invoke on choose button click.\n \t clearCallback: VoidFunction, // Callback to invoke on clear button click.\n \t uploadCallback: VoidFunction, // Callback to invoke on upload.\n }" } ], - "description": "Custom template of file." + "description": "Custom template of header." }, { "parent": "fileupload", From caf639193b82e8acb6cf6462ae11367d8fed335c Mon Sep 17 00:00:00 2001 From: Rob Gardiner Date: Fri, 10 May 2024 11:26:12 +0100 Subject: [PATCH 05/60] non-selectable nodes have no focus ring when clicked --- src/app/components/tree/tree.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/app/components/tree/tree.ts b/src/app/components/tree/tree.ts index 8a69c548c94..4c07d023474 100755 --- a/src/app/components/tree/tree.ts +++ b/src/app/components/tree/tree.ts @@ -1248,7 +1248,10 @@ export class Tree implements OnInit, AfterContentInit, OnChanges, OnDestroy, Blo return; } else if (this.selectionMode) { if (node.selectable === false) { + node.style = '--p-focus-ring-color: none;'; return; + } else { + node.style = '--p-focus-ring-color: var(--primary-color)'; } if (this.hasFilteredNodes()) { From 136673a43314457cf46695827619dee635457f93 Mon Sep 17 00:00:00 2001 From: Rob Gardiner Date: Fri, 10 May 2024 11:27:17 +0100 Subject: [PATCH 06/60] Revert "non-selectable nodes have no focus ring when clicked" This reverts commit caf639193b82e8acb6cf6462ae11367d8fed335c. --- src/app/components/tree/tree.ts | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/app/components/tree/tree.ts b/src/app/components/tree/tree.ts index 4c07d023474..8a69c548c94 100755 --- a/src/app/components/tree/tree.ts +++ b/src/app/components/tree/tree.ts @@ -1248,10 +1248,7 @@ export class Tree implements OnInit, AfterContentInit, OnChanges, OnDestroy, Blo return; } else if (this.selectionMode) { if (node.selectable === false) { - node.style = '--p-focus-ring-color: none;'; return; - } else { - node.style = '--p-focus-ring-color: var(--primary-color)'; } if (this.hasFilteredNodes()) { From da1a7e567ece84ce3f6778d032d4d52612d0edac Mon Sep 17 00:00:00 2001 From: Rob Gardiner Date: Fri, 10 May 2024 11:28:51 +0100 Subject: [PATCH 07/60] non-selectable tree nodes have no focus ring when clicked --- src/app/components/tree/tree.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/app/components/tree/tree.ts b/src/app/components/tree/tree.ts index 8a69c548c94..4c07d023474 100755 --- a/src/app/components/tree/tree.ts +++ b/src/app/components/tree/tree.ts @@ -1248,7 +1248,10 @@ export class Tree implements OnInit, AfterContentInit, OnChanges, OnDestroy, Blo return; } else if (this.selectionMode) { if (node.selectable === false) { + node.style = '--p-focus-ring-color: none;'; return; + } else { + node.style = '--p-focus-ring-color: var(--primary-color)'; } if (this.hasFilteredNodes()) { From 1f0e543c47d7c6e01cdcefa294be1a6ce6d2dcd2 Mon Sep 17 00:00:00 2001 From: "Lisa Flinn (She/Her)" Date: Fri, 10 May 2024 13:06:08 +0100 Subject: [PATCH 08/60] initial fix --- src/app/components/rating/rating.spec.ts | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/src/app/components/rating/rating.spec.ts b/src/app/components/rating/rating.spec.ts index cf51231a69e..5b8c0126e19 100755 --- a/src/app/components/rating/rating.spec.ts +++ b/src/app/components/rating/rating.spec.ts @@ -6,7 +6,7 @@ import { StarFillIcon } from 'primeng/icons/starfill'; import { StarIcon } from 'primeng/icons/star'; import { BanIcon } from 'primeng/icons/ban'; -describe('Rating', () => { +fdescribe('Rating', () => { let rating: Rating; let fixture: ComponentFixture; @@ -62,8 +62,8 @@ describe('Rating', () => { fixture.detectChanges(); const starElements = fixture.debugElement.queryAll(By.css('span')); - expect(starElements[0].nativeElement.className).toContain('Primeng Rocks!'); - expect(starElements[0].nativeElement.style.height).toEqual('300px'); + expect(starElements[1].nativeElement.className).toContain('Primeng Rocks!'); + expect(starElements[1].nativeElement.style.height).toEqual('300px'); }); it('should value 3', () => { @@ -86,11 +86,18 @@ describe('Rating', () => { rating.onRate.subscribe((value) => (onRateValue = value)); rating.onCancel.subscribe((value) => (onCancelRate = value)); thirdStarEl.parentElement.click(); - cancelEl.parentElement.click(); fixture.detectChanges(); expect(onRateValue.value).toEqual(3); - expect(onCancelRate).toBeTruthy(); + + const cancelspy = spyOn(rating.onCancel, 'emit').and.callThrough(); + const onModelChangeSpy = spyOn(rating, 'onModelChange').and.callThrough(); + cancelEl.parentElement.click(); + fixture.detectChanges(); + + expect(onModelChangeSpy).toHaveBeenCalled(); + expect(rating.value).toEqual(null); + expect(cancelspy).toHaveBeenCalled(); }); it('should clear value', () => { From c11ff74a21d8c372bf7e1020b048f5ee7e9f04b3 Mon Sep 17 00:00:00 2001 From: "Lisa Flinn (She/Her)" Date: Fri, 10 May 2024 13:11:33 +0100 Subject: [PATCH 09/60] rm fdescribe --- src/app/components/rating/rating.spec.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/app/components/rating/rating.spec.ts b/src/app/components/rating/rating.spec.ts index 5b8c0126e19..344abc8adab 100755 --- a/src/app/components/rating/rating.spec.ts +++ b/src/app/components/rating/rating.spec.ts @@ -6,7 +6,7 @@ import { StarFillIcon } from 'primeng/icons/starfill'; import { StarIcon } from 'primeng/icons/star'; import { BanIcon } from 'primeng/icons/ban'; -fdescribe('Rating', () => { +describe('Rating', () => { let rating: Rating; let fixture: ComponentFixture; From 558c99702e9ae599d68b2f35c0948d3f0e6a3ada Mon Sep 17 00:00:00 2001 From: "Lisa Flinn (She/Her)" Date: Fri, 10 May 2024 13:34:58 +0100 Subject: [PATCH 10/60] initial fix --- src/app/components/dialog/dialog.spec.ts | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/src/app/components/dialog/dialog.spec.ts b/src/app/components/dialog/dialog.spec.ts index 099d2af2da6..f55d375ba73 100755 --- a/src/app/components/dialog/dialog.spec.ts +++ b/src/app/components/dialog/dialog.spec.ts @@ -332,11 +332,7 @@ describe('Dialog', () => { fixture.detectChanges(); tick(300); - const escapeEvent: any = document.createEvent('CustomEvent'); - escapeEvent.which = 27; - escapeEvent.initEvent('keydown', true, true); - document.dispatchEvent(escapeEvent); - document.dispatchEvent(escapeEvent as KeyboardEvent); + document.dispatchEvent(new KeyboardEvent('keydown', { key: 'Escape' })); fixture.detectChanges(); expect(closeSpy).toHaveBeenCalled(); From 883004b9130f9a899d07daae77a3e8debfa1b49d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mehmet=20=C3=87etin?= <92744169+mehmetcetin01140@users.noreply.github.com> Date: Fri, 10 May 2024 17:51:24 +0300 Subject: [PATCH 11/60] update dock advanced doc --- src/app/showcase/doc/dock/advanceddoc.ts | 60 ++++++++++++------------ 1 file changed, 30 insertions(+), 30 deletions(-) diff --git a/src/app/showcase/doc/dock/advanceddoc.ts b/src/app/showcase/doc/dock/advanceddoc.ts index 8e3620229bd..ce0d1c09ad3 100644 --- a/src/app/showcase/doc/dock/advanceddoc.ts +++ b/src/app/showcase/doc/dock/advanceddoc.ts @@ -18,15 +18,15 @@ import { PhotoService } from '@service/photoservice';
- + - - - + + + Fri 13:07 - - + +
@@ -36,7 +36,7 @@ import { PhotoService } from '@service/photoservice'; - + @@ -59,7 +59,7 @@ import { PhotoService } from '@service/photoservice'; [fullScreen]="true" > - +
@@ -130,7 +130,7 @@ export class AdvancedDoc implements OnInit, OnDestroy { }, icon: 'https://primefaces.org/cdn/primeng/images/dock/appstore.svg', command: () => { - this.messageService.add({ severity: 'error', summary: 'An unexpected error occurred while signing in.', detail: 'UNTRUSTED_CERT_TITLE' }); + this.messageService.add({ severity: 'error', summary: 'An unexpected error occurred while signing in.', detail: 'UNTRUSTED_CERT_TITLE', key: 'tc' }); } }, { @@ -144,7 +144,7 @@ export class AdvancedDoc implements OnInit, OnDestroy { }, icon: 'https://primefaces.org/cdn/primeng/images/dock/safari.svg', command: () => { - this.messageService.add({ severity: 'warn', summary: 'Safari has stopped working' }); + this.messageService.add({ severity: 'warn', summary: 'Safari has stopped working', key: 'tc' }); } }, { @@ -183,7 +183,7 @@ export class AdvancedDoc implements OnInit, OnDestroy { }, icon: 'https://primefaces.org/cdn/primeng/images/dock/trash.png', command: () => { - this.messageService.add({ severity: 'info', summary: 'Empty Trash' }); + this.messageService.add({ severity: 'info', summary: 'Empty Trash', key: 'tc' }); } } ]; @@ -369,15 +369,15 @@ export class AdvancedDoc implements OnInit, OnDestroy { code: Code = { basic: ` - + - - - + + + Fri 13:07 - - + +
@@ -387,7 +387,7 @@ export class AdvancedDoc implements OnInit, OnDestroy { - + - +
`, @@ -430,15 +430,15 @@ export class AdvancedDoc implements OnInit, OnDestroy { html: `
- + - - - + + + Fri 13:07 - - + +
@@ -448,7 +448,7 @@ export class AdvancedDoc implements OnInit, OnDestroy { - + - +
@@ -684,7 +684,7 @@ export class DockAdvancedDemo implements OnInit { }, icon: 'https://primefaces.org/cdn/primeng/images/dock/appstore.svg', command: () => { - this.messageService.add({ severity: 'error', summary: 'An unexpected error occurred while signing in.', detail: 'UNTRUSTED_CERT_TITLE' }); + this.messageService.add({ severity: 'error', summary: 'An unexpected error occurred while signing in.', detail: 'UNTRUSTED_CERT_TITLE', key: 'tc' }); } }, { @@ -698,7 +698,7 @@ export class DockAdvancedDemo implements OnInit { }, icon: 'https://primefaces.org/cdn/primeng/images/dock/safari.svg', command: () => { - this.messageService.add({ severity: 'warn', summary: 'Safari has stopped working' }); + this.messageService.add({ severity: 'warn', summary: 'Safari has stopped working', key: 'tc' }); } }, { @@ -737,7 +737,7 @@ export class DockAdvancedDemo implements OnInit { }, icon: 'https://primefaces.org/cdn/primeng/images/dock/trash.png', command: () => { - this.messageService.add({ severity: 'info', summary: 'Empty Trash' }); + this.messageService.add({ severity: 'info', summary: 'Empty Trash', key: 'tc' }); } } ]; From b5fe5d10906b4942bc92fb95c168f11729bff6d4 Mon Sep 17 00:00:00 2001 From: Pablo200206 Date: Sat, 11 May 2024 11:57:51 +0200 Subject: [PATCH 12/60] fix touched --- package-lock.json | 4 +-- src/app/components/treeselect/treeselect.ts | 31 +++++++++++++++++---- 2 files changed, 28 insertions(+), 7 deletions(-) diff --git a/package-lock.json b/package-lock.json index 8ab86a26a62..3b857383e37 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "primeng", - "version": "17.16.0", + "version": "17.16.1", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "primeng", - "version": "17.16.0", + "version": "17.16.1", "license": "SEE LICENSE IN LICENSE.md", "devDependencies": { "@angular-devkit/build-angular": "^17.3.6", diff --git a/src/app/components/treeselect/treeselect.ts b/src/app/components/treeselect/treeselect.ts index f6fd4e6521d..7552d463d39 100755 --- a/src/app/components/treeselect/treeselect.ts +++ b/src/app/components/treeselect/treeselect.ts @@ -53,8 +53,8 @@ export const TREESELECT_VALUE_ACCESSOR: any = { [attr.id]="inputId" readonly [disabled]="disabled" - (focus)="onFocus()" - (blur)="onBlur()" + (focus)="onInputFocus($event)" + (blur)="onInputBlur($event)" (keydown)="onKeyDown($event)" [attr.tabindex]="!disabled ? tabindex : -1" [attr.aria-controls]="overlayVisible ? listId : null" @@ -437,6 +437,7 @@ export class TreeSelect implements AfterContentInit { * @group Emits */ @Output() onNodeCollapse: EventEmitter = new EventEmitter(); + /** * Callback to invoke when the overlay is shown. * @param {Event} event - Browser event. @@ -459,6 +460,18 @@ export class TreeSelect implements AfterContentInit { * @group Emits */ @Output() onFilter: EventEmitter = new EventEmitter(); + /** + * Callback to invoke when treeselect gets focus. + * @param {Event} event - Browser event. + * @group Emits + */ + @Output() onFocus: EventEmitter = new EventEmitter(); + /** + * Callback to invoke when treeselect loses focus. + * @param {Event} event - Browser event. + * @group Emits + */ + @Output() onBlur: EventEmitter = new EventEmitter(); /** * Callback to invoke when a node is unselected. * @param {TreeNodeUnSelectEvent} event - node unselect event. @@ -912,17 +925,25 @@ export class TreeSelect implements AfterContentInit { this.focusInput?.nativeElement.focus(); } } - +t onUnselect(event: TreeNodeUnSelectEvent) { this.onNodeUnselect.emit(event); } - onFocus() { + onInputFocus(event: Event) { + if (this.disabled) { + // For ScreenReaders + return; + } + this.focused = true; + this.onFocus.emit(event); } - onBlur() { + onInputBlur(event: Event) { this.focused = false; + this.onBlur.emit(event); + this.onModelTouched(); } writeValue(value: any): void { From 87e9464e63a8ef341904862b16672f9a5c35e7ea Mon Sep 17 00:00:00 2001 From: Pablo200206 Date: Sat, 11 May 2024 12:00:07 +0200 Subject: [PATCH 13/60] fix typo --- src/app/components/treeselect/treeselect.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/app/components/treeselect/treeselect.ts b/src/app/components/treeselect/treeselect.ts index 7552d463d39..2f0c9e8ca2a 100755 --- a/src/app/components/treeselect/treeselect.ts +++ b/src/app/components/treeselect/treeselect.ts @@ -925,7 +925,7 @@ export class TreeSelect implements AfterContentInit { this.focusInput?.nativeElement.focus(); } } -t + onUnselect(event: TreeNodeUnSelectEvent) { this.onNodeUnselect.emit(event); } From 072c4a96abe68dbc6bc2f349c7b668ee2fabca3a Mon Sep 17 00:00:00 2001 From: F3KTOR Date: Sat, 11 May 2024 12:21:39 +0000 Subject: [PATCH 14/60] #15535 - skeleton value changed from a shape to string for rem values --- src/app/components/skeleton/skeleton.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/app/components/skeleton/skeleton.ts b/src/app/components/skeleton/skeleton.ts index 2435fe0f458..7d2aca9b13c 100755 --- a/src/app/components/skeleton/skeleton.ts +++ b/src/app/components/skeleton/skeleton.ts @@ -44,7 +44,7 @@ export class Skeleton { * Size of the skeleton. * @group Props */ - @Input() size: 'circle' | 'square' | undefined; + @Input() size: string | undefined; /** * Width of the element. * @group Props From 70d22ac97ecac0f9b03c873bfd1cf1413c5cc132 Mon Sep 17 00:00:00 2001 From: Pablo200206 Date: Sat, 11 May 2024 22:47:30 +0200 Subject: [PATCH 15/60] tree select hide --- src/app/components/treeselect/treeselect.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/app/components/treeselect/treeselect.ts b/src/app/components/treeselect/treeselect.ts index f6fd4e6521d..642a9fe286b 100755 --- a/src/app/components/treeselect/treeselect.ts +++ b/src/app/components/treeselect/treeselect.ts @@ -908,7 +908,7 @@ export class TreeSelect implements AfterContentInit { this.onNodeSelect.emit(event); if (this.selectionMode === 'single') { - // this.hide(); + this.hide(); this.focusInput?.nativeElement.focus(); } } From a48ec21697e7e85c7b99d772dd9641cf30e4b323 Mon Sep 17 00:00:00 2001 From: Alexander Ciesielski Date: Sun, 12 May 2024 10:26:47 +0200 Subject: [PATCH 16/60] fix(dropdown): apply ID to (editable) input element --- src/app/components/dropdown/dropdown.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/app/components/dropdown/dropdown.ts b/src/app/components/dropdown/dropdown.ts index 3594b81f369..5f3d70c9b87 100755 --- a/src/app/components/dropdown/dropdown.ts +++ b/src/app/components/dropdown/dropdown.ts @@ -169,6 +169,7 @@ export class DropdownItem { *ngIf="editable" #editableInput type="text" + [attr.id]="inputId" [attr.maxlength]="maxlength" [ngClass]="inputClass" [disabled]="disabled" From e91cd1e4e98beee459781e1e1da5383ca006e386 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=87etin?= <69278826+cetincakiroglu@users.noreply.github.com> Date: Mon, 13 May 2024 10:49:35 +0300 Subject: [PATCH 17/60] Update quill version --- package-lock.json | 127 +++++++++++++++++----------------------------- package.json | 2 +- 2 files changed, 48 insertions(+), 81 deletions(-) diff --git a/package-lock.json b/package-lock.json index 8ab86a26a62..1061a3469ff 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "primeng", - "version": "17.16.0", + "version": "17.16.1", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "primeng", - "version": "17.16.0", + "version": "17.16.1", "license": "SEE LICENSE IN LICENSE.md", "devDependencies": { "@angular-devkit/build-angular": "^17.3.6", @@ -66,7 +66,7 @@ "primeflex": "^3.3.1", "primeicons": "^7.0.0", "prismjs": "^1.29.0", - "quill": "1.3.7", + "quill": "2.0.2", "rxjs": "~7.8.1", "ts-node": "~10.9.1", "tslib": "^2.5.0", @@ -9117,26 +9117,6 @@ "node": ">=0.10" } }, - "node_modules/deep-equal": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.2.tgz", - "integrity": "sha512-5tdhKF6DbU7iIzrIOa1AOUt39ZRm13cmL1cGEh//aqR8x9+tNfbywRf0n5FD/18OKMdo7DNEtrX2t22ZAkI+eg==", - "dev": true, - "dependencies": { - "is-arguments": "^1.1.1", - "is-date-object": "^1.0.5", - "is-regex": "^1.1.4", - "object-is": "^1.1.5", - "object-keys": "^1.1.1", - "regexp.prototype.flags": "^1.5.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/deep-is": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", @@ -11023,9 +11003,9 @@ "dev": true }, "node_modules/fast-diff": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.1.2.tgz", - "integrity": "sha512-KaJUt+M9t1qaIteSvjc6P3RbMdXsNhK61GRftR6SNxqmhthcd9MGIi4T+o0jD8LUSpSnSKXE20nLtJ3fOHxQig==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz", + "integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==", "dev": true }, "node_modules/fast-glob": { @@ -13278,22 +13258,6 @@ "node": ">= 0.10" } }, - "node_modules/is-arguments": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", - "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/is-array-buffer": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz", @@ -15242,12 +15206,30 @@ "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", "dev": true }, + "node_modules/lodash-es": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", + "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==", + "dev": true + }, + "node_modules/lodash.clonedeep": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", + "integrity": "sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==", + "dev": true + }, "node_modules/lodash.debounce": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", "dev": true }, + "node_modules/lodash.isequal": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", + "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==", + "dev": true + }, "node_modules/lodash.merge": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", @@ -17345,22 +17327,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/object-is": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.6.tgz", - "integrity": "sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/object-keys": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", @@ -17834,9 +17800,9 @@ } }, "node_modules/parchment": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/parchment/-/parchment-1.1.4.tgz", - "integrity": "sha512-J5FBQt/pM2inLzg4hEWmzQx/8h8D0CiDxaG3vyp9rKrQRSDgBlhjdP5jQGgosEajXPSQouXGHOmVdgo7QmJuOg==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/parchment/-/parchment-3.0.0.tgz", + "integrity": "sha512-HUrJFQ/StvgmXRcQ1ftY6VEZUq3jA2t9ncFN4F84J/vN0/FPpQF+8FKXb3l6fLces6q0uOHj6NJn+2xvZnxO6A==", "dev": true }, "node_modules/parent-module": { @@ -18653,37 +18619,38 @@ ] }, "node_modules/quill": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/quill/-/quill-1.3.7.tgz", - "integrity": "sha512-hG/DVzh/TiknWtE6QmWAF/pxoZKYxfe3J/d/+ShUWkDvvkZQVTPeVmUJVu1uE6DDooC4fWTiCLh84ul89oNz5g==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/quill/-/quill-2.0.2.tgz", + "integrity": "sha512-QfazNrhMakEdRG57IoYFwffUIr04LWJxbS/ZkidRFXYCQt63c1gK6Z7IHUXMx/Vh25WgPBU42oBaNzQ0K1R/xw==", "dev": true, "dependencies": { - "clone": "^2.1.1", - "deep-equal": "^1.0.1", - "eventemitter3": "^2.0.3", - "extend": "^3.0.2", - "parchment": "^1.1.4", - "quill-delta": "^3.6.2" + "eventemitter3": "^5.0.1", + "lodash-es": "^4.17.21", + "parchment": "^3.0.0", + "quill-delta": "^5.1.0" + }, + "engines": { + "npm": ">=8.2.3" } }, "node_modules/quill-delta": { - "version": "3.6.3", - "resolved": "https://registry.npmjs.org/quill-delta/-/quill-delta-3.6.3.tgz", - "integrity": "sha512-wdIGBlcX13tCHOXGMVnnTVFtGRLoP0imqxM696fIPwIf5ODIYUHIvHbZcyvGlZFiFhK5XzDC2lpjbxRhnM05Tg==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/quill-delta/-/quill-delta-5.1.0.tgz", + "integrity": "sha512-X74oCeRI4/p0ucjb5Ma8adTXd9Scumz367kkMK5V/IatcX6A0vlgLgKbzXWy5nZmCGeNJm2oQX0d2Eqj+ZIlCA==", "dev": true, "dependencies": { - "deep-equal": "^1.0.1", - "extend": "^3.0.2", - "fast-diff": "1.1.2" + "fast-diff": "^1.3.0", + "lodash.clonedeep": "^4.5.0", + "lodash.isequal": "^4.5.0" }, "engines": { - "node": ">=0.10" + "node": ">= 12.0.0" } }, "node_modules/quill/node_modules/eventemitter3": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-2.0.3.tgz", - "integrity": "sha512-jLN68Dx5kyFHaePoXWPsCGW5qdyZQtLYHkxkg02/Mz6g0kYpDx4FyP6XfArhQdlOC4b8Mv+EMxPo/8La7Tzghg==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", + "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==", "dev": true }, "node_modules/raf": { diff --git a/package.json b/package.json index 494fe7bce5c..5361dfdbec8 100644 --- a/package.json +++ b/package.json @@ -77,7 +77,7 @@ "primeflex": "^3.3.1", "primeicons": "^7.0.0", "prismjs": "^1.29.0", - "quill": "1.3.7", + "quill": "2.0.2", "rxjs": "~7.8.1", "ts-node": "~10.9.1", "tslib": "^2.5.0", From e295088de66553dbbbfeff38774926bbcf98d049 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mehmet=20=C3=87etin?= <92744169+mehmetcetin01140@users.noreply.github.com> Date: Mon, 13 May 2024 14:06:20 +0300 Subject: [PATCH 18/60] Fixed #15546 - Galleria | Keyboard Trap within Galleria component --- src/app/components/focustrap/focustrap.ts | 23 +++++++++++-- src/app/components/galleria/galleria.css | 5 +++ src/app/components/galleria/galleria.ts | 41 +++++++++++++++++++++-- 3 files changed, 64 insertions(+), 5 deletions(-) diff --git a/src/app/components/focustrap/focustrap.ts b/src/app/components/focustrap/focustrap.ts index 7ee8a6cac06..84bc3e02452 100755 --- a/src/app/components/focustrap/focustrap.ts +++ b/src/app/components/focustrap/focustrap.ts @@ -1,6 +1,6 @@ import { DomHandler } from 'primeng/dom'; import { CommonModule, DOCUMENT, isPlatformBrowser } from '@angular/common'; -import { Directive, ElementRef, Input, NgModule, inject, booleanAttribute, PLATFORM_ID } from '@angular/core'; +import { Directive, ElementRef, Input, NgModule, inject, booleanAttribute, PLATFORM_ID, SimpleChanges } from '@angular/core'; /** * Focus Trap keeps focus within a certain DOM element while tabbing. @@ -31,10 +31,29 @@ export class FocusTrap { ngOnInit() { if (isPlatformBrowser(this.platformId) && !this.pFocusTrapDisabled) { - this.createHiddenFocusableElements(); + !this.firstHiddenFocusableElement && !this.lastHiddenFocusableElement && this.createHiddenFocusableElements(); } } + ngOnChanges(changes: SimpleChanges) { + if (changes.pFocusTrapDisabled && isPlatformBrowser(this.platformId)) { + if (changes.pFocusTrapDisabled.currentValue) { + this.removeHiddenFocusableElements(); + } else { + this.createHiddenFocusableElements(); + } + } + } + + removeHiddenFocusableElements() { + if (this.firstHiddenFocusableElement && this.firstHiddenFocusableElement.parentNode) { + this.firstHiddenFocusableElement.parentNode.removeChild(this.firstHiddenFocusableElement); + } + + if (this.lastHiddenFocusableElement && this.lastHiddenFocusableElement.parentNode) { + this.lastHiddenFocusableElement.parentNode.removeChild(this.lastHiddenFocusableElement); + } + } getComputedSelector(selector) { return `:not(.p-hidden-focusable):not([data-p-hidden-focusable="true"])${selector ?? ''}`; } diff --git a/src/app/components/galleria/galleria.css b/src/app/components/galleria/galleria.css index c996776c864..e58b38583f7 100755 --- a/src/app/components/galleria/galleria.css +++ b/src/app/components/galleria/galleria.css @@ -57,6 +57,11 @@ opacity: 1; } + .p-galleria-item-nav-onhover .p-galleria-item-nav-focused { + pointer-events: all; + opacity: 1; + } + .p-galleria-item-nav-onhover .p-galleria-item-wrapper:hover .p-galleria-item-nav.p-disabled { pointer-events: none; } diff --git a/src/app/components/galleria/galleria.ts b/src/app/components/galleria/galleria.ts index 09b7cffcb14..a263c5d6234 100755 --- a/src/app/components/galleria/galleria.ts +++ b/src/app/components/galleria/galleria.ts @@ -10,6 +10,7 @@ import { DoCheck, ElementRef, EventEmitter, + HostListener, Inject, Input, KeyValueDiffers, @@ -67,6 +68,7 @@ import { FocusTrapModule } from 'primeng/focustrap'; (maskHide)="onMaskHide()" (activeItemChange)="onActiveItemChange($event)" [ngStyle]="containerStyle" + [fullScreen]="fullScreen" >
@@ -417,6 +419,7 @@ export class Galleria implements OnChanges, OnDestroy { [ngStyle]="!galleria.fullScreen ? galleria.containerStyle : {}" [class]="galleriaClass()" pFocusTrap + [pFocusTrapDisabled]="!fullScreen" >
diff --git a/src/app/components/inputnumber/inputnumber.ts b/src/app/components/inputnumber/inputnumber.ts index b8dff266eb1..84c489f8c1a 100644 --- a/src/app/components/inputnumber/inputnumber.ts +++ b/src/app/components/inputnumber/inputnumber.ts @@ -1192,10 +1192,7 @@ export class InputNumber implements OnInit, AfterContentInit, OnChanges, Control // Will allow selecting whole prefix. But not a part of it. // Negative values will trigger clauses after this to fix the cursor position. - if (selectionStart === selectionEnd - || selectionStart !== 0 - || selectionEnd < prefixLength) - { + if (selectionStart === selectionEnd || selectionStart !== 0 || selectionEnd < prefixLength) { selectionStart -= prefixLength; } diff --git a/src/app/components/panelmenu/panelmenu.spec.ts b/src/app/components/panelmenu/panelmenu.spec.ts index 80e2f7f3636..c0c8a52b780 100755 --- a/src/app/components/panelmenu/panelmenu.spec.ts +++ b/src/app/components/panelmenu/panelmenu.spec.ts @@ -215,7 +215,7 @@ describe('PanelMenu', () => { expect(panelHeaderLinkEl.nativeElement.target).toEqual('primeng'); expect(panelHeaderLinkEl.nativeElement.disabled).toBeTruthy; expect(panelHeaderLinkEl.query(By.css('.p-menuitem-icon')).nativeElement.className).toContain('Primeng ROCKS!'); - expect(panelHeaderLinkEl.nativeElement.innerHTML).toContain("New"); + expect(panelHeaderLinkEl.nativeElement.innerHTML).toContain('New'); }); it('should show items and call toggle', () => { diff --git a/src/app/showcase/doc/avatar/imagedoc.ts b/src/app/showcase/doc/avatar/imagedoc.ts index cdf526c26de..fe9b42a023f 100644 --- a/src/app/showcase/doc/avatar/imagedoc.ts +++ b/src/app/showcase/doc/avatar/imagedoc.ts @@ -16,7 +16,7 @@ import { Code } from '@domain/code';
Badge
- +
Gravatar
diff --git a/src/app/showcase/doc/fileupload/templatedoc.ts b/src/app/showcase/doc/fileupload/templatedoc.ts index 1f12a64e645..e2b5bd02458 100644 --- a/src/app/showcase/doc/fileupload/templatedoc.ts +++ b/src/app/showcase/doc/fileupload/templatedoc.ts @@ -73,9 +73,9 @@ import { MessageService, PrimeNGConfig } from 'primeng/api'; export class TemplateDoc { files = []; - totalSize : number = 0; + totalSize: number = 0; - totalSizePercent : number = 0; + totalSizePercent: number = 0; constructor(private config: PrimeNGConfig, private messageService: MessageService) {} From 54e7c2407d9416a085ee50da790f606ffe6593bb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=87etin?= <69278826+cetincakiroglu@users.noreply.github.com> Date: Thu, 16 May 2024 15:07:42 +0300 Subject: [PATCH 60/60] Update apidoc --- src/app/showcase/doc/apidoc/index.json | 48 +++++++++++++++++++++++--- 1 file changed, 43 insertions(+), 5 deletions(-) diff --git a/src/app/showcase/doc/apidoc/index.json b/src/app/showcase/doc/apidoc/index.json index 0779ac4e76d..284ac13ac3d 100644 --- a/src/app/showcase/doc/apidoc/index.json +++ b/src/app/showcase/doc/apidoc/index.json @@ -5087,13 +5087,23 @@ { "parent": "button", "name": "icon", - "parameters": [], + "parameters": [ + { + "name": "context", + "type": "{\n \t class: NgClass, // Icon class.\n }" + } + ], "description": "Custom template of icon." }, { "parent": "button", "name": "loadingicon", - "parameters": [], + "parameters": [ + { + "name": "context", + "type": "{\n \t class: NgClass, // Icon class.\n }" + } + ], "description": "Custom template of loadingicon." } ] @@ -6961,7 +6971,7 @@ "name": "type", "optional": false, "readonly": false, - "type": "string", + "type": "\"line\" | \"bar\" | \"scatter\" | \"bubble\" | \"pie\" | \"doughnut\" | \"polarArea\" | \"radar\"", "description": "Type of the chart." }, { @@ -12084,7 +12094,7 @@ "type": "{\n \t $implicit: any, // File list.\n \t uploadedFiles: any, // Uploaded files list.\n \t chooseCallback: VoidFunction, // Callback to invoke on choose button click.\n \t clearCallback: VoidFunction, // Callback to invoke on clear button click.\n \t uploadCallback: VoidFunction, // Callback to invoke on upload.\n }" } ], - "description": "Custom template of header." + "description": "Custom template of file." }, { "parent": "fileupload", @@ -21342,7 +21352,7 @@ "name": "size", "optional": false, "readonly": false, - "type": "\"square\" | \"circle\"", + "type": "string", "description": "Size of the skeleton." }, { @@ -27386,6 +27396,14 @@ "type": "string", "description": "Transition options of the hide animation.", "deprecated": "since v14.2.0 use overlayOptions property instead." + }, + { + "name": "loading", + "optional": false, + "readonly": false, + "type": "boolean", + "default": "false", + "description": "Displays a loader to indicate data load is in progress." } ] }, @@ -27452,6 +27470,26 @@ ], "description": "Callback to invoke when data is filtered." }, + { + "name": "onFocus", + "parameters": [ + { + "name": "event", + "type": "Event" + } + ], + "description": "Callback to invoke when treeselect gets focus." + }, + { + "name": "onBlur", + "parameters": [ + { + "name": "event", + "type": "Event" + } + ], + "description": "Callback to invoke when treeselect loses focus." + }, { "name": "onNodeUnselect", "parameters": [