Skip to content

Commit 4b21f84

Browse files
authored
Only show edit icon when user is authenticated (#1054)
2 parents 437808b + 1978570 commit 4b21f84

File tree

4 files changed

+58
-36
lines changed

4 files changed

+58
-36
lines changed

projects/core/src/lib/components/toc/toc/toc.component.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
[layersWithoutWebMercator]="layersWithoutWebMercator()"
77
[tiles3DLayerIds]="tiles3DLayerIds()"
88
[filteredLayerIds]="filteredLayerIds()"
9-
[editableLayerIds]="config?.showEditLayerIcon && editComponentEnabled ? editableLayerIds() : []"
9+
[editableLayerIds]="getCurrentlyEditableLayerIds()"
1010
(zoomToScale)="zoomToScale($event)"
1111
(editLayer)="editLayer($event)"
1212
></tm-toc-node-layer>

projects/core/src/lib/components/toc/toc/toc.component.spec.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ import {
1313
import { setLayerVisibility, toggleSelectedLayerId } from '../../../map/state/map.actions';
1414
import { TocNodeLayerComponent } from '../toc-node-layer/toc-node-layer.component';
1515
import { ToggleAllLayersButtonComponent } from '../toggle-all-layers-button/toggle-all-layers-button.component';
16-
import { getAppLayerModel, getLayerTreeNode } from '@tailormap-viewer/api';
16+
import { AuthenticatedUserService, getAppLayerModel, getLayerTreeNode } from '@tailormap-viewer/api';
1717
import { TocFilterInputComponent } from '../toc-filter-input/toc-filter-input.component';
1818
import { toggleFilterEnabled } from '../state/toc.actions';
1919
import { selectFilterEnabled, selectFilterTerm, selectInfoTreeNodeId } from '../state/toc.selectors';
@@ -72,6 +72,7 @@ const setup = async (visible: boolean, selectedLayer = '') => {
7272
getMapServiceMock().provider,
7373
{ provide: Store, useValue: mockStore },
7474
getMenubarService(visible, registerComponentFn),
75+
{ provide: AuthenticatedUserService, useValue: { getUserDetails$: jest.fn(() => of({ isAuthenticated: false })) } },
7576
],
7677
});
7778
return { registerComponentFn, mockStore, mockDispatch };

projects/core/src/lib/components/toc/toc/toc.component.ts

Lines changed: 23 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,24 @@
1-
import { Component, computed, NgZone, OnDestroy, OnInit, Signal, signal, inject } from '@angular/core';
1+
import { Component, computed, inject, NgZone, OnDestroy, OnInit, signal, Signal } from '@angular/core';
22
import { filter, Observable, of, Subject, takeUntil } from 'rxjs';
33
import {
4-
BaseTreeModel, BrowserHelper, DropZoneHelper, NodePositionChangedEventModel, TreeDragDropService,
5-
TreeService,
4+
BaseTreeModel, BrowserHelper, DropZoneHelper, NodePositionChangedEventModel, TreeDragDropService, TreeService,
65
} from '@tailormap-viewer/shared';
76
import { map, tap } from 'rxjs/operators';
87
import { MenubarService } from '../../menubar';
98
import { TocMenuButtonComponent } from '../toc-menu-button/toc-menu-button.component';
109
import { Store } from '@ngrx/store';
11-
import { AppLayerModel, BaseComponentConfigHelper, BaseComponentTypeEnum, EditConfigModel, TocConfigModel } from '@tailormap-viewer/api';
10+
import { AppLayerModel, AuthenticatedUserService, BaseComponentTypeEnum, TocConfigModel } from '@tailormap-viewer/api';
1211
import { MapService } from '@tailormap-viewer/map';
1312
import { selectFilteredLayerTree, selectFilterEnabled } from '../state/toc.selectors';
1413
import { toggleFilterEnabled } from '../state/toc.actions';
1514
import {
1615
select3dTilesLayers, selectEditableLayers, selectIn3dView, selectLayersWithoutWebMercatorIds, selectSelectedNode, selectSelectedNodeId,
1716
} from '../../../map/state/map.selectors';
18-
import { moveLayerTreeNode, setLayerVisibility, toggleSelectedLayerId, toggleLevelExpansion } from '../../../map/state/map.actions';
17+
import { moveLayerTreeNode, setLayerVisibility, toggleLevelExpansion, toggleSelectedLayerId } from '../../../map/state/map.actions';
1918
import { selectFilteredLayerIds } from '../../../state/filter-state/filter.selectors';
2019
import { setEditActive, setSelectedEditLayer } from '../../edit/state/edit.actions';
2120
import { ComponentConfigHelper } from '../../../shared';
21+
import { toSignal } from '@angular/core/rxjs-interop';
2222

