Commit e103d5a88b3f46a963d74e7297529dd66ae16d4b

Authored by Igor Kulikov
1 parent c9e3a62f

UI: Entity details panel improvements

@@ -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