diff --git a/libs/components/src/lib/components/accordion/accordion.component.ts b/libs/components/src/lib/components/accordion/accordion.component.ts index 9df182efdd..393180d1db 100644 --- a/libs/components/src/lib/components/accordion/accordion.component.ts +++ b/libs/components/src/lib/components/accordion/accordion.component.ts @@ -9,7 +9,7 @@ import { import { PrizmAccordionItemComponent } from './components/accordion-item/accordion-item.component'; import { merge } from 'rxjs'; import { mapTo, takeUntil } from 'rxjs/operators'; -import { PrizmDestroyService } from '@prizm-ui/helpers'; +import { PrizmDestroyService, prizmEmptyQueryList } from '@prizm-ui/helpers'; import { PrizmAbstractTestId } from '../../abstract/interactive'; @Component({ @@ -23,7 +23,7 @@ import { PrizmAbstractTestId } from '../../abstract/interactive'; export class PrizmAccordionComponent extends PrizmAbstractTestId implements AfterContentInit { @Input() public onlyOneExpanded = false; @ContentChildren(PrizmAccordionItemComponent, { descendants: false }) - accordionItems!: QueryList; + accordionItems: QueryList = prizmEmptyQueryList(); override readonly testId_ = 'ui_accordion'; diff --git a/libs/components/src/lib/components/breadcrumbs/breadcrumbs.component.ts b/libs/components/src/lib/components/breadcrumbs/breadcrumbs.component.ts index 829297f4c1..e46533a8ef 100644 --- a/libs/components/src/lib/components/breadcrumbs/breadcrumbs.component.ts +++ b/libs/components/src/lib/components/breadcrumbs/breadcrumbs.component.ts @@ -16,7 +16,7 @@ import { } from '@angular/core'; import { IBreadcrumb } from './breadcrumb.interface'; import { animationFrameScheduler, BehaviorSubject, merge, Subject } from 'rxjs'; -import { PrizmDestroyService } from '@prizm-ui/helpers'; +import { PrizmDestroyService, prizmEmptyQueryList } from '@prizm-ui/helpers'; import { debounceTime, observeOn, takeUntil, tap } from 'rxjs/operators'; import { PrizmAbstractTestId } from '../../abstract/interactive'; import { PrizmBreadcrumbDirective } from './breadcrumbs.directive'; @@ -55,8 +55,10 @@ export class PrizmBreadcrumbsComponent @Output() public breadcrumbChange: EventEmitter = new EventEmitter(); @ViewChild('container', { static: true }) public containerRef!: ElementRef; @ViewChild('breadcrumbsFake', { static: true }) public fakeBreadcrumbContainer!: ElementRef; - @ViewChildren('breadcrumb', { read: ElementRef }) public breadcrumbsList!: QueryList; - @ContentChildren(PrizmBreadcrumbDirective) public breadcrumbsItem!: QueryList; + @ViewChildren('breadcrumb', { read: ElementRef }) public breadcrumbsList: QueryList = + prizmEmptyQueryList(); + @ContentChildren(PrizmBreadcrumbDirective) public breadcrumbsItem: QueryList = + prizmEmptyQueryList(); public breadcrumbs$: BehaviorSubject = new BehaviorSubject([]); public breadcrumbsToShow$: BehaviorSubject = new BehaviorSubject([]); diff --git a/libs/components/src/lib/components/grid/grid.component.ts b/libs/components/src/lib/components/grid/grid.component.ts index b7965ad07e..9c6ddecbad 100644 --- a/libs/components/src/lib/components/grid/grid.component.ts +++ b/libs/components/src/lib/components/grid/grid.component.ts @@ -1,17 +1,18 @@ import { - Component, - ChangeDetectionStrategy, - Input, AfterContentInit, + ChangeDetectionStrategy, + Component, ContentChildren, ElementRef, + HostBinding, + Input, QueryList, ViewChild, - HostBinding, } from '@angular/core'; import { PrizmGridItemComponent } from './components/grid-item/grid-item.component'; import { PrizmAbstractTestId } from '../../abstract/interactive'; import { CommonModule } from '@angular/common'; +import { prizmEmptyQueryList } from '@prizm-ui/helpers'; @Component({ selector: 'prizm-grid', @@ -26,8 +27,12 @@ export class PrizmGridComponent extends PrizmAbstractTestId implements AfterCont @Input() public rows = '10'; @ViewChild('container', { static: true }) container!: ElementRef; - @ContentChildren(PrizmGridItemComponent, { read: ElementRef }) public gridItems!: QueryList; - @ContentChildren(PrizmGridItemComponent) public gridItemsData!: QueryList; + + @ContentChildren(PrizmGridItemComponent, { read: ElementRef }) + public gridItems: QueryList = prizmEmptyQueryList(); + + @ContentChildren(PrizmGridItemComponent) + public gridItemsData: QueryList = prizmEmptyQueryList(); override readonly testId_ = 'ui-area--grid'; diff --git a/libs/components/src/lib/components/navigation-menu/components/prizm-navigation-menu-items/prizm-navigation-menu-items.component.ts b/libs/components/src/lib/components/navigation-menu/components/prizm-navigation-menu-items/prizm-navigation-menu-items.component.ts index da3411c75e..cdfab37933 100644 --- a/libs/components/src/lib/components/navigation-menu/components/prizm-navigation-menu-items/prizm-navigation-menu-items.component.ts +++ b/libs/components/src/lib/components/navigation-menu/components/prizm-navigation-menu-items/prizm-navigation-menu-items.component.ts @@ -17,6 +17,7 @@ import { PRIZM_NAVIGATION_MENU_CHILDREN_HANDLER, PrizmNavigationMenuChildrenHand import { PrizmAbstractTestId } from '@prizm-ui/core'; import { PrizmTreeControllerDirective, PrizmTreeModule } from '../../../tree'; import { NgFor } from '@angular/common'; +import { prizmEmptyQueryList } from '@prizm-ui/helpers'; @Component({ selector: 'prizm-navigation-menu-items', @@ -29,9 +30,9 @@ import { NgFor } from '@angular/common'; export class PrizmNavigationMenuItemsComponent< T extends { children?: unknown[] } > extends PrizmAbstractTestId { - @ViewChildren(PrizmNavigationMenuItemComponent) private menuItemsList!: QueryList< + @ViewChildren(PrizmNavigationMenuItemComponent) private menuItemsList: QueryList< PrizmNavigationMenuItemComponent - >; + > = prizmEmptyQueryList(); @Output() itemExpandedChanged = new EventEmitter<{ item: InternalPrizmNavigationMenuItem; diff --git a/libs/components/src/lib/components/navigation-menu/components/prizm-navigation-menu/prizm-navigation-menu.component.ts b/libs/components/src/lib/components/navigation-menu/components/prizm-navigation-menu/prizm-navigation-menu.component.ts index 096083e510..fac14c9ce2 100644 --- a/libs/components/src/lib/components/navigation-menu/components/prizm-navigation-menu/prizm-navigation-menu.component.ts +++ b/libs/components/src/lib/components/navigation-menu/components/prizm-navigation-menu/prizm-navigation-menu.component.ts @@ -15,7 +15,7 @@ import { PrizmNavigationMenuToolbarService } from '../../services/prizm-navigati import { PrizmNavigationMenuService } from '../../services/prizm-navigation-menu.service'; import { Observable } from 'rxjs'; import { takeUntil } from 'rxjs/operators'; -import { PrizmDestroyService } from '@prizm-ui/helpers'; +import { PrizmDestroyService, prizmEmptyQueryList } from '@prizm-ui/helpers'; import { GroupExpandedChangedEvent, ItemExpandedChangedEvent, @@ -60,7 +60,7 @@ export class PrizmNavigationMenuComponent< UserItem extends Omit & { children?: UserItem[] } > extends PrizmAbstractTestId { @ContentChildren(PrizmNavigationMenuGroupComponent) - menuGroups!: QueryList>; + menuGroups: QueryList> = prizmEmptyQueryList(); @Output() homeClicked = new EventEmitter(); @Output() activeItemChanged = new EventEmitter(); diff --git a/libs/components/src/lib/components/slider/slider.component.ts b/libs/components/src/lib/components/slider/slider.component.ts index 0d6b474351..debd4b7a43 100644 --- a/libs/components/src/lib/components/slider/slider.component.ts +++ b/libs/components/src/lib/components/slider/slider.component.ts @@ -15,7 +15,7 @@ import { ViewChildren, } from '@angular/core'; import { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms'; -import { PrizmDestroyService } from '@prizm-ui/helpers'; +import { PrizmDestroyService, prizmEmptyQueryList } from '@prizm-ui/helpers'; import { fromEvent, merge, Observable } from 'rxjs'; import { distinctUntilChanged, map, startWith, switchMap, takeUntil, tap } from 'rxjs/operators'; @@ -57,7 +57,8 @@ export class PrizmSliderComponent @ViewChild('track') scrollbar!: ElementRef; - @ViewChildren(PrizmSliderCnobComponent) private _cnobs!: QueryList; + @ViewChildren(PrizmSliderCnobComponent) private _cnobs: QueryList = + prizmEmptyQueryList(); private get cnobs(): Observable> { return this._cnobs.changes.pipe(startWith(this._cnobs)); diff --git a/libs/components/src/lib/components/splitter/splitter.component.ts b/libs/components/src/lib/components/splitter/splitter.component.ts index 4a893af852..081990d199 100644 --- a/libs/components/src/lib/components/splitter/splitter.component.ts +++ b/libs/components/src/lib/components/splitter/splitter.component.ts @@ -19,7 +19,7 @@ import { PrizmSplitterOrientation } from './types'; import { asyncScheduler, BehaviorSubject, fromEvent, merge, Observable } from 'rxjs'; import { map, observeOn, startWith, switchMap, takeUntil, tap, withLatestFrom } from 'rxjs/operators'; -import { PrizmDestroyService } from '@prizm-ui/helpers'; +import { PrizmDestroyService, prizmEmptyQueryList } from '@prizm-ui/helpers'; import { PrizmSplitterGutterComponent } from './gutter/gutter.component'; import { PrizmSplitterAreaComponent } from './area/area.component'; @@ -55,10 +55,11 @@ export class PrizmSplitterComponent extends PrizmAbstractTestId implements After @ViewChild('container', { static: true }) private containerElement!: ElementRef; @ContentChild(PrizmSplitterCustomGutterDirective) customGutter!: PrizmSplitterCustomGutterDirective; - @ContentChildren(PrizmSplitterAreaComponent) splitterAreaQueryList!: QueryList; + @ContentChildren(PrizmSplitterAreaComponent) splitterAreaQueryList: QueryList = + prizmEmptyQueryList(); @ViewChildren(PrizmSplitterGutterComponent) - splitterGutterQueryList!: QueryList; + splitterGutterQueryList: QueryList = prizmEmptyQueryList(); override readonly testId_ = 'ui_splitter'; get gutterElementSize(): number { diff --git a/libs/components/src/lib/components/stepper/stepper-selector.component.ts b/libs/components/src/lib/components/stepper/stepper-selector.component.ts index 2388e9cf54..3af17dd422 100644 --- a/libs/components/src/lib/components/stepper/stepper-selector.component.ts +++ b/libs/components/src/lib/components/stepper/stepper-selector.component.ts @@ -5,6 +5,7 @@ import { PrizmStepperStepDirective } from './stepper-step.directive'; import { PrizmAbstractTestId } from '@prizm-ui/core'; import { CommonModule } from '@angular/common'; import { PrizmIconComponent } from '../icon/icon.component'; +import { prizmEmptyQueryList } from '@prizm-ui/helpers'; @Component({ selector: 'prizm-stepper-selector', @@ -28,7 +29,7 @@ export class PrizmStepperSelectorComponent extends PrizmAbstractTestId { @Output() selectStep = new EventEmitter(); @ViewChildren(PrizmStepperSelectorItemDirective) - selectorItems!: QueryList; + selectorItems: QueryList = prizmEmptyQueryList(); override readonly testId_ = 'ui_stepper--selector'; public clickOnStep(index: number): void { diff --git a/libs/components/src/lib/components/stepper/stepper.component.ts b/libs/components/src/lib/components/stepper/stepper.component.ts index 5d59fb2363..8a5b7efee3 100644 --- a/libs/components/src/lib/components/stepper/stepper.component.ts +++ b/libs/components/src/lib/components/stepper/stepper.component.ts @@ -15,6 +15,7 @@ import { PrizmStepperStepDirective } from './stepper-step.directive'; import { PrizmAbstractTestId } from '@prizm-ui/core'; import { CommonModule } from '@angular/common'; import { PrizmStepperSelectorComponent } from './stepper-selector.component'; +import { prizmEmptyQueryList } from '@prizm-ui/helpers'; @Component({ selector: 'prizm-stepper', @@ -40,7 +41,7 @@ export class PrizmStepperComponent extends PrizmAbstractTestId implements AfterC @Output() selectStep = new EventEmitter(); @ContentChildren(PrizmStepperStepDirective) - prizmStepperStepDirectiveQL!: QueryList; + prizmStepperStepDirectiveQL: QueryList = prizmEmptyQueryList(); steps$!: Observable; override readonly testId_ = 'ui_stepper'; diff --git a/libs/components/src/lib/components/table/directives/sort-by.directive.ts b/libs/components/src/lib/components/table/directives/sort-by.directive.ts index 93dfb36c71..8f7c6617a9 100644 --- a/libs/components/src/lib/components/table/directives/sort-by.directive.ts +++ b/libs/components/src/lib/components/table/directives/sort-by.directive.ts @@ -5,15 +5,14 @@ import { PrizmSortableDirective } from './sortable.directive'; import { PrizmTableDirective } from './table.directive'; import { PrizmComparator } from '../table.types'; import { prizmDefaultProp } from '@prizm-ui/core'; +import { prizmEmptyQueryList } from '@prizm-ui/helpers'; @Directive({ selector: `table[prizmTable][prizmSortBy]`, }) export class PrizmSortByDirective>> { @ContentChildren(PrizmSortableDirective, { descendants: true }) - private readonly sortables: QueryList> = new QueryList< - PrizmSortableDirective - >(); + private readonly sortables: QueryList> = prizmEmptyQueryList(); @Input() @prizmDefaultProp() diff --git a/libs/components/src/lib/components/table/tbody/tbody.component.ts b/libs/components/src/lib/components/table/tbody/tbody.component.ts index a1e239dbf5..0a1528080a 100644 --- a/libs/components/src/lib/components/table/tbody/tbody.component.ts +++ b/libs/components/src/lib/components/table/tbody/tbody.component.ts @@ -17,7 +17,7 @@ import { import { CollectionViewer, isDataSource, ListRange } from '@angular/cdk/collections'; import { prizmDefaultProp } from '@prizm-ui/core'; -import { PrizmDestroyService } from '@prizm-ui/helpers'; +import { PrizmDestroyService, prizmEmptyQueryList } from '@prizm-ui/helpers'; import { BehaviorSubject, isObservable, Observable } from 'rxjs'; import { switchMap, takeUntil, tap } from 'rxjs/operators'; import { PolymorphContent } from '../../../directives'; @@ -134,7 +134,7 @@ export class PrizmTbodyComponent>> readonly row?: PrizmRowDirective; @ContentChildren(forwardRef(() => PrizmTrComponent)) - readonly rows: QueryList> = new QueryList>(); + readonly rows: QueryList> = prizmEmptyQueryList(); columnsCount = 0; /** diff --git a/libs/components/src/lib/components/table/th-group/th-group.component.ts b/libs/components/src/lib/components/table/th-group/th-group.component.ts index 81b0c8d35b..974a1948b0 100644 --- a/libs/components/src/lib/components/table/th-group/th-group.component.ts +++ b/libs/components/src/lib/components/table/th-group/th-group.component.ts @@ -19,7 +19,7 @@ import { PrizmHeadDirective } from '../directives/head.directive'; import { PrizmTableDirective } from '../directives/table.directive'; import { PRIZM_TABLE_PROVIDER } from '../providers/table.provider'; import { PrizmThComponent } from '../th/th.component'; -import { moveInEventLoopIteration } from '@prizm-ui/helpers'; +import { moveInEventLoopIteration, prizmEmptyQueryList } from '@prizm-ui/helpers'; import { PrizmTableService } from '../table.service'; import { PrizmThGroupService } from './th-group.service'; @@ -49,14 +49,11 @@ export class PrizmThGroupComponent>> ); } - // @ContentChild(forwardRef(() => PrizmThComponent)) - // readonly th!: PrizmThComponent; - @ContentChildren(forwardRef(() => PrizmThComponent), { descendants: true }) - readonly th!: QueryList>; + readonly th: QueryList> = prizmEmptyQueryList(); @ContentChildren(forwardRef(() => PrizmHeadDirective)) - readonly heads: QueryList> = new QueryList>(); + readonly heads: QueryList> = prizmEmptyQueryList(); heads$: Observable[]> | null = null; diff --git a/libs/components/src/lib/components/table/tr/tr.component.ts b/libs/components/src/lib/components/table/tr/tr.component.ts index c6c7fed12d..f7886ece59 100644 --- a/libs/components/src/lib/components/table/tr/tr.component.ts +++ b/libs/components/src/lib/components/table/tr/tr.component.ts @@ -18,7 +18,7 @@ import { PrizmTableDirective } from '../directives/table.directive'; import { PRIZM_TABLE_PROVIDER } from '../providers/table.provider'; import { PrizmTbodyComponent } from '../tbody/tbody.component'; import { PrizmTableCellStatus } from '../table.types'; -import { PrizmDestroyService } from '@prizm-ui/helpers'; +import { PrizmDestroyService, prizmEmptyQueryList } from '@prizm-ui/helpers'; import { PrizmTableTreeService } from '../service/tree.service'; import { PrizmCellService } from '../directives/cell.service'; import { PrizmTdService } from '../td/td.service'; @@ -52,7 +52,7 @@ export class PrizmTrComponent>> { } @ContentChildren(forwardRef(() => PrizmCellDirective)) - readonly cells: QueryList = new QueryList(); + readonly cells: QueryList = prizmEmptyQueryList(); readonly cells$ = merge( this.cells.changes, diff --git a/libs/components/src/lib/components/tabs/tabs.component.ts b/libs/components/src/lib/components/tabs/tabs.component.ts index 0082d15f4e..ae4e3db26e 100644 --- a/libs/components/src/lib/components/tabs/tabs.component.ts +++ b/libs/components/src/lib/components/tabs/tabs.component.ts @@ -21,7 +21,12 @@ import { PrizmTabsService } from './tabs.service'; import { PrizmTabComponent } from './components/tab.component'; import { PrizmTabMenuItemDirective } from './tab-menu-item.directive'; import { PrizmDropdownHostComponent } from '../dropdowns/dropdown-host'; -import { PrizmCallFuncPipe, PrizmDestroyService, PrizmLetDirective } from '@prizm-ui/helpers'; +import { + PrizmCallFuncPipe, + PrizmDestroyService, + prizmEmptyQueryList, + PrizmLetDirective, +} from '@prizm-ui/helpers'; import { PrizmTabCanOpen } from './tabs.model'; import { PrizmAbstractTestId } from '../../abstract/interactive'; import { CommonModule } from '@angular/common'; @@ -84,10 +89,12 @@ export class PrizmTabsComponent extends PrizmAbstractTestId implements OnInit, O @ViewChild('tabsContainer', { static: true }) public tabsContainer!: ElementRef; @ViewChild('tabsDropdown', { static: true }) public tabsDropdown!: PrizmDropdownHostComponent; public tabsMoreDropdown!: PrizmDropdownHostComponent; + @ContentChildren(PrizmTabComponent, { descendants: true }) - public tabElements!: QueryList; + public tabElements: QueryList = prizmEmptyQueryList(); + @ContentChildren(PrizmTabMenuItemDirective, { read: TemplateRef, descendants: true }) - public menuElements!: QueryList>; + public menuElements: QueryList> = prizmEmptyQueryList(); override readonly testId_ = 'ui_tabs'; diff --git a/libs/doc/base/src/lib/components/documentation/documentation.component.ts b/libs/doc/base/src/lib/components/documentation/documentation.component.ts index ddaa53c83c..f1e18e16b5 100644 --- a/libs/doc/base/src/lib/components/documentation/documentation.component.ts +++ b/libs/doc/base/src/lib/components/documentation/documentation.component.ts @@ -12,7 +12,6 @@ import { ViewChildren, } from '@angular/core'; import { - EMPTY_QUERY, tuiHexToRgb, tuiIsNumber, tuiIsString, @@ -31,7 +30,7 @@ import { PrizmDocHostElementListenerService } from '../host'; import orderBy from 'lodash-es/orderBy'; import { PrizmDocumentationPropertyType } from '../../types/pages'; import { UntypedFormControl, Validators } from '@angular/forms'; -import { PrizmFormControlHelpers } from '@prizm-ui/helpers'; +import { prizmEmptyQueryList, PrizmFormControlHelpers } from '@prizm-ui/helpers'; // @bad TODO subscribe propertiesConnectors changes // @bad TODO refactor to make more flexible @Component({ @@ -89,10 +88,12 @@ export class PrizmDocDocumentationComponent implements AfterContentInit { isAPI = false; @ContentChildren(PrizmDocDocumentationPropertyConnectorDirective) - propertiesConnectors: QueryList> = EMPTY_QUERY; + propertiesConnectors: QueryList> = + prizmEmptyQueryList(); @ViewChildren(PrizmDocDocumentationPropertyConnectorDirective) - propertiesInnerConnectors: QueryList> = EMPTY_QUERY; + propertiesInnerConnectors: QueryList> = + prizmEmptyQueryList(); activeItemIndex = 0; testIdPostfix = ''; diff --git a/libs/doc/base/src/lib/components/page/page.component.ts b/libs/doc/base/src/lib/components/page/page.component.ts index 9bc1224d02..190f3ed83c 100644 --- a/libs/doc/base/src/lib/components/page/page.component.ts +++ b/libs/doc/base/src/lib/components/page/page.component.ts @@ -9,12 +9,12 @@ import { QueryList, SimpleChanges, } from '@angular/core'; -import { EMPTY_QUERY } from '@taiga-ui/cdk'; import { PRIZM_DOC_DEFAULT_TABS } from '../../tokens/default-tabs'; import { PAGE_PROVIDERS, PAGE_SEE_ALSO } from './page.providers'; import { PrizmDocPageTabConnectorDirective } from './page-tab.directive'; import { PrizmPageService } from './page.service'; +import { prizmEmptyQueryList } from '@prizm-ui/helpers'; @Component({ selector: `prizm-doc-page`, @@ -37,7 +37,7 @@ export class PrizmDocPageComponent implements OnChanges { path = ``; @ContentChildren(PrizmDocPageTabConnectorDirective) - readonly tabConnectors: QueryList = EMPTY_QUERY; + readonly tabConnectors: QueryList = prizmEmptyQueryList(); activeItemIndex = NaN; diff --git a/libs/helpers/src/lib/util/common.ts b/libs/helpers/src/lib/util/common.ts index 39be3bdc98..e070959287 100644 --- a/libs/helpers/src/lib/util/common.ts +++ b/libs/helpers/src/lib/util/common.ts @@ -1,3 +1,5 @@ +import { QueryList } from '@angular/core'; + /** * sort number, string, date by asc or desc * */ @@ -23,3 +25,7 @@ export function prizmSort(x: T, y: T, asc = true): number { return result; } + +export function prizmEmptyQueryList() { + return new QueryList(); +}