2323
interface AppLayerTreeModel extends BaseTreeModel {
2424
metadata: AppLayerModel;
@@ -39,6 +39,7 @@ export class TocComponent implements OnInit, OnDestroy {
3939
private menubarService = inject(MenubarService);
4040
private mapService = inject(MapService);
4141
private ngZone = inject(NgZone);
42+
private authenticatedUserService = inject(AuthenticatedUserService);
4243

4344
private destroyed = new Subject();
4445
public visible$: Observable<boolean> = of(false);
@@ -55,11 +56,24 @@ export class TocComponent implements OnInit, OnDestroy {
5556
public layersWithoutWebMercator: Signal<string[]> = signal([]);
5657
public tiles3DLayerIds: Signal<string[]> = signal([]);
5758
public filteredLayerIds: Signal<string[]> = signal([]);
58-
public editableLayerIds: Signal<string[]> = signal([]);
5959

60-
public config: TocConfigModel | undefined;
60+
private config = ComponentConfigHelper.componentConfigSignal<TocConfigModel>(this.store$, BaseComponentTypeEnum.TOC);
6161

62-
public editComponentEnabled = !BaseComponentConfigHelper.isComponentDisabledByDefault(BaseComponentTypeEnum.EDIT);
62+
public editComponentEnabled= ComponentConfigHelper.componentEnabledConfigSignal(this.store$, BaseComponentTypeEnum.EDIT);
63+
private authenticatedUserDetails = toSignal(this.authenticatedUserService.getUserDetails$());
64+
65+
private editableLayerIds = computed(() => {
66+
const editableLayers = this.store$.selectSignal(selectEditableLayers);
67+
return editableLayers().map(layer => layer.id);
68+
});
69+
70+
public getCurrentlyEditableLayerIds = computed(() => {
71+
return this.config()?.showEditLayerIcon
72+
&& this.authenticatedUserDetails()?.isAuthenticated // remove when HTM-1762 is implemented
73+
&& this.editComponentEnabled()
74+
? this.editableLayerIds()
75+
: [];
76+
});
6377

6478
public ngOnInit(): void {
6579
this.visible$ = this.menubarService.isComponentVisible$(BaseComponentTypeEnum.TOC);
@@ -100,29 +114,11 @@ export class TocComponent implements OnInit, OnDestroy {
100114

101115
this.menubarService.registerComponent({ type: BaseComponentTypeEnum.TOC, component: TocMenuButtonComponent });
102116

103-
ComponentConfigHelper.useInitialConfigForComponent<TocConfigModel>(
104-
this.store$,
105-
BaseComponentTypeEnum.TOC,
106-
config => {
107-
this.config = config;
108-
},
109-
);
110-
111-
ComponentConfigHelper.useInitialConfigForComponent<EditConfigModel>(
112-
this.store$,
113-
BaseComponentTypeEnum.EDIT,
114-
config => {
115-
this.editComponentEnabled = config.enabled;
116-
},
117-
);
118-
119117
this.in3D = this.store$.selectSignal(selectIn3dView);
120118
this.layersWithoutWebMercator = this.store$.selectSignal(selectLayersWithoutWebMercatorIds);
121119
const tiles3DLayers = this.store$.selectSignal(select3dTilesLayers);
122120
this.tiles3DLayerIds = computed(() => tiles3DLayers().map(l => l.id));
123121
this.filteredLayerIds = this.store$.selectSignal(selectFilteredLayerIds);
124-
const editableLayers = this.store$.selectSignal(selectEditableLayers);
125-
this.editableLayerIds = computed(() => editableLayers().map(layer => layer.id));
126122
}
127123

128124
public getDropZoneConfig() {
@@ -167,4 +163,5 @@ export class TocComponent implements OnInit, OnDestroy {
167163
this.store$.dispatch(setSelectedEditLayer( { layer }));
168164
this.store$.dispatch(setEditActive({ active: true }));
169165
}
166+
170167
}

projects/core/src/lib/shared/helpers/component-config.helper.ts

Lines changed: 32 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,8 @@ import { LoadingStateEnum, RegisteredComponent } from '@tailormap-viewer/shared'
22
import { BaseComponentConfigHelper, BaseComponentTypeEnum, ComponentBaseConfigModel, ComponentModel } from '@tailormap-viewer/api';
33
import { Store } from '@ngrx/store';
44
import { selectComponentsConfigForType, selectViewerLoadingState } from '../../state/core.selectors';
5-
import { filter, switchMap, take } from 'rxjs';
5+
import { filter, map, switchMap, take } from 'rxjs';
6+
import { toSignal } from '@angular/core/rxjs-interop';
67

78
export class ComponentConfigHelper {
89

@@ -13,22 +14,45 @@ export class ComponentConfigHelper {
1314
return components.filter(c => BaseComponentConfigHelper.isComponentEnabled(config, c.type));
1415
}
1516

16-
public static useInitialConfigForComponent<ConfigType extends ComponentBaseConfigModel = ComponentBaseConfigModel>(
17+
public static componentConfig$<ConfigType extends ComponentBaseConfigModel = ComponentBaseConfigModel>(
1718
store$: Store,
1819
type: string | BaseComponentTypeEnum,
19-
callback: (config: ConfigType) => void,
2020
) {
2121
return store$.select(selectViewerLoadingState)
2222
.pipe(
2323
filter(loadState => loadState === LoadingStateEnum.LOADED),
24-
take(1),
2524
switchMap(() => store$.select(selectComponentsConfigForType<ConfigType>(type)).pipe(take(1))),
26-
)
25+
map((config): ConfigType => {
26+
const enabled = BaseComponentConfigHelper.isComponentEnabled(config ? [config] : [], type);
27+
if (config) {
28+
return { ...config.config, enabled };
29+
}
30+
return { enabled } as ConfigType;
31+
}),
32+
);
33+
}
34+
35+
public static useInitialConfigForComponent<ConfigType extends ComponentBaseConfigModel = ComponentBaseConfigModel>(
36+
store$: Store,
37+
type: string | BaseComponentTypeEnum,
38+
callback: (config: ConfigType) => void,
39+
) {
40+
ComponentConfigHelper.componentConfig$<ConfigType>(store$, type)
41+
.pipe(take(1))
2742
.subscribe(config => {
28-
if (config) {
29-
callback(config.config);
30-
}
43+
callback(config);
3144
});
3245
}
3346

47+
public static componentConfigSignal<ConfigType extends ComponentBaseConfigModel = ComponentBaseConfigModel>(
48+
store$: Store,
49+
type: string | BaseComponentTypeEnum) {
50+
return toSignal(ComponentConfigHelper.componentConfig$<ConfigType>(store$, type));
51+
}
52+
53+
public static componentEnabledConfigSignal(
54+
store$: Store,
55+
type: string | BaseComponentTypeEnum) {
56+
return toSignal(ComponentConfigHelper.componentConfig$(store$, type).pipe(map(config => config.enabled)), { initialValue: false });
57+
}
3458
}

0 commit comments

Comments
 (0)