Skip to content

Commit 244de2e

Browse files
committed
[NAE-2034] Otvorenie prvého viewu
- implement resolving of auto-select views in double-drawer
1 parent db9f0fb commit 244de2e

File tree

3 files changed

+73
-5
lines changed

3 files changed

+73
-5
lines changed

projects/netgrif-components-core/src/lib/navigation/model/group-navigation-constants.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -175,4 +175,14 @@ export enum GroupNavigationConstants {
175175
* */
176176
ITEM_FIELD_ID_CHILD_ITEM_IDS = 'childItemIds',
177177

178+
/**
179+
* Boolean field, that is true if item contains view, that should be automatically opened.
180+
* */
181+
ITEM_FIELD_ID_IS_AUTO_SELECT = 'is_auto_select',
182+
183+
/**
184+
* Boolean field, that is true if item contains view.
185+
* */
186+
ITEM_FIELD_CONTAINS_FILTER = 'contains_filter',
187+
178188
}

projects/netgrif-components-core/src/lib/navigation/navigation-double-drawer/abstract-navigation-double-drawer.ts

Lines changed: 57 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import {ActivatedRoute, Router} from '@angular/router';
55
import {TranslateService} from '@ngx-translate/core';
66
import {ResizeEvent} from 'angular-resizable-element';
77
import {Observable, of, Subscription} from 'rxjs';
8-
import {map} from 'rxjs/operators';
8+
import {filter, map, take} from 'rxjs/operators';
99
import {RoleAccess, View} from '../../../commons/schema';
1010
import {AccessService} from '../../authorization/permission/access.service';
1111
import {ConfigurationService} from '../../configuration/configuration.service';
@@ -21,6 +21,7 @@ import {Page} from '../../resources/interface/page';
2121
import {
2222
DynamicNavigationRouteProviderService,
2323
} from '../../routing/dynamic-navigation-route-provider/dynamic-navigation-route-provider.service';
24+
import { RedirectService } from '../../routing/redirect-service/redirect.service';
2425
import {NAE_ROUTING_CONFIGURATION_PATH} from '../../routing/routing-builder/routing-builder.service';
2526
import {LanguageService} from '../../translate/language.service';
2627
import {User} from '../../user/models/user';
@@ -111,9 +112,15 @@ export abstract class AbstractNavigationDoubleDrawerComponent implements OnInit,
111112
*/
112113
protected _currentNode: UriNodeResource;
113114

115+
/**
116+
* Currently selected navigation item
117+
*/
118+
protected _currentNavigationItem: NavigationItem;
119+
114120
leftLoading$: LoadingEmitter;
115121
rightLoading$: LoadingEmitter;
116122
nodeLoading$: LoadingEmitter;
123+
isRightSideInitialized: boolean;
117124

118125
protected _configLeftMenu: ConfigDoubleMenu = {
119126
mode: 'side',
@@ -143,15 +150,18 @@ export abstract class AbstractNavigationDoubleDrawerComponent implements OnInit,
143150
protected _caseResourceService: CaseResourceService,
144151
protected _impersonationUserSelect: ImpersonationUserSelectService,
145152
protected _impersonation: ImpersonationService,
146-
protected _dynamicRoutingService: DynamicNavigationRouteProviderService) {
153+
protected _dynamicRoutingService: DynamicNavigationRouteProviderService,
154+
protected _redirectService: RedirectService) {
147155
this.leftItems = new Array<NavigationItem>();
148156
this.rightItems = new Array<NavigationItem>();
149157
this.leftLoading$ = new LoadingEmitter();
150158
this.rightLoading$ = new LoadingEmitter();
151159
this.nodeLoading$ = new LoadingEmitter();
160+
this.isRightSideInitialized = false;
152161
this.itemsOrder = MenuOrder.Ascending;
153162
this.hiddenCustomItems = [];
154163
this.moreItems = new Array<NavigationItem>();
164+
this._currentNavigationItem = null;
155165
this._childCustomViews = {};
156166
}
157167

@@ -168,6 +178,14 @@ export abstract class AbstractNavigationDoubleDrawerComponent implements OnInit,
168178
this.currentNode = node;
169179
});
170180

181+
this.rightLoading$.pipe(
182+
filter(() => this.isRightSideInitialized === true),
183+
filter(isRightLoading => isRightLoading === false),
184+
take(1)
185+
).subscribe(()=> {
186+
this.openAvailableView();
187+
})
188+
171189
const viewConfigurationPath = this._activatedRoute.snapshot.data[NAE_ROUTING_CONFIGURATION_PATH];
172190
if (!!viewConfigurationPath) {
173191
const viewConfiguration = this._config.getViewByPath(viewConfigurationPath);
@@ -347,6 +365,7 @@ export abstract class AbstractNavigationDoubleDrawerComponent implements OnInit,
347365
}
348366

349367
onItemClick(item: NavigationItem): void {
368+
this._currentNavigationItem = item;
350369
if (item.resource === undefined) {
351370
// custom view represented only in nae.json
352371
if (item.processUri === this.currentNode.uriPath) {
@@ -361,6 +380,12 @@ export abstract class AbstractNavigationDoubleDrawerComponent implements OnInit,
361380
this._uriService.getNodeByPath(path).subscribe(node => {
362381
this._uriService.activeNode = node;
363382
this.itemClicked.emit({uriNode: this._uriService.activeNode, isHome: false});
383+
this.rightLoading$.pipe(
384+
filter(isRightLoading => isRightLoading === false),
385+
take(1)
386+
).subscribe(()=> {
387+
this.openAvailableView();
388+
})
364389
}, error => {
365390
this._log.error(error);
366391
});
@@ -374,10 +399,39 @@ export abstract class AbstractNavigationDoubleDrawerComponent implements OnInit,
374399
}
375400
}
376401

402+
protected openAvailableView() {
403+
let allItems: Array<NavigationItem> = this.rightItems.concat(this.moreItems);
404+
405+
let autoOpenItems: Array<NavigationItem> = allItems.filter(item => this.hasItemAutoOpenView(item));
406+
if (autoOpenItems.length > 0) {
407+
this._redirectService.redirect(autoOpenItems[0].routing.path);
408+
return;
409+
}
410+
411+
if (this.hasItemView(this._currentNavigationItem)) {
412+
// is routed by routerLink on item click
413+
return;
414+
}
415+
416+
let itemsWithView: Array<NavigationItem> = allItems.filter(item => this.hasItemView(item));
417+
if (itemsWithView.length > 0) {
418+
this._redirectService.redirect(autoOpenItems[0].routing.path);
419+
return;
420+
}
421+
}
422+
377423
hasItemChildren(item: NavigationItem): boolean {
378424
return item.resource?.immediateData.find(f => f.stringId === GroupNavigationConstants.ITEM_FIELD_ID_HAS_CHILDREN)?.value;
379425
}
380426

427+
protected hasItemAutoOpenView(item: NavigationItem): boolean {
428+
return item.resource?.immediateData.find(f => f.stringId === GroupNavigationConstants.ITEM_FIELD_ID_IS_AUTO_SELECT)?.value;
429+
}
430+
431+
protected hasItemView(item: NavigationItem): boolean {
432+
return item?.resource?.immediateData.find(f => f.stringId === GroupNavigationConstants.ITEM_FIELD_CONTAINS_FILTER)?.value;
433+
}
434+
381435
isItemAndNodeEqual(item: NavigationItem, node: UriNodeResource): boolean {
382436
return item.resource?.immediateData.find(f => f.stringId === GroupNavigationConstants.ITEM_FIELD_ID_NODE_PATH)?.value === node.uriPath;
383437
}
@@ -451,6 +505,7 @@ export abstract class AbstractNavigationDoubleDrawerComponent implements OnInit,
451505
this.rightItems = result.map(folder => this.resolveItemCaseToNavigationItem(folder)).filter(i => !!i);
452506
}
453507
this.resolveCustomViewsInRightSide();
508+
this.isRightSideInitialized = true;
454509
this.rightLoading$.off();
455510
this.itemLoaded.emit({menu: 'right', items: this.rightItems});
456511
}, error => {

projects/netgrif-components/src/lib/navigation/navigation-double-drawer/navigation-double-drawer.component.ts

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,8 @@ import {
1212
AccessService,
1313
ImpersonationUserSelectService,
1414
ImpersonationService,
15-
CaseResourceService
15+
CaseResourceService,
16+
RedirectService
1617
} from '@netgrif/components-core';
1718
import {animate, state, style, transition, trigger} from "@angular/animations";
1819
import {TranslateService} from "@ngx-translate/core";
@@ -68,9 +69,11 @@ export class NavigationDoubleDrawerComponent extends AbstractNavigationDoubleDra
6869
_caseResourceService: CaseResourceService,
6970
_impersonationUserSelect: ImpersonationUserSelectService,
7071
_impersonation: ImpersonationService,
71-
_dynamicRouteProviderService: DynamicNavigationRouteProviderService) {
72+
_dynamicRouteProviderService: DynamicNavigationRouteProviderService,
73+
_redirectService: RedirectService) {
7274
super(_router, _activatedRoute, _breakpoint, _languageService, _translateService, _userService, _accessService,
73-
_log, _config, _uriService, _caseResourceService, _impersonationUserSelect, _impersonation, _dynamicRouteProviderService)
75+
_log, _config, _uriService, _caseResourceService, _impersonationUserSelect, _impersonation,
76+
_dynamicRouteProviderService, _redirectService)
7477
}
7578

7679
public toggleSection(section: string): void {

0 commit comments

Comments
 (0)