mirror of
https://github.com/Alfresco/alfresco-content-app.git
synced 2025-07-24 17:31:52 +00:00
[ACS-6486] in breadcrumb the file title is not updating after editing (#4337)
* [ACS-6486] Update breadcrumb when file name is changed on details page * [ACS-6486] Added unit tests * [ACS-6486] Made injected services as readonly
This commit is contained in:
@@ -31,10 +31,10 @@ import { NO_ERRORS_SCHEMA } from '@angular/core';
|
|||||||
import { DefaultProjectorFn, MemoizedSelector, Store } from '@ngrx/store';
|
import { DefaultProjectorFn, MemoizedSelector, Store } from '@ngrx/store';
|
||||||
import { ContentApiService } from '@alfresco/aca-shared';
|
import { ContentApiService } from '@alfresco/aca-shared';
|
||||||
import { AppStore, isInfoDrawerOpened, NavigateToFolder, NavigateToPreviousPage, SetSelectedNodesAction } from '@alfresco/aca-shared/store';
|
import { AppStore, isInfoDrawerOpened, NavigateToFolder, NavigateToPreviousPage, SetSelectedNodesAction } from '@alfresco/aca-shared/store';
|
||||||
import { NodeEntry, PathElement } from '@alfresco/js-api';
|
import { Node, NodeEntry, PathElement } from '@alfresco/js-api';
|
||||||
import { RouterTestingModule } from '@angular/router/testing';
|
import { RouterTestingModule } from '@angular/router/testing';
|
||||||
import { AuthenticationService, CORE_PIPES, PageTitleService } from '@alfresco/adf-core';
|
import { AuthenticationService, CORE_PIPES, PageTitleService } from '@alfresco/adf-core';
|
||||||
import { BreadcrumbComponent, ContentService, SearchQueryBuilderService } from '@alfresco/adf-content-services';
|
import { BreadcrumbComponent, ContentService, NodesApiService, SearchQueryBuilderService } from '@alfresco/adf-content-services';
|
||||||
import { By } from '@angular/platform-browser';
|
import { By } from '@angular/platform-browser';
|
||||||
import { ContentActionRef } from '@alfresco/adf-extensions';
|
import { ContentActionRef } from '@alfresco/adf-extensions';
|
||||||
import { MatSnackBarModule } from '@angular/material/snack-bar';
|
import { MatSnackBarModule } from '@angular/material/snack-bar';
|
||||||
@@ -44,6 +44,7 @@ describe('DetailsComponent', () => {
|
|||||||
let fixture: ComponentFixture<DetailsComponent>;
|
let fixture: ComponentFixture<DetailsComponent>;
|
||||||
let contentApiService: ContentApiService;
|
let contentApiService: ContentApiService;
|
||||||
let contentService: ContentService;
|
let contentService: ContentService;
|
||||||
|
let nodesApiService: NodesApiService;
|
||||||
let store: Store;
|
let store: Store;
|
||||||
let node: NodeEntry;
|
let node: NodeEntry;
|
||||||
|
|
||||||
@@ -62,6 +63,8 @@ describe('DetailsComponent', () => {
|
|||||||
const mockAspectActionsSubject$ = new BehaviorSubject(mockAspectActions);
|
const mockAspectActionsSubject$ = new BehaviorSubject(mockAspectActions);
|
||||||
extensionsServiceMock.getAllowedSidebarActions.and.returnValue(mockAspectActionsSubject$.asObservable());
|
extensionsServiceMock.getAllowedSidebarActions.and.returnValue(mockAspectActionsSubject$.asObservable());
|
||||||
|
|
||||||
|
const getBreadcrumb = (): BreadcrumbComponent => fixture.debugElement.query(By.directive(BreadcrumbComponent)).componentInstance;
|
||||||
|
|
||||||
beforeEach(() => {
|
beforeEach(() => {
|
||||||
TestBed.configureTestingModule({
|
TestBed.configureTestingModule({
|
||||||
imports: [AppTestingModule, DetailsComponent, ...CORE_PIPES, MatSnackBarModule],
|
imports: [AppTestingModule, DetailsComponent, ...CORE_PIPES, MatSnackBarModule],
|
||||||
@@ -97,6 +100,7 @@ describe('DetailsComponent', () => {
|
|||||||
component = fixture.componentInstance;
|
component = fixture.componentInstance;
|
||||||
contentApiService = TestBed.inject(ContentApiService);
|
contentApiService = TestBed.inject(ContentApiService);
|
||||||
contentService = TestBed.inject(ContentService);
|
contentService = TestBed.inject(ContentService);
|
||||||
|
nodesApiService = TestBed.inject(NodesApiService);
|
||||||
store = TestBed.inject(Store);
|
store = TestBed.inject(Store);
|
||||||
storeMock.dispatch.calls.reset();
|
storeMock.dispatch.calls.reset();
|
||||||
|
|
||||||
@@ -137,16 +141,29 @@ describe('DetailsComponent', () => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
it('should dispatch navigation to a given folder', () => {
|
it('should dispatch navigation to a given folder', () => {
|
||||||
const breadcrumbComponent: BreadcrumbComponent = fixture.debugElement.query(By.directive(BreadcrumbComponent)).componentInstance;
|
|
||||||
const pathElement: PathElement = {
|
const pathElement: PathElement = {
|
||||||
id: 'fake-id'
|
id: 'fake-id'
|
||||||
};
|
};
|
||||||
breadcrumbComponent.navigate.emit(pathElement);
|
getBreadcrumb().navigate.emit(pathElement);
|
||||||
fixture.detectChanges();
|
fixture.detectChanges();
|
||||||
|
|
||||||
expect(store.dispatch).toHaveBeenCalledWith(new NavigateToFolder({ entry: pathElement } as NodeEntry));
|
expect(store.dispatch).toHaveBeenCalledWith(new NavigateToFolder({ entry: pathElement } as NodeEntry));
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('should pass different node as folderNode to breadcrumb when nodeUpdated from nodesApiService is triggered', () => {
|
||||||
|
fixture.detectChanges();
|
||||||
|
const breadcrumbComponent = getBreadcrumb();
|
||||||
|
const updatedNode = {
|
||||||
|
name: 'other node'
|
||||||
|
} as Node;
|
||||||
|
|
||||||
|
nodesApiService.nodeUpdated.next(updatedNode);
|
||||||
|
fixture.detectChanges();
|
||||||
|
expect(breadcrumbComponent.folderNode).toEqual(updatedNode);
|
||||||
|
expect(breadcrumbComponent.folderNode).not.toBe(updatedNode);
|
||||||
|
expect(updatedNode).not.toEqual(node.entry);
|
||||||
|
});
|
||||||
|
|
||||||
it('should dispatch node selection', () => {
|
it('should dispatch node selection', () => {
|
||||||
fixture.detectChanges();
|
fixture.detectChanges();
|
||||||
expect(store.dispatch).toHaveBeenCalledWith(new SetSelectedNodesAction([node]));
|
expect(store.dispatch).toHaveBeenCalledWith(new SetSelectedNodesAction([node]));
|
||||||
|
@@ -27,7 +27,7 @@ import { ActivatedRoute, NavigationStart } from '@angular/router';
|
|||||||
import { ContentApiService, PageComponent, PageLayoutComponent, ToolbarComponent } from '@alfresco/aca-shared';
|
import { ContentApiService, PageComponent, PageLayoutComponent, ToolbarComponent } from '@alfresco/aca-shared';
|
||||||
import { NavigateToFolder, NavigateToPreviousPage, SetSelectedNodesAction } from '@alfresco/aca-shared/store';
|
import { NavigateToFolder, NavigateToPreviousPage, SetSelectedNodesAction } from '@alfresco/aca-shared/store';
|
||||||
import { merge, Subject } from 'rxjs';
|
import { merge, Subject } from 'rxjs';
|
||||||
import { BreadcrumbComponent, ContentService, PermissionListComponent } from '@alfresco/adf-content-services';
|
import { BreadcrumbComponent, ContentService, NodesApiService, PermissionListComponent } from '@alfresco/adf-content-services';
|
||||||
import { CommonModule } from '@angular/common';
|
import { CommonModule } from '@angular/common';
|
||||||
import { TranslateModule } from '@ngx-translate/core';
|
import { TranslateModule } from '@ngx-translate/core';
|
||||||
import { MatIconModule } from '@angular/material/icon';
|
import { MatIconModule } from '@angular/material/icon';
|
||||||
@@ -40,6 +40,7 @@ import { NodeEntry, PathElement } from '@alfresco/js-api';
|
|||||||
import { first, takeUntil } from 'rxjs/operators';
|
import { first, takeUntil } from 'rxjs/operators';
|
||||||
import { ContentActionRef } from '@alfresco/adf-extensions';
|
import { ContentActionRef } from '@alfresco/adf-extensions';
|
||||||
import { FileSizePipe, InfoDrawerButtonsDirective } from '@alfresco/adf-core';
|
import { FileSizePipe, InfoDrawerButtonsDirective } from '@alfresco/adf-core';
|
||||||
|
import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
|
||||||
|
|
||||||
@Component({
|
@Component({
|
||||||
standalone: true,
|
standalone: true,
|
||||||
@@ -74,7 +75,12 @@ export class DetailsComponent extends PageComponent implements OnInit, OnDestroy
|
|||||||
|
|
||||||
private readonly onDestroy$: Subject<void> = new Subject<void>();
|
private readonly onDestroy$: Subject<void> = new Subject<void>();
|
||||||
|
|
||||||
constructor(private route: ActivatedRoute, private contentApi: ContentApiService, private contentService: ContentService) {
|
constructor(
|
||||||
|
private readonly route: ActivatedRoute,
|
||||||
|
private readonly contentApi: ContentApiService,
|
||||||
|
private readonly contentService: ContentService,
|
||||||
|
private readonly nodesApiService: NodesApiService
|
||||||
|
) {
|
||||||
super();
|
super();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -84,6 +90,7 @@ export class DetailsComponent extends PageComponent implements OnInit, OnDestroy
|
|||||||
const { route } = this;
|
const { route } = this;
|
||||||
const { data } = route.snapshot;
|
const { data } = route.snapshot;
|
||||||
this.title = data.title;
|
this.title = data.title;
|
||||||
|
this.nodesApiService.nodeUpdated.pipe(takeUntilDestroyed(this.destroyRef)).subscribe((node) => (this.node = { ...node }));
|
||||||
this.route.params.subscribe((params) => {
|
this.route.params.subscribe((params) => {
|
||||||
this.isLoading = true;
|
this.isLoading = true;
|
||||||
this.setActiveTab(params.activeTab);
|
this.setActiveTab(params.activeTab);
|
||||||
|
Reference in New Issue
Block a user