Skip to content

Commit 3e8cf25

Browse files
refactor nesteds
1 parent cc6eca2 commit 3e8cf25

1,451 files changed

Lines changed: 20117 additions & 10143 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

packages/devextreme-angular/src/core/component.ts

Lines changed: 11 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ import {
1919
createNgModule,
2020
inject,
2121
Injector,
22-
InjectionToken, ContentChildren,
22+
ContentChildren,
2323
} from '@angular/core';
2424

2525
import { isPlatformServer } from '@angular/common';
@@ -71,8 +71,15 @@ export abstract class DxComponent implements OnChanges, OnInit, DoCheck, AfterCo
7171
private readonly _collectionContainerImpl: ICollectionNestedOptionContainer;
7272

7373
@ContentChildren(NESTED_ITEM_TOKEN)
74-
set _nestedItems(value) {
75-
_updateNestedItems(value, this._setChildren.bind(this))
74+
set _nestedItems(value: QueryList<{ propertyName: string, className: string, component: ICollectionNestedOption}>) {
75+
_updateNestedItems(
76+
value,
77+
this.setChildren.bind(this),
78+
{
79+
componentClassName: this.constructor.name,
80+
legacyClassNames: this.getLegacyClassNames(),
81+
}
82+
);
7683
}
7784

7885
eventHelper: EmitterHelper;
@@ -224,12 +231,6 @@ export abstract class DxComponent implements OnChanges, OnInit, DoCheck, AfterCo
224231
}
225232
}
226233

227-
_setChildren(propertyName, value, className = '') {
228-
if (this.checkContentChildren(propertyName, value)) {
229-
this.setChildren(propertyName, value);
230-
}
231-
}
232-
233234
constructor(
234235
protected element: ElementRef,
235236
private readonly ngZone: NgZone,
@@ -314,24 +315,7 @@ export abstract class DxComponent implements OnChanges, OnInit, DoCheck, AfterCo
314315
this.templateUpdateRequired = true;
315316
}
316317

317-
protected getLegacyClassNames = (propertyName?: string) => [];
318-
319-
checkContentChildren<T>(propertyName: string, items: QueryList<T>) {
320-
const legacyClassNames = this.getLegacyClassNames(propertyName);
321-
const legacyItem = items.find((item) => legacyClassNames.includes(item.constructor.name));
322-
const notLegacyItem = legacyItem && items.find((item) => !legacyClassNames.includes(item.constructor.name));
323-
324-
if (legacyItem && notLegacyItem) {
325-
if (console && console.warn) {
326-
console.warn(`In ${this.constructor.name},
327-
the nested ${legacyItem.constructor.name} and ${notLegacyItem.constructor.name} components are incompatible.
328-
Ensure that all nested components in the content area match.`);
329-
}
330-
return false;
331-
}
332-
333-
return true;
334-
}
318+
protected getLegacyClassNames: () => Record<string, string[]> = () => ({});
335319

336320
setChildren<T extends ICollectionNestedOption>(propertyName: string, items: QueryList<T>) {
337321
this.resetOptions(propertyName);

packages/devextreme-angular/src/core/nested-option.ts

Lines changed: 40 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -24,16 +24,39 @@ export interface INestedOptionContainer {
2424

2525
export type IOptionPathGetter = () => string;
2626

27+
const warnAboutIncompatibleNestedItems = (containerClassName: string, itemClassName: string, anotherItemClassName: string) => {
28+
if (console && console.warn) {
29+
console.warn(`In ${containerClassName},
30+
the nested ${itemClassName} and ${anotherItemClassName} components are incompatible.
31+
Ensure that all nested components in the content area match.`);
32+
}
33+
}
34+
2735
export const _updateNestedItems = (
28-
items: QueryList<{ propertyName: string, component: ICollectionNestedOption}>,
29-
setChildrenFn: (propertyName: string, items: QueryList<ICollectionNestedOption>) => void
36+
items: QueryList<{ propertyName: string, className: string, component: ICollectionNestedOption}>,
37+
setChildrenFn: (propertyName: string, items: QueryList<ICollectionNestedOption>) => void,
38+
{ componentClassName, legacyClassNames }: { componentClassName: string, legacyClassNames: Record<string, string[]> }
3039
) => {
31-
const groupedItems = items.reduce((acc, { propertyName, component }) => {
32-
acc[propertyName] = acc[propertyName] || [];
33-
acc[propertyName].push(component);
34-
35-
return acc;
36-
}, {});
40+
let hasLegacy = {};
41+
const groupedItems = {}
42+
43+
for (let index = 0; index < items.length; index++) {
44+
const { propertyName, className, component } = items.get(index);
45+
46+
groupedItems[propertyName] = groupedItems[propertyName] || [];
47+
groupedItems[propertyName].push(component);
48+
49+
if (legacyClassNames) {
50+
const isLegacyClassName = legacyClassNames[propertyName].includes(className);
51+
52+
if (index === 0) {
53+
hasLegacy[propertyName] = isLegacyClassName;
54+
} else if (hasLegacy[propertyName] !== isLegacyClassName) {
55+
warnAboutIncompatibleNestedItems(componentClassName, items.get(0).className, className);
56+
return;
57+
}
58+
}
59+
}
3760

3861
Object.entries(groupedItems).forEach(([propertyName, components]: [string, ICollectionNestedOption[]]) => {
3962
const queryList = new QueryList<ICollectionNestedOption>();
@@ -225,8 +248,15 @@ export abstract class CollectionNestedOption extends BaseNestedOption implements
225248
_index: number;
226249

227250
@ContentChildren(NESTED_ITEM_TOKEN)
228-
set _nestedItems(value) {
229-
_updateNestedItems(value, this.setChildren.bind(this));
251+
set _nestedItems(value: QueryList<{ propertyName: string, className: string, component: ICollectionNestedOption}>) {
252+
_updateNestedItems(
253+
value,
254+
this.setChildren.bind(this),
255+
{
256+
componentClassName: this.constructor.name,
257+
legacyClassNames: null,
258+
}
259+
);
230260
}
231261

232262
protected _fullOptionPath() {

packages/devextreme-angular/src/ui/accordion/index.ts

Lines changed: 15 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,7 @@ import {
1616
EventEmitter,
1717
OnChanges,
1818
DoCheck,
19-
SimpleChanges,
20-
ContentChildren,
21-
QueryList
19+
SimpleChanges
2220
} from '@angular/core';
2321

2422
export { ExplicitTypes } from 'devextreme/ui/accordion';
@@ -45,10 +43,6 @@ import { DxiItemModule } from 'devextreme-angular/ui/nested';
4543

4644
import { DxiAccordionItemModule } from 'devextreme-angular/ui/accordion/nested';
4745

48-
import { DxiItemComponent } from 'devextreme-angular/ui/nested';
49-
50-
import { DxiAccordionItemComponent } from 'devextreme-angular/ui/accordion/nested';
51-
5246

5347
/**
5448
* [descr:dxAccordion]
@@ -712,22 +706,20 @@ export class DxAccordionComponent<TItem = any, TKey = any> extends DxComponent i
712706

713707

714708

715-
@ContentChildren(DxiAccordionItemComponent)
716-
get itemsChildren(): QueryList<DxiAccordionItemComponent> {
717-
return this._getOption('items');
718-
}
719-
set itemsChildren(value) {
720-
this._setChildren('items', value, 'DxiAccordionItemComponent');
721-
}
722-
723-
724-
@ContentChildren(DxiItemComponent)
725-
get itemsLegacyChildren(): QueryList<DxiItemComponent> {
726-
return this._getOption('items');
727-
}
728-
set itemsLegacyChildren(value) {
729-
this._setChildren('items', value, 'DxiItemComponent');
730-
}
709+
protected getLegacyClassNames = () => {
710+
const legacyClassNames = {};
711+
712+
const getLegacyClassNamesForPropertyName = (propName) => {
713+
legacyClassNames[propName] = legacyClassNames[propName] || [];
714+
return legacyClassNames[propName];
715+
};
716+
717+
718+
getLegacyClassNamesForPropertyName('items').push('DxiItemComponent');
719+
720+
721+
return legacyClassNames || {};
722+
};
731723

732724

733725

packages/devextreme-angular/src/ui/accordion/nested/item-dxi.ts

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ import { DOCUMENT } from '@angular/common';
1818

1919

2020
import {
21+
NESTED_ITEM_TOKEN,
2122
DxIntegrationModule,
2223
NestedOptionHost,
2324
extractTemplate,
@@ -27,14 +28,25 @@ import {
2728
} from 'devextreme-angular/core';
2829
import { CollectionNestedOption } from 'devextreme-angular/core';
2930

30-
3131
@Component({
3232
selector: 'dxi-accordion-item',
3333
standalone: true,
3434
template: '<ng-content></ng-content>',
3535
styles: [':host { display: block; }'],
3636
imports: [ DxIntegrationModule ],
37-
providers: [NestedOptionHost, DxTemplateHost]
37+
providers: [
38+
NestedOptionHost,
39+
DxTemplateHost,
40+
{
41+
provide: NESTED_ITEM_TOKEN,
42+
useFactory: (component: DxiAccordionItemComponent) => ({
43+
propertyName: 'items',
44+
className: 'DxiAccordionItemComponent',
45+
component
46+
}),
47+
deps: [DxiAccordionItemComponent],
48+
}
49+
]
3850
})
3951
export class DxiAccordionItemComponent extends CollectionNestedOption implements AfterViewInit,
4052
IDxTemplateHost {
@@ -107,7 +119,6 @@ export class DxiAccordionItemComponent extends CollectionNestedOption implements
107119
return 'items';
108120
}
109121

110-
111122
constructor(@SkipSelf() @Host() parentOptionHost: NestedOptionHost,
112123
@Host() optionHost: NestedOptionHost,
113124
private renderer: Renderer2,

packages/devextreme-angular/src/ui/action-sheet/index.ts

Lines changed: 15 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,7 @@ import {
1616
EventEmitter,
1717
OnChanges,
1818
DoCheck,
19-
SimpleChanges,
20-
ContentChildren,
21-
QueryList
19+
SimpleChanges
2220
} from '@angular/core';
2321

2422
export { ExplicitTypes } from 'devextreme/ui/action_sheet';
@@ -45,10 +43,6 @@ import { DxiItemModule } from 'devextreme-angular/ui/nested';
4543

4644
import { DxiActionSheetItemModule } from 'devextreme-angular/ui/action-sheet/nested';
4745

48-
import { DxiItemComponent } from 'devextreme-angular/ui/nested';
49-
50-
import { DxiActionSheetItemComponent } from 'devextreme-angular/ui/action-sheet/nested';
51-
5246

5347
/**
5448
* [descr:dxActionSheet]
@@ -504,22 +498,20 @@ export class DxActionSheetComponent<TItem = any, TKey = any> extends DxComponent
504498

505499

506500

507-
@ContentChildren(DxiActionSheetItemComponent)
508-
get itemsChildren(): QueryList<DxiActionSheetItemComponent> {
509-
return this._getOption('items');
510-
}
511-
set itemsChildren(value) {
512-
this._setChildren('items', value, 'DxiActionSheetItemComponent');
513-
}
514-
515-
516-
@ContentChildren(DxiItemComponent)
517-
get itemsLegacyChildren(): QueryList<DxiItemComponent> {
518-
return this._getOption('items');
519-
}
520-
set itemsLegacyChildren(value) {
521-
this._setChildren('items', value, 'DxiItemComponent');
522-
}
501+
protected getLegacyClassNames = () => {
502+
const legacyClassNames = {};
503+
504+
const getLegacyClassNamesForPropertyName = (propName) => {
505+
legacyClassNames[propName] = legacyClassNames[propName] || [];
506+
return legacyClassNames[propName];
507+
};
508+
509+
510+
getLegacyClassNamesForPropertyName('items').push('DxiItemComponent');
511+
512+
513+
return legacyClassNames || {};
514+
};
523515

524516

525517

packages/devextreme-angular/src/ui/action-sheet/nested/item-dxi.ts

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ import { NativeEventInfo } from 'devextreme/common/core/events';
2020
import { ButtonStyle, ButtonType } from 'devextreme/common';
2121

2222
import {
23+
NESTED_ITEM_TOKEN,
2324
DxIntegrationModule,
2425
NestedOptionHost,
2526
extractTemplate,
@@ -29,14 +30,25 @@ import {
2930
} from 'devextreme-angular/core';
3031
import { CollectionNestedOption } from 'devextreme-angular/core';
3132

32-
3333
@Component({
3434
selector: 'dxi-action-sheet-item',
3535
standalone: true,
3636
template: '<ng-content></ng-content>',
3737
styles: [':host { display: block; }'],
3838
imports: [ DxIntegrationModule ],
39-
providers: [NestedOptionHost, DxTemplateHost]
39+
providers: [
40+
NestedOptionHost,
41+
DxTemplateHost,
42+
{
43+
provide: NESTED_ITEM_TOKEN,
44+
useFactory: (component: DxiActionSheetItemComponent) => ({
45+
propertyName: 'items',
46+
className: 'DxiActionSheetItemComponent',
47+
component
48+
}),
49+
deps: [DxiActionSheetItemComponent],
50+
}
51+
]
4052
})
4153
export class DxiActionSheetItemComponent extends CollectionNestedOption implements AfterViewInit,
4254
IDxTemplateHost {
@@ -101,7 +113,6 @@ export class DxiActionSheetItemComponent extends CollectionNestedOption implemen
101113
return 'items';
102114
}
103115

104-
105116
constructor(@SkipSelf() @Host() parentOptionHost: NestedOptionHost,
106117
@Host() optionHost: NestedOptionHost,
107118
private renderer: Renderer2,

0 commit comments

Comments
 (0)