Commit e103d5a88b3f46a963d74e7297529dd66ae16d4b
1 parent
c9e3a62f
UI: Entity details panel improvements
Showing
2 changed files
with
65 additions
and
31 deletions
@@ -227,7 +227,7 @@ | @@ -227,7 +227,7 @@ | ||
227 | </table> | 227 | </table> |
228 | <span [fxShow]="!(isLoading$ | async) && (dataSource.isEmpty() | async)" | 228 | <span [fxShow]="!(isLoading$ | async) && (dataSource.isEmpty() | async)" |
229 | fxLayoutAlign="center center" | 229 | fxLayoutAlign="center center" |
230 | - class="no-data-found" translate>{{ translations.noEntities }}</span> | 230 | + class="no-data-found">{{ translations.noEntities | translate }}</span> |
231 | </div> | 231 | </div> |
232 | <mat-divider *ngIf="displayPagination"></mat-divider> | 232 | <mat-divider *ngIf="displayPagination"></mat-divider> |
233 | <mat-paginator *ngIf="displayPagination" | 233 | <mat-paginator *ngIf="displayPagination" |
@@ -18,7 +18,7 @@ import { | @@ -18,7 +18,7 @@ import { | ||
18 | AfterViewInit, | 18 | AfterViewInit, |
19 | ChangeDetectionStrategy, ChangeDetectorRef, | 19 | ChangeDetectionStrategy, ChangeDetectorRef, |
20 | Component, | 20 | Component, |
21 | - ComponentFactoryResolver, | 21 | + ComponentFactoryResolver, ComponentRef, |
22 | EventEmitter, Injector, | 22 | EventEmitter, Injector, |
23 | Input, | 23 | Input, |
24 | OnDestroy, | 24 | OnDestroy, |
@@ -60,7 +60,10 @@ export class EntityDetailsPanelComponent extends PageComponent implements OnInit | @@ -60,7 +60,10 @@ export class EntityDetailsPanelComponent extends PageComponent implements OnInit | ||
60 | @Output() | 60 | @Output() |
61 | entityAction = new EventEmitter<EntityAction<BaseData<HasId>>>(); | 61 | entityAction = new EventEmitter<EntityAction<BaseData<HasId>>>(); |
62 | 62 | ||
63 | + entityComponentRef: ComponentRef<EntityComponent<BaseData<HasId>>>; | ||
63 | entityComponent: EntityComponent<BaseData<HasId>>; | 64 | entityComponent: EntityComponent<BaseData<HasId>>; |
65 | + | ||
66 | + entityTabsComponentRef: ComponentRef<EntityTabsComponent<BaseData<HasId>>>; | ||
64 | entityTabsComponent: EntityTabsComponent<BaseData<HasId>>; | 67 | entityTabsComponent: EntityTabsComponent<BaseData<HasId>>; |
65 | detailsForm: NgForm; | 68 | detailsForm: NgForm; |
66 | 69 | ||
@@ -84,7 +87,9 @@ export class EntityDetailsPanelComponent extends PageComponent implements OnInit | @@ -84,7 +87,9 @@ export class EntityDetailsPanelComponent extends PageComponent implements OnInit | ||
84 | editingEntity: BaseData<HasId>; | 87 | editingEntity: BaseData<HasId>; |
85 | 88 | ||
86 | private currentEntityId: HasId; | 89 | private currentEntityId: HasId; |
87 | - private entityActionSubscription: Subscription; | 90 | + private subscriptions: Subscription[] = []; |
91 | + private viewInited = false; | ||
92 | + private pendingTabs: MatTab[]; | ||
88 | 93 | ||
89 | constructor(protected store: Store<AppState>, | 94 | constructor(protected store: Store<AppState>, |
90 | private injector: Injector, | 95 | private injector: Injector, |
@@ -103,12 +108,14 @@ export class EntityDetailsPanelComponent extends PageComponent implements OnInit | @@ -103,12 +108,14 @@ export class EntityDetailsPanelComponent extends PageComponent implements OnInit | ||
103 | 108 | ||
104 | @Input() | 109 | @Input() |
105 | set entitiesTableConfig(entitiesTableConfig: EntityTableConfig<BaseData<HasId>>) { | 110 | set entitiesTableConfig(entitiesTableConfig: EntityTableConfig<BaseData<HasId>>) { |
106 | - this.entitiesTableConfigValue = entitiesTableConfig; | ||
107 | - if (this.entityComponent) { | ||
108 | - this.entityComponent.entitiesTableConfig = entitiesTableConfig; | ||
109 | - } | ||
110 | - if (this.entityTabsComponent) { | ||
111 | - this.entityTabsComponent.entitiesTableConfig = entitiesTableConfig; | 111 | + if (this.entitiesTableConfigValue !== entitiesTableConfig) { |
112 | + this.entitiesTableConfigValue = entitiesTableConfig; | ||
113 | + if (this.entitiesTableConfigValue) { | ||
114 | + this.currentEntityId = null; | ||
115 | + this.isEdit = false; | ||
116 | + this.entity = null; | ||
117 | + this.init(); | ||
118 | + } | ||
112 | } | 119 | } |
113 | } | 120 | } |
114 | 121 | ||
@@ -131,19 +138,33 @@ export class EntityDetailsPanelComponent extends PageComponent implements OnInit | @@ -131,19 +138,33 @@ export class EntityDetailsPanelComponent extends PageComponent implements OnInit | ||
131 | } | 138 | } |
132 | 139 | ||
133 | ngOnInit(): void { | 140 | ngOnInit(): void { |
141 | + this.init(); | ||
142 | + } | ||
143 | + | ||
144 | + private init() { | ||
134 | this.translations = this.entitiesTableConfig.entityTranslations; | 145 | this.translations = this.entitiesTableConfig.entityTranslations; |
135 | this.resources = this.entitiesTableConfig.entityResources; | 146 | this.resources = this.entitiesTableConfig.entityResources; |
136 | this.buildEntityComponent(); | 147 | this.buildEntityComponent(); |
137 | } | 148 | } |
138 | 149 | ||
150 | + private clearSubscriptions() { | ||
151 | + this.subscriptions.forEach((subscription) => { | ||
152 | + subscription.unsubscribe(); | ||
153 | + }); | ||
154 | + this.subscriptions.length = 0; | ||
155 | + } | ||
156 | + | ||
139 | ngOnDestroy(): void { | 157 | ngOnDestroy(): void { |
140 | super.ngOnDestroy(); | 158 | super.ngOnDestroy(); |
141 | - if (this.entityActionSubscription) { | ||
142 | - this.entityActionSubscription.unsubscribe(); | ||
143 | - } | 159 | + this.clearSubscriptions(); |
144 | } | 160 | } |
145 | 161 | ||
146 | buildEntityComponent() { | 162 | buildEntityComponent() { |
163 | + this.clearSubscriptions(); | ||
164 | + if (this.entityComponentRef) { | ||
165 | + this.entityComponentRef.destroy(); | ||
166 | + this.entityComponentRef = null; | ||
167 | + } | ||
147 | const componentFactory = this.componentFactoryResolver.resolveComponentFactory(this.entitiesTableConfig.entityComponent); | 168 | const componentFactory = this.componentFactoryResolver.resolveComponentFactory(this.entitiesTableConfig.entityComponent); |
148 | const viewContainerRef = this.entityDetailsFormAnchor.viewContainerRef; | 169 | const viewContainerRef = this.entityDetailsFormAnchor.viewContainerRef; |
149 | viewContainerRef.clear(); | 170 | viewContainerRef.clear(); |
@@ -162,29 +183,46 @@ export class EntityDetailsPanelComponent extends PageComponent implements OnInit | @@ -162,29 +183,46 @@ export class EntityDetailsPanelComponent extends PageComponent implements OnInit | ||
162 | parent: this.injector | 183 | parent: this.injector |
163 | } | 184 | } |
164 | ); | 185 | ); |
165 | - const componentRef = viewContainerRef.createComponent(componentFactory, 0, injector); | ||
166 | - this.entityComponent = componentRef.instance; | 186 | + this.entityComponentRef = viewContainerRef.createComponent(componentFactory, 0, injector); |
187 | + this.entityComponent = this.entityComponentRef.instance; | ||
167 | this.entityComponent.isEdit = this.isEdit; | 188 | this.entityComponent.isEdit = this.isEdit; |
168 | this.detailsForm = this.entityComponent.entityNgForm; | 189 | this.detailsForm = this.entityComponent.entityNgForm; |
169 | - this.entityActionSubscription = this.entityComponent.entityAction.subscribe((action) => { | 190 | + this.subscriptions.push(this.entityComponent.entityAction.subscribe((action) => { |
170 | this.entityAction.emit(action); | 191 | this.entityAction.emit(action); |
171 | - }); | 192 | + })); |
172 | this.buildEntityTabsComponent(); | 193 | this.buildEntityTabsComponent(); |
173 | - this.entityComponent.entityForm.valueChanges.subscribe(() => { | 194 | + this.subscriptions.push(this.entityComponent.entityForm.valueChanges.subscribe(() => { |
174 | this.cd.detectChanges(); | 195 | this.cd.detectChanges(); |
175 | - }); | 196 | + })); |
176 | } | 197 | } |
177 | 198 | ||
178 | buildEntityTabsComponent() { | 199 | buildEntityTabsComponent() { |
200 | + if (this.entityTabsComponentRef) { | ||
201 | + this.entityTabsComponentRef.destroy(); | ||
202 | + this.entityTabsComponentRef = null; | ||
203 | + } | ||
204 | + const viewContainerRef = this.entityTabsAnchor.viewContainerRef; | ||
205 | + viewContainerRef.clear(); | ||
206 | + this.entityTabsComponent = null; | ||
179 | if (this.entitiesTableConfig.entityTabsComponent) { | 207 | if (this.entitiesTableConfig.entityTabsComponent) { |
180 | const componentTabsFactory = this.componentFactoryResolver.resolveComponentFactory(this.entitiesTableConfig.entityTabsComponent); | 208 | const componentTabsFactory = this.componentFactoryResolver.resolveComponentFactory(this.entitiesTableConfig.entityTabsComponent); |
181 | - const viewContainerRef = this.entityTabsAnchor.viewContainerRef; | ||
182 | - viewContainerRef.clear(); | ||
183 | - const componentTabsRef = viewContainerRef.createComponent(componentTabsFactory); | ||
184 | - this.entityTabsComponent = componentTabsRef.instance; | 209 | + this.entityTabsComponentRef = viewContainerRef.createComponent(componentTabsFactory); |
210 | + this.entityTabsComponent = this.entityTabsComponentRef.instance; | ||
185 | this.entityTabsComponent.isEdit = this.isEdit; | 211 | this.entityTabsComponent.isEdit = this.isEdit; |
186 | this.entityTabsComponent.entitiesTableConfig = this.entitiesTableConfig; | 212 | this.entityTabsComponent.entitiesTableConfig = this.entitiesTableConfig; |
187 | this.entityTabsComponent.detailsForm = this.detailsForm; | 213 | this.entityTabsComponent.detailsForm = this.detailsForm; |
214 | + this.subscriptions.push(this.entityTabsComponent.entityTabsChanged.subscribe( | ||
215 | + (entityTabs) => { | ||
216 | + if (entityTabs) { | ||
217 | + if (this.viewInited) { | ||
218 | + this.matTabGroup._tabs.reset([...this.inclusiveTabs.toArray(), ...entityTabs]); | ||
219 | + this.matTabGroup._tabs.notifyOnChanges(); | ||
220 | + } else { | ||
221 | + this.pendingTabs = entityTabs; | ||
222 | + } | ||
223 | + } | ||
224 | + } | ||
225 | + )); | ||
188 | } | 226 | } |
189 | } | 227 | } |
190 | 228 | ||
@@ -254,15 +292,11 @@ export class EntityDetailsPanelComponent extends PageComponent implements OnInit | @@ -254,15 +292,11 @@ export class EntityDetailsPanelComponent extends PageComponent implements OnInit | ||
254 | } | 292 | } |
255 | 293 | ||
256 | ngAfterViewInit(): void { | 294 | ngAfterViewInit(): void { |
257 | - if (this.entityTabsComponent) { | ||
258 | - this.entityTabsComponent.entityTabsChanged.subscribe( | ||
259 | - (entityTabs) => { | ||
260 | - if (entityTabs) { | ||
261 | - this.matTabGroup._tabs.reset([...this.inclusiveTabs.toArray(), ...entityTabs]); | ||
262 | - this.matTabGroup._tabs.notifyOnChanges(); | ||
263 | - } | ||
264 | - } | ||
265 | - ); | 295 | + this.viewInited = true; |
296 | + if (this.pendingTabs) { | ||
297 | + this.matTabGroup._tabs.reset([...this.inclusiveTabs.toArray(), ...this.pendingTabs]); | ||
298 | + this.matTabGroup._tabs.notifyOnChanges(); | ||
299 | + this.pendingTabs = null; | ||
266 | } | 300 | } |
267 | } | 301 | } |
268 | 302 |