Optmise injections and imports (#3174)

* cleanup base page injections

* optimise breakpoint observer

* cleanup subscriptions

* optimise upload service injections

* optimise router imports

* fix test setup

* fix tests
This commit is contained in:
Denys Vuika
2023-05-09 14:30:33 +01:00
committed by GitHub
parent 1ca5a7af31
commit 23814e1e76
15 changed files with 107 additions and 267 deletions
@@ -24,10 +24,8 @@
import { Component, OnInit, ViewEncapsulation, OnDestroy } from '@angular/core'; import { Component, OnInit, ViewEncapsulation, OnDestroy } from '@angular/core';
import { ActivatedRoute } from '@angular/router'; import { ActivatedRoute } from '@angular/router';
import { AppExtensionService, ContentApiService, PageComponent } from '@alfresco/aca-shared'; import { ContentApiService, PageComponent } from '@alfresco/aca-shared';
import { AppStore, NavigateToPreviousPage, SetSelectedNodesAction } from '@alfresco/aca-shared/store'; import { NavigateToPreviousPage, SetSelectedNodesAction } from '@alfresco/aca-shared/store';
import { Store } from '@ngrx/store';
import { ContentManagementService } from '../../services/content-management.service';
import { Subject } from 'rxjs'; import { Subject } from 'rxjs';
@Component({ @Component({
@@ -42,14 +40,8 @@ export class DetailsComponent extends PageComponent implements OnInit, OnDestroy
onDestroy$ = new Subject<boolean>(); onDestroy$ = new Subject<boolean>();
activeTab = 1; activeTab = 1;
constructor( constructor(private route: ActivatedRoute, private contentApi: ContentApiService) {
private route: ActivatedRoute, super();
private contentApi: ContentApiService,
store: Store<AppStore>,
content: ContentManagementService,
extensions: AppExtensionService
) {
super(store, extensions, content);
} }
ngOnInit(): void { ngOnInit(): void {
@@ -22,12 +22,9 @@
* from Hyland Software. If not, see <http://www.gnu.org/licenses/>. * from Hyland Software. If not, see <http://www.gnu.org/licenses/>.
*/ */
import { BreakpointObserver, Breakpoints } from '@angular/cdk/layout';
import { Component, OnInit, ChangeDetectorRef } from '@angular/core'; import { Component, OnInit, ChangeDetectorRef } from '@angular/core';
import { Store } from '@ngrx/store';
import { SiteEntry, FavoritePaging, Pagination } from '@alfresco/js-api'; import { SiteEntry, FavoritePaging, Pagination } from '@alfresco/js-api';
import { ContentManagementService } from '../../services/content-management.service'; import { AppHookService, ContentApiService, PageComponent } from '@alfresco/aca-shared';
import { AppExtensionService, AppHookService, ContentApiService, PageComponent } from '@alfresco/aca-shared';
import { NavigateLibraryAction } from '@alfresco/aca-shared/store'; import { NavigateLibraryAction } from '@alfresco/aca-shared/store';
import { UserPreferencesService } from '@alfresco/adf-core'; import { UserPreferencesService } from '@alfresco/adf-core';
import { DocumentListPresetRef } from '@alfresco/adf-extensions'; import { DocumentListPresetRef } from '@alfresco/adf-extensions';
@@ -43,20 +40,15 @@ export class FavoriteLibrariesComponent extends PageComponent implements OnInit
}); });
isLoading = false; isLoading = false;
list: FavoritePaging; list: FavoritePaging;
isSmallScreen = false;
columns: DocumentListPresetRef[] = []; columns: DocumentListPresetRef[] = [];
constructor( constructor(
content: ContentManagementService,
store: Store<any>,
extensions: AppExtensionService,
private appHookService: AppHookService, private appHookService: AppHookService,
private contentApiService: ContentApiService, private contentApiService: ContentApiService,
private breakpointObserver: BreakpointObserver,
private preferences: UserPreferencesService, private preferences: UserPreferencesService,
private changeDetectorRef: ChangeDetectorRef private changeDetectorRef: ChangeDetectorRef
) { ) {
super(store, extensions, content); super();
} }
ngOnInit() { ngOnInit() {
@@ -69,11 +61,7 @@ export class FavoriteLibrariesComponent extends PageComponent implements OnInit
this.appHookService.libraryUpdated.subscribe(() => this.reloadList()), this.appHookService.libraryUpdated.subscribe(() => this.reloadList()),
this.appHookService.libraryJoined.subscribe(() => this.reloadList()), this.appHookService.libraryJoined.subscribe(() => this.reloadList()),
this.appHookService.libraryLeft.subscribe(() => this.reloadList()), this.appHookService.libraryLeft.subscribe(() => this.reloadList()),
this.appHookService.favoriteLibraryToggle.subscribe(() => this.reloadList()), this.appHookService.favoriteLibraryToggle.subscribe(() => this.reloadList())
this.breakpointObserver.observe([Breakpoints.HandsetPortrait, Breakpoints.HandsetLandscape]).subscribe((result) => {
this.isSmallScreen = result.matches;
})
]); ]);
this.columns = this.extensions.documentListPresets.favoriteLibraries || []; this.columns = this.extensions.documentListPresets.favoriteLibraries || [];
} }
@@ -22,49 +22,28 @@
* from Hyland Software. If not, see <http://www.gnu.org/licenses/>. * from Hyland Software. If not, see <http://www.gnu.org/licenses/>.
*/ */
import { AcaFileAutoDownloadService, AppExtensionService, ContentApiService, PageComponent } from '@alfresco/aca-shared'; import { ContentApiService, PageComponent } from '@alfresco/aca-shared';
import { AppStore } from '@alfresco/aca-shared/store';
import { UploadService } from '@alfresco/adf-content-services';
import { MinimalNodeEntity, MinimalNodeEntryEntity, PathElementEntity, PathInfo } from '@alfresco/js-api'; import { MinimalNodeEntity, MinimalNodeEntryEntity, PathElementEntity, PathInfo } from '@alfresco/js-api';
import { BreakpointObserver, Breakpoints } from '@angular/cdk/layout';
import { Component, OnInit } from '@angular/core'; import { Component, OnInit } from '@angular/core';
import { Router } from '@angular/router';
import { Store } from '@ngrx/store';
import { debounceTime, map } from 'rxjs/operators'; import { debounceTime, map } from 'rxjs/operators';
import { ContentManagementService } from '../../services/content-management.service';
import { DocumentListPresetRef } from '@alfresco/adf-extensions'; import { DocumentListPresetRef } from '@alfresco/adf-extensions';
@Component({ @Component({
templateUrl: './favorites.component.html' templateUrl: './favorites.component.html'
}) })
export class FavoritesComponent extends PageComponent implements OnInit { export class FavoritesComponent extends PageComponent implements OnInit {
isSmallScreen = false;
columns: DocumentListPresetRef[] = []; columns: DocumentListPresetRef[] = [];
constructor( constructor(private contentApi: ContentApiService) {
private router: Router, super();
store: Store<AppStore>,
extensions: AppExtensionService,
private contentApi: ContentApiService,
content: ContentManagementService,
private uploadService: UploadService,
private breakpointObserver: BreakpointObserver,
fileAutoDownloadService: AcaFileAutoDownloadService
) {
super(store, extensions, content, fileAutoDownloadService);
} }
ngOnInit() { ngOnInit() {
super.ngOnInit(); super.ngOnInit();
this.subscriptions = this.subscriptions.concat([ this.subscriptions = this.subscriptions.concat([
this.uploadService.fileUploadComplete.pipe(debounceTime(300)).subscribe((_) => this.reload()), this.uploadService.fileUploadComplete.pipe(debounceTime(300)).subscribe(() => this.reload()),
this.uploadService.fileUploadDeleted.pipe(debounceTime(300)).subscribe((_) => this.reload()), this.uploadService.fileUploadDeleted.pipe(debounceTime(300)).subscribe(() => this.reload())
this.breakpointObserver.observe([Breakpoints.HandsetPortrait, Breakpoints.HandsetLandscape]).subscribe((result) => {
this.isSmallScreen = result.matches;
})
]); ]);
this.columns = this.extensions.documentListPresets.favorites; this.columns = this.extensions.documentListPresets.favorites;
@@ -24,63 +24,45 @@
import { ShowHeaderMode } from '@alfresco/adf-core'; import { ShowHeaderMode } from '@alfresco/adf-core';
import { Component, OnDestroy, OnInit } from '@angular/core'; import { Component, OnDestroy, OnInit } from '@angular/core';
import { ActivatedRoute, Params, Router } from '@angular/router'; import { ActivatedRoute, Params } from '@angular/router';
import { Store } from '@ngrx/store';
import { MinimalNodeEntity, MinimalNodeEntryEntity, PathElement, PathElementEntity } from '@alfresco/js-api'; import { MinimalNodeEntity, MinimalNodeEntryEntity, PathElement, PathElementEntity } from '@alfresco/js-api';
import { ContentManagementService } from '../../services/content-management.service';
import { NodeActionsService } from '../../services/node-actions.service'; import { NodeActionsService } from '../../services/node-actions.service';
import { AcaFileAutoDownloadService, AppExtensionService, ContentApiService, PageComponent } from '@alfresco/aca-shared'; import { ContentApiService, PageComponent } from '@alfresco/aca-shared';
import { SetCurrentFolderAction, isAdmin, AppStore, UploadFileVersionAction, showLoaderSelector } from '@alfresco/aca-shared/store'; import { SetCurrentFolderAction, isAdmin, UploadFileVersionAction, showLoaderSelector } from '@alfresco/aca-shared/store';
import { BreakpointObserver, Breakpoints } from '@angular/cdk/layout';
import { debounceTime, takeUntil } from 'rxjs/operators'; import { debounceTime, takeUntil } from 'rxjs/operators';
import { FilterSearch, ShareDataRow, UploadService, FileUploadEvent } from '@alfresco/adf-content-services'; import { FilterSearch, ShareDataRow, FileUploadEvent } from '@alfresco/adf-content-services';
import { DocumentListPresetRef } from '@alfresco/adf-extensions'; import { DocumentListPresetRef } from '@alfresco/adf-extensions';
import { Observable } from 'rxjs';
@Component({ @Component({
templateUrl: './files.component.html' templateUrl: './files.component.html'
}) })
export class FilesComponent extends PageComponent implements OnInit, OnDestroy { export class FilesComponent extends PageComponent implements OnInit, OnDestroy {
isValidPath = true; isValidPath = true;
isSmallScreen = false;
isAdmin = false; isAdmin = false;
selectedNode: MinimalNodeEntity; selectedNode: MinimalNodeEntity;
queryParams = null; queryParams = null;
showLoader$: Observable<boolean>; showLoader$ = this.store.select(showLoaderSelector);
private nodePath: PathElement[]; private nodePath: PathElement[];
columns: DocumentListPresetRef[] = []; columns: DocumentListPresetRef[] = [];
constructor( constructor(private route: ActivatedRoute, private contentApi: ContentApiService, private nodeActionsService: NodeActionsService) {
private router: Router, super();
private route: ActivatedRoute,
private contentApi: ContentApiService,
store: Store<AppStore>,
private nodeActionsService: NodeActionsService,
private uploadService: UploadService,
content: ContentManagementService,
extensions: AppExtensionService,
private breakpointObserver: BreakpointObserver,
fileAutoDownloadService: AcaFileAutoDownloadService
) {
super(store, extensions, content, fileAutoDownloadService);
} }
ngOnInit() { ngOnInit() {
super.ngOnInit(); super.ngOnInit();
const { route, nodeActionsService, uploadService } = this; const { data } = this.route.snapshot;
const { data } = route.snapshot;
this.title = data.title; this.title = data.title;
this.showLoader$ = this.store.select(showLoaderSelector); this.route.queryParamMap.subscribe((queryMap: Params) => {
route.queryParamMap.subscribe((queryMap: Params) => {
this.queryParams = queryMap.params; this.queryParams = queryMap.params;
}); });
route.params.subscribe(({ folderId }: Params) => { this.route.params.subscribe(({ folderId }: Params) => {
const nodeId = folderId || data.defaultNodeId; const nodeId = folderId || data.defaultNodeId;
this.contentApi.getNode(nodeId).subscribe( this.contentApi.getNode(nodeId).subscribe(
@@ -100,13 +82,9 @@ export class FilesComponent extends PageComponent implements OnInit, OnDestroy {
}); });
this.subscriptions = this.subscriptions.concat([ this.subscriptions = this.subscriptions.concat([
nodeActionsService.contentCopied.subscribe((nodes) => this.onContentCopied(nodes)), this.nodeActionsService.contentCopied.subscribe((nodes) => this.onContentCopied(nodes)),
uploadService.fileUploadComplete.pipe(debounceTime(300)).subscribe((file) => this.onFileUploadedEvent(file)), this.uploadService.fileUploadComplete.pipe(debounceTime(300)).subscribe((file) => this.onFileUploadedEvent(file)),
uploadService.fileUploadDeleted.pipe(debounceTime(300)).subscribe((file) => this.onFileUploadedEvent(file)), this.uploadService.fileUploadDeleted.pipe(debounceTime(300)).subscribe((file) => this.onFileUploadedEvent(file))
this.breakpointObserver.observe([Breakpoints.HandsetPortrait, Breakpoints.HandsetLandscape]).subscribe((result) => {
this.isSmallScreen = result.matches;
})
]); ]);
this.store this.store
@@ -22,31 +22,20 @@
* from Hyland Software. If not, see <http://www.gnu.org/licenses/>. * from Hyland Software. If not, see <http://www.gnu.org/licenses/>.
*/ */
import { AppStore, NavigateLibraryAction } from '@alfresco/aca-shared/store'; import { NavigateLibraryAction } from '@alfresco/aca-shared/store';
import { SiteEntry } from '@alfresco/js-api'; import { SiteEntry } from '@alfresco/js-api';
import { BreakpointObserver, Breakpoints } from '@angular/cdk/layout';
import { Component, OnInit } from '@angular/core'; import { Component, OnInit } from '@angular/core';
import { Store } from '@ngrx/store'; import { AppHookService, PageComponent } from '@alfresco/aca-shared';
import { ContentManagementService } from '../../services/content-management.service';
import { AppExtensionService, AppHookService, PageComponent } from '@alfresco/aca-shared';
import { DocumentListPresetRef } from '@alfresco/adf-extensions'; import { DocumentListPresetRef } from '@alfresco/adf-extensions';
@Component({ @Component({
templateUrl: './libraries.component.html' templateUrl: './libraries.component.html'
}) })
export class LibrariesComponent extends PageComponent implements OnInit { export class LibrariesComponent extends PageComponent implements OnInit {
isSmallScreen = false;
columns: DocumentListPresetRef[] = []; columns: DocumentListPresetRef[] = [];
constructor( constructor(private appHookService: AppHookService) {
content: ContentManagementService, super();
store: Store<AppStore>,
extensions: AppExtensionService,
private appHookService: AppHookService,
private breakpointObserver: BreakpointObserver
) {
super(store, extensions, content);
} }
ngOnInit() { ngOnInit() {
@@ -55,11 +44,7 @@ export class LibrariesComponent extends PageComponent implements OnInit {
this.subscriptions.push( this.subscriptions.push(
this.appHookService.libraryDeleted.subscribe(() => this.reload()), this.appHookService.libraryDeleted.subscribe(() => this.reload()),
this.appHookService.libraryUpdated.subscribe(() => this.reload()), this.appHookService.libraryUpdated.subscribe(() => this.reload()),
this.appHookService.libraryLeft.subscribe(() => this.reload()), this.appHookService.libraryLeft.subscribe(() => this.reload())
this.breakpointObserver.observe([Breakpoints.HandsetPortrait, Breakpoints.HandsetLandscape]).subscribe((result) => {
this.isSmallScreen = result.matches;
})
); );
this.columns = this.extensions.documentListPresets.libraries || []; this.columns = this.extensions.documentListPresets.libraries || [];
@@ -23,47 +23,27 @@
*/ */
import { Component, OnInit } from '@angular/core'; import { Component, OnInit } from '@angular/core';
import { BreakpointObserver, Breakpoints } from '@angular/cdk/layout';
import { MinimalNodeEntity } from '@alfresco/js-api'; import { MinimalNodeEntity } from '@alfresco/js-api';
import { ContentManagementService } from '../../services/content-management.service';
import { Store } from '@ngrx/store';
import { AppStore } from '@alfresco/aca-shared/store';
import { UploadService } from '@alfresco/adf-content-services';
import { debounceTime } from 'rxjs/operators'; import { debounceTime } from 'rxjs/operators';
import { Router } from '@angular/router'; import { PageComponent } from '@alfresco/aca-shared';
import { AcaFileAutoDownloadService, AppExtensionService, PageComponent } from '@alfresco/aca-shared';
import { DocumentListPresetRef } from '@alfresco/adf-extensions'; import { DocumentListPresetRef } from '@alfresco/adf-extensions';
@Component({ @Component({
templateUrl: './recent-files.component.html' templateUrl: './recent-files.component.html'
}) })
export class RecentFilesComponent extends PageComponent implements OnInit { export class RecentFilesComponent extends PageComponent implements OnInit {
isSmallScreen = false;
columns: DocumentListPresetRef[] = []; columns: DocumentListPresetRef[] = [];
constructor( constructor() {
store: Store<AppStore>, super();
extensions: AppExtensionService,
content: ContentManagementService,
private uploadService: UploadService,
private breakpointObserver: BreakpointObserver,
private router: Router,
fileAutoDownloadService: AcaFileAutoDownloadService
) {
super(store, extensions, content, fileAutoDownloadService);
} }
ngOnInit() { ngOnInit() {
super.ngOnInit(); super.ngOnInit();
this.subscriptions = this.subscriptions.concat([ this.subscriptions = this.subscriptions.concat([
this.uploadService.fileUploadComplete.pipe(debounceTime(300)).subscribe(() => this.onFileUploadedEvent()), this.uploadService.fileUploadComplete.pipe(debounceTime(300)).subscribe(() => this.reload()),
this.uploadService.fileUploadDeleted.pipe(debounceTime(300)).subscribe(() => this.onFileUploadedEvent()), this.uploadService.fileUploadDeleted.pipe(debounceTime(300)).subscribe(() => this.reload())
this.breakpointObserver.observe([Breakpoints.HandsetPortrait, Breakpoints.HandsetLandscape]).subscribe((result) => {
this.isSmallScreen = result.matches;
})
]); ]);
this.columns = this.extensions.documentListPresets.recent || []; this.columns = this.extensions.documentListPresets.recent || [];
@@ -78,8 +58,4 @@ export class RecentFilesComponent extends PageComponent implements OnInit {
handleNodeClick(event: Event) { handleNodeClick(event: Event) {
this.onNodeDoubleClick((event as CustomEvent).detail?.node); this.onNodeDoubleClick((event as CustomEvent).detail?.node);
} }
private onFileUploadedEvent() {
this.reload();
}
} }
@@ -22,15 +22,12 @@
* from Hyland Software. If not, see <http://www.gnu.org/licenses/>. * from Hyland Software. If not, see <http://www.gnu.org/licenses/>.
*/ */
import { NavigateLibraryAction, AppStore } from '@alfresco/aca-shared/store'; import { NavigateLibraryAction } from '@alfresco/aca-shared/store';
import { NodePaging, Pagination, SiteEntry } from '@alfresco/js-api'; import { NodePaging, Pagination, SiteEntry } from '@alfresco/js-api';
import { BreakpointObserver, Breakpoints } from '@angular/cdk/layout';
import { Component, OnInit } from '@angular/core'; import { Component, OnInit } from '@angular/core';
import { ActivatedRoute, Params } from '@angular/router'; import { ActivatedRoute, Params } from '@angular/router';
import { Store } from '@ngrx/store';
import { ContentManagementService } from '../../../services/content-management.service';
import { SearchLibrariesQueryBuilderService } from './search-libraries-query-builder.service'; import { SearchLibrariesQueryBuilderService } from './search-libraries-query-builder.service';
import { AppExtensionService, AppHookService, AppService, PageComponent } from '@alfresco/aca-shared'; import { AppHookService, AppService, PageComponent } from '@alfresco/aca-shared';
import { DocumentListPresetRef } from '@alfresco/adf-extensions'; import { DocumentListPresetRef } from '@alfresco/adf-extensions';
@Component({ @Component({
@@ -39,7 +36,6 @@ import { DocumentListPresetRef } from '@alfresco/adf-extensions';
styleUrls: ['./search-libraries-results.component.scss'] styleUrls: ['./search-libraries-results.component.scss']
}) })
export class SearchLibrariesResultsComponent extends PageComponent implements OnInit { export class SearchLibrariesResultsComponent extends PageComponent implements OnInit {
isSmallScreen = false;
searchedWord: string; searchedWord: string;
queryParamName = 'q'; queryParamName = 'q';
data: NodePaging; data: NodePaging;
@@ -48,16 +44,12 @@ export class SearchLibrariesResultsComponent extends PageComponent implements On
columns: DocumentListPresetRef[] = []; columns: DocumentListPresetRef[] = [];
constructor( constructor(
private breakpointObserver: BreakpointObserver,
private librariesQueryBuilder: SearchLibrariesQueryBuilderService, private librariesQueryBuilder: SearchLibrariesQueryBuilderService,
private route: ActivatedRoute, private route: ActivatedRoute,
private appHookService: AppHookService, private appHookService: AppHookService,
private appService: AppService, private appService: AppService
store: Store<AppStore>,
extensions: AppExtensionService,
content: ContentManagementService
) { ) {
super(store, extensions, content); super();
librariesQueryBuilder.paging = { librariesQueryBuilder.paging = {
skipCount: 0, skipCount: 0,
@@ -96,10 +88,6 @@ export class SearchLibrariesResultsComponent extends PageComponent implements On
this.appHookService.library400Error.next(); this.appHookService.library400Error.next();
} }
} catch (e) {} } catch (e) {}
}),
this.breakpointObserver.observe([Breakpoints.HandsetPortrait, Breakpoints.HandsetLandscape]).subscribe((result) => {
this.isSmallScreen = result.matches;
}) })
); );
@@ -24,11 +24,9 @@
import { Component, OnInit, ViewEncapsulation } from '@angular/core'; import { Component, OnInit, ViewEncapsulation } from '@angular/core';
import { MinimalNodeEntity, Pagination, ResultSetPaging } from '@alfresco/js-api'; import { MinimalNodeEntity, Pagination, ResultSetPaging } from '@alfresco/js-api';
import { ActivatedRoute, Params, Router } from '@angular/router'; import { ActivatedRoute, Params } from '@angular/router';
import { SearchQueryBuilderService } from '@alfresco/adf-content-services'; import { SearchQueryBuilderService } from '@alfresco/adf-content-services';
import { Store } from '@ngrx/store';
import { import {
AppStore,
infoDrawerPreview, infoDrawerPreview,
NavigateToFolder, NavigateToFolder,
SetInfoDrawerPreviewStateAction, SetInfoDrawerPreviewStateAction,
@@ -37,13 +35,11 @@ import {
ShowInfoDrawerPreviewAction, ShowInfoDrawerPreviewAction,
SnackbarErrorAction SnackbarErrorAction
} from '@alfresco/aca-shared/store'; } from '@alfresco/aca-shared/store';
import { ContentManagementService } from '../../../services/content-management.service';
import { TranslationService } from '@alfresco/adf-core'; import { TranslationService } from '@alfresco/adf-core';
import { combineLatest, Observable } from 'rxjs'; import { combineLatest } from 'rxjs';
import { AcaFileAutoDownloadService, AppExtensionService, PageComponent } from '@alfresco/aca-shared'; import { PageComponent } from '@alfresco/aca-shared';
import { SearchSortingDefinition } from '@alfresco/adf-content-services/lib/search/models/search-sorting-definition.interface'; import { SearchSortingDefinition } from '@alfresco/adf-content-services/lib/search/models/search-sorting-definition.interface';
import { takeUntil } from 'rxjs/operators'; import { takeUntil } from 'rxjs/operators';
import { BreakpointObserver, Breakpoints } from '@angular/cdk/layout';
@Component({ @Component({
selector: 'aca-search-results', selector: 'aca-search-results',
@@ -52,36 +48,23 @@ import { BreakpointObserver, Breakpoints } from '@angular/cdk/layout';
styleUrls: ['./search-results.component.scss'] styleUrls: ['./search-results.component.scss']
}) })
export class SearchResultsComponent extends PageComponent implements OnInit { export class SearchResultsComponent extends PageComponent implements OnInit {
showFacetFilter$: Observable<boolean>; showFacetFilter$ = this.store.select(showFacetFilter);
infoDrawerPreview$: Observable<boolean>; infoDrawerPreview$ = this.store.select(infoDrawerPreview);
searchedWord: string; searchedWord: string;
queryParamName = 'q'; queryParamName = 'q';
data: ResultSetPaging; data: ResultSetPaging;
sorting = ['name', 'asc']; sorting = ['name', 'asc'];
isLoading = false; isLoading = false;
isSmallScreen = false;
constructor( constructor(private queryBuilder: SearchQueryBuilderService, private route: ActivatedRoute, private translationService: TranslationService) {
private queryBuilder: SearchQueryBuilderService, super();
private route: ActivatedRoute,
store: Store<AppStore>,
extensions: AppExtensionService,
content: ContentManagementService,
private translationService: TranslationService,
private router: Router,
private breakpointObserver: BreakpointObserver,
fileAutoDownloadService: AcaFileAutoDownloadService
) {
super(store, extensions, content, fileAutoDownloadService);
queryBuilder.paging = { queryBuilder.paging = {
skipCount: 0, skipCount: 0,
maxItems: 25 maxItems: 25
}; };
this.showFacetFilter$ = store.select(showFacetFilter);
this.infoDrawerPreview$ = store.select(infoDrawerPreview);
combineLatest([this.route.params, this.queryBuilder.configUpdated]) combineLatest([this.route.params, this.queryBuilder.configUpdated])
.pipe(takeUntil(this.onDestroy$)) .pipe(takeUntil(this.onDestroy$))
.subscribe(([params, searchConfig]) => { .subscribe(([params, searchConfig]) => {
@@ -92,13 +75,6 @@ export class SearchResultsComponent extends PageComponent implements OnInit {
this.queryBuilder.userQuery = decodeURIComponent(query); this.queryBuilder.userQuery = decodeURIComponent(query);
} }
}); });
this.breakpointObserver
.observe([Breakpoints.HandsetPortrait, Breakpoints.HandsetLandscape])
.pipe(takeUntil(this.onDestroy$))
.subscribe((result) => {
this.isSmallScreen = result.matches;
});
} }
ngOnInit() { ngOnInit() {
@@ -23,34 +23,18 @@
*/ */
import { Component, OnInit } from '@angular/core'; import { Component, OnInit } from '@angular/core';
import { BreakpointObserver, Breakpoints } from '@angular/cdk/layout';
import { ContentManagementService } from '../../services/content-management.service';
import { Store } from '@ngrx/store';
import { debounceTime } from 'rxjs/operators'; import { debounceTime } from 'rxjs/operators';
import { UploadService } from '@alfresco/adf-content-services';
import { Router } from '@angular/router';
import { MinimalNodeEntity } from '@alfresco/js-api'; import { MinimalNodeEntity } from '@alfresco/js-api';
import { AcaFileAutoDownloadService, AppExtensionService, AppHookService, PageComponent } from '@alfresco/aca-shared'; import { AppHookService, PageComponent } from '@alfresco/aca-shared';
import { DocumentListPresetRef } from '@alfresco/adf-extensions'; import { DocumentListPresetRef } from '@alfresco/adf-extensions';
@Component({ @Component({
templateUrl: './shared-files.component.html' templateUrl: './shared-files.component.html'
}) })
export class SharedFilesComponent extends PageComponent implements OnInit { export class SharedFilesComponent extends PageComponent implements OnInit {
isSmallScreen = false;
columns: DocumentListPresetRef[] = []; columns: DocumentListPresetRef[] = [];
constructor( constructor(private appHookService: AppHookService) {
store: Store<any>, super();
extensions: AppExtensionService,
content: ContentManagementService,
private appHookService: AppHookService,
private uploadService: UploadService,
private breakpointObserver: BreakpointObserver,
private router: Router,
fileAutoDownloadService: AcaFileAutoDownloadService
) {
super(store, extensions, content, fileAutoDownloadService);
} }
ngOnInit() { ngOnInit() {
@@ -58,13 +42,8 @@ export class SharedFilesComponent extends PageComponent implements OnInit {
this.subscriptions = this.subscriptions.concat([ this.subscriptions = this.subscriptions.concat([
this.appHookService.linksUnshared.pipe(debounceTime(300)).subscribe(() => this.reload()), this.appHookService.linksUnshared.pipe(debounceTime(300)).subscribe(() => this.reload()),
this.uploadService.fileUploadComplete.pipe(debounceTime(300)).subscribe(() => this.reload()),
this.uploadService.fileUploadComplete.pipe(debounceTime(300)).subscribe((_) => this.reload()), this.uploadService.fileUploadDeleted.pipe(debounceTime(300)).subscribe(() => this.reload())
this.uploadService.fileUploadDeleted.pipe(debounceTime(300)).subscribe((_) => this.reload()),
this.breakpointObserver.observe([Breakpoints.HandsetPortrait, Breakpoints.HandsetLandscape]).subscribe((result) => {
this.isSmallScreen = result.matches;
})
]); ]);
this.columns = this.extensions.documentListPresets.shared || []; this.columns = this.extensions.documentListPresets.shared || [];
@@ -22,43 +22,20 @@
* from Hyland Software. If not, see <http://www.gnu.org/licenses/>. * from Hyland Software. If not, see <http://www.gnu.org/licenses/>.
*/ */
import { AppStore, getUserProfile } from '@alfresco/aca-shared/store'; import { getUserProfile } from '@alfresco/aca-shared/store';
import { DocumentListPresetRef, ProfileState } from '@alfresco/adf-extensions'; import { DocumentListPresetRef } from '@alfresco/adf-extensions';
import { BreakpointObserver, Breakpoints } from '@angular/cdk/layout';
import { Component, OnInit } from '@angular/core'; import { Component, OnInit } from '@angular/core';
import { Store } from '@ngrx/store'; import { PageComponent } from '@alfresco/aca-shared';
import { Observable } from 'rxjs';
import { ContentManagementService } from '../../services/content-management.service';
import { AppExtensionService, PageComponent } from '@alfresco/aca-shared';
@Component({ @Component({
templateUrl: './trashcan.component.html' templateUrl: './trashcan.component.html'
}) })
export class TrashcanComponent extends PageComponent implements OnInit { export class TrashcanComponent extends PageComponent implements OnInit {
isSmallScreen = false; user$ = this.store.select(getUserProfile);
user$: Observable<ProfileState>;
columns: DocumentListPresetRef[] = []; columns: DocumentListPresetRef[] = [];
constructor(
content: ContentManagementService,
extensions: AppExtensionService,
store: Store<AppStore>,
private breakpointObserver: BreakpointObserver
) {
super(store, extensions, content);
this.user$ = this.store.select(getUserProfile);
}
ngOnInit() { ngOnInit() {
super.ngOnInit(); super.ngOnInit();
this.subscriptions.push(
this.breakpointObserver.observe([Breakpoints.HandsetPortrait, Breakpoints.HandsetLandscape]).subscribe((result) => {
this.isSmallScreen = result.matches;
})
);
this.columns = this.extensions.documentListPresets.trashcan || []; this.columns = this.extensions.documentListPresets.trashcan || [];
} }
} }
@@ -44,6 +44,8 @@ import { MaterialModule } from '../material.module';
import { INITIAL_STATE } from '../store/initial-state'; import { INITIAL_STATE } from '../store/initial-state';
import { TranslatePipeMock } from './translate-pipe.directive'; import { TranslatePipeMock } from './translate-pipe.directive';
import { BehaviorSubject, Observable, of } from 'rxjs'; import { BehaviorSubject, Observable, of } from 'rxjs';
import { ContentManagementService } from '../services/content-management.service';
import { DocumentBasePageService } from '@alfresco/aca-shared';
@NgModule({ @NgModule({
imports: [ imports: [
@@ -71,6 +73,7 @@ import { BehaviorSubject, Observable, of } from 'rxjs';
{ provide: AlfrescoApiService, useClass: AlfrescoApiServiceMock }, { provide: AlfrescoApiService, useClass: AlfrescoApiServiceMock },
{ provide: TranslationService, useClass: TranslationMock }, { provide: TranslationService, useClass: TranslationMock },
{ provide: TranslatePipe, useClass: TranslatePipeMock }, { provide: TranslatePipe, useClass: TranslatePipeMock },
{ provide: DocumentBasePageService, useExisting: ContentManagementService },
{ {
provide: DiscoveryApiService, provide: DiscoveryApiService,
useValue: { useValue: {
@@ -24,17 +24,16 @@
import { Component, OnInit, OnDestroy, ViewEncapsulation, HostListener } from '@angular/core'; import { Component, OnInit, OnDestroy, ViewEncapsulation, HostListener } from '@angular/core';
import { Location } from '@angular/common'; import { Location } from '@angular/common';
import { ActivatedRoute, Router, UrlTree, UrlSegmentGroup, UrlSegment, PRIMARY_OUTLET } from '@angular/router'; import { ActivatedRoute, UrlTree, UrlSegmentGroup, UrlSegment, PRIMARY_OUTLET } from '@angular/router';
import { debounceTime, map, takeUntil } from 'rxjs/operators'; import { debounceTime, map, takeUntil } from 'rxjs/operators';
import { UserPreferencesService, ObjectUtils } from '@alfresco/adf-core'; import { UserPreferencesService, ObjectUtils } from '@alfresco/adf-core';
import { Store } from '@ngrx/store'; import { ClosePreviewAction, ViewerActionTypes, SetSelectedNodesAction } from '@alfresco/aca-shared/store';
import { AppStore, ClosePreviewAction, ViewerActionTypes, SetSelectedNodesAction } from '@alfresco/aca-shared/store'; import { PageComponent, AppHookService, ContentApiService } from '@alfresco/aca-shared';
import { PageComponent, AppExtensionService, AppHookService, ContentApiService, DocumentBasePageService } from '@alfresco/aca-shared';
import { ContentActionRef, ViewerExtensionRef } from '@alfresco/adf-extensions'; import { ContentActionRef, ViewerExtensionRef } from '@alfresco/adf-extensions';
import { SearchRequest } from '@alfresco/js-api'; import { SearchRequest } from '@alfresco/js-api';
import { from } from 'rxjs'; import { from } from 'rxjs';
import { Actions, ofType } from '@ngrx/effects'; import { Actions, ofType } from '@ngrx/effects';
import { NodesApiService, UploadService } from '@alfresco/adf-content-services'; import { NodesApiService } from '@alfresco/adf-content-services';
@Component({ @Component({
selector: 'app-preview', selector: 'app-preview',
@@ -89,17 +88,12 @@ export class PreviewComponent extends PageComponent implements OnInit, OnDestroy
private contentApi: ContentApiService, private contentApi: ContentApiService,
private preferences: UserPreferencesService, private preferences: UserPreferencesService,
private route: ActivatedRoute, private route: ActivatedRoute,
private router: Router,
private nodesApiService: NodesApiService, private nodesApiService: NodesApiService,
private uploadService: UploadService,
private actions$: Actions, private actions$: Actions,
private location: Location, private location: Location,
store: Store<AppStore>,
extensions: AppExtensionService,
content: DocumentBasePageService,
private appHookService: AppHookService private appHookService: AppHookService
) { ) {
super(store, extensions, content); super();
} }
ngOnInit() { ngOnInit() {
@@ -22,10 +22,10 @@
* from Hyland Software. If not, see <http://www.gnu.org/licenses/>. * from Hyland Software. If not, see <http://www.gnu.org/licenses/>.
*/ */
import { DocumentListComponent, ShareDataRow } from '@alfresco/adf-content-services'; import { DocumentListComponent, ShareDataRow, UploadService } from '@alfresco/adf-content-services';
import { ShowHeaderMode } from '@alfresco/adf-core'; import { ShowHeaderMode } from '@alfresco/adf-core';
import { ContentActionRef, DocumentListPresetRef, SelectionState } from '@alfresco/adf-extensions'; import { ContentActionRef, DocumentListPresetRef, SelectionState } from '@alfresco/adf-extensions';
import { OnDestroy, OnInit, OnChanges, ViewChild, SimpleChanges, Directive } from '@angular/core'; import { OnDestroy, OnInit, OnChanges, ViewChild, SimpleChanges, Directive, inject } from '@angular/core';
import { Store } from '@ngrx/store'; import { Store } from '@ngrx/store';
import { MinimalNodeEntity, MinimalNodeEntryEntity, NodePaging } from '@alfresco/js-api'; import { MinimalNodeEntity, MinimalNodeEntryEntity, NodePaging } from '@alfresco/js-api';
import { Observable, Subject, Subscription } from 'rxjs'; import { Observable, Subject, Subscription } from 'rxjs';
@@ -46,6 +46,8 @@ import {
import { AppExtensionService } from '../../services/app.extension.service'; import { AppExtensionService } from '../../services/app.extension.service';
import { isLibrary, isLocked } from '../../utils/node.utils'; import { isLibrary, isLocked } from '../../utils/node.utils';
import { AcaFileAutoDownloadService } from '../../services/aca-file-auto-download.service'; import { AcaFileAutoDownloadService } from '../../services/aca-file-auto-download.service';
import { BreakpointObserver, Breakpoints } from '@angular/cdk/layout';
import { Router } from '@angular/router';
/* eslint-disable @angular-eslint/directive-class-suffix */ /* eslint-disable @angular-eslint/directive-class-suffix */
@Directive() @Directive()
@@ -69,16 +71,18 @@ export abstract class PageComponent implements OnInit, OnDestroy, OnChanges {
showHeader = ShowHeaderMode.Data; showHeader = ShowHeaderMode.Data;
filterSorting = 'name-asc'; filterSorting = 'name-asc';
createActions: Array<ContentActionRef> = []; createActions: Array<ContentActionRef> = [];
isSmallScreen = false;
protected extensions = inject(AppExtensionService);
protected content = inject(DocumentBasePageService);
protected store = inject<Store<AppStore>>(Store<AppStore>);
protected breakpointObserver = inject(BreakpointObserver);
protected uploadService = inject(UploadService);
protected router = inject(Router);
private fileAutoDownloadService = inject(AcaFileAutoDownloadService, { optional: true });
protected subscriptions: Subscription[] = []; protected subscriptions: Subscription[] = [];
protected constructor(
protected store: Store<AppStore>,
protected extensions: AppExtensionService,
protected content: DocumentBasePageService,
private fileAutoDownloadService: AcaFileAutoDownloadService = null
) {}
ngOnInit() { ngOnInit() {
this.extensions this.extensions
.getCreateActions() .getCreateActions()
@@ -120,6 +124,13 @@ export abstract class PageComponent implements OnInit, OnDestroy, OnChanges {
.subscribe((node) => { .subscribe((node) => {
this.canUpload = node && this.content.canUploadContent(node); this.canUpload = node && this.content.canUploadContent(node);
}); });
this.breakpointObserver
.observe([Breakpoints.HandsetPortrait, Breakpoints.HandsetLandscape])
.pipe(takeUntil(this.onDestroy$))
.subscribe((result) => {
this.isSmallScreen = result.matches;
});
} }
ngOnChanges(changes: SimpleChanges) { ngOnChanges(changes: SimpleChanges) {
@@ -24,20 +24,20 @@
import { TestBed, ComponentFixture } from '@angular/core/testing'; import { TestBed, ComponentFixture } from '@angular/core/testing';
import { PageComponent } from './document-base-page.component'; import { PageComponent } from './document-base-page.component';
import { ReloadDocumentListAction, SetSelectedNodesAction, AppState, AppStore, ViewNodeAction } from '@alfresco/aca-shared/store'; import { ReloadDocumentListAction, SetSelectedNodesAction, AppState, ViewNodeAction } from '@alfresco/aca-shared/store';
import { AppExtensionService } from '@alfresco/aca-shared'; import { AppExtensionService } from '@alfresco/aca-shared';
import { MinimalNodeEntity, Node, NodePaging } from '@alfresco/js-api'; import { MinimalNodeEntity, NodePaging, RepositoryInfo } from '@alfresco/js-api';
import { DocumentBasePageService } from './document-base-page.service'; import { DocumentBasePageService } from './document-base-page.service';
import { Store, StoreModule } from '@ngrx/store'; import { Store, StoreModule } from '@ngrx/store';
import { Component, Injectable } from '@angular/core'; import { Component, Injectable } from '@angular/core';
import { DocumentListComponent } from '@alfresco/adf-content-services'; import { DiscoveryApiService, DocumentListComponent } from '@alfresco/adf-content-services';
import { MockStore, provideMockStore } from '@ngrx/store/testing'; import { MockStore, provideMockStore } from '@ngrx/store/testing';
import { MaterialModule, PipeModule } from '@alfresco/adf-core'; import { MaterialModule, PipeModule } from '@alfresco/adf-core';
import { HttpClientModule } from '@angular/common/http'; import { HttpClientModule } from '@angular/common/http';
import { NoopAnimationsModule } from '@angular/platform-browser/animations'; import { NoopAnimationsModule } from '@angular/platform-browser/animations';
import { RouterTestingModule } from '@angular/router/testing'; import { RouterTestingModule } from '@angular/router/testing';
import { EffectsModule } from '@ngrx/effects'; import { EffectsModule } from '@ngrx/effects';
import { Subscription } from 'rxjs'; import { BehaviorSubject, Observable, Subscription, of } from 'rxjs';
export const INITIAL_APP_STATE: AppState = { export const INITIAL_APP_STATE: AppState = {
appName: 'Alfresco Content Application', appName: 'Alfresco Content Application',
@@ -77,10 +77,10 @@ export const INITIAL_APP_STATE: AppState = {
@Injectable() @Injectable()
class DocumentBasePageServiceMock extends DocumentBasePageService { class DocumentBasePageServiceMock extends DocumentBasePageService {
canUpdateNode(_node: MinimalNodeEntity): boolean { canUpdateNode(): boolean {
return true; return true;
} }
canUploadContent(_node: Node): boolean { canUploadContent(): boolean {
return true; return true;
} }
} }
@@ -92,8 +92,8 @@ class DocumentBasePageServiceMock extends DocumentBasePageService {
class TestComponent extends PageComponent { class TestComponent extends PageComponent {
node: any; node: any;
constructor(store: Store<AppStore>, extensions: AppExtensionService, content: DocumentBasePageService) { constructor() {
super(store, extensions, content); super();
} }
addSubscription(entry: Subscription) { addSubscription(entry: Subscription) {
@@ -138,6 +138,13 @@ describe('PageComponent', () => {
provide: DocumentBasePageService, provide: DocumentBasePageService,
useClass: DocumentBasePageServiceMock useClass: DocumentBasePageServiceMock
}, },
{
provide: DiscoveryApiService,
useValue: {
ecmProductInfo$: new BehaviorSubject<RepositoryInfo | null>(null),
getEcmProductInfo: (): Observable<RepositoryInfo> => of(new RepositoryInfo({ version: '10.0.0' }))
}
},
AppExtensionService AppExtensionService
] ]
}); });
@@ -283,11 +290,18 @@ describe('Info Drawer state', () => {
}; };
TestBed.configureTestingModule({ TestBed.configureTestingModule({
imports: [NoopAnimationsModule, HttpClientModule, RouterTestingModule], imports: [NoopAnimationsModule, HttpClientModule, RouterTestingModule, MaterialModule],
declarations: [TestComponent], declarations: [TestComponent],
providers: [ providers: [
{ provide: DocumentBasePageService, useClass: DocumentBasePageServiceMock }, { provide: DocumentBasePageService, useClass: DocumentBasePageServiceMock },
AppExtensionService, AppExtensionService,
{
provide: DiscoveryApiService,
useValue: {
ecmProductInfo$: new BehaviorSubject<RepositoryInfo | null>(null),
getEcmProductInfo: (): Observable<RepositoryInfo> => of(new RepositoryInfo({ version: '10.0.0' }))
}
},
provideMockStore({ provideMockStore({
initialState: { app: appState } initialState: { app: appState }
}) })
@@ -54,7 +54,7 @@ import { NodesApiService, UploadService } from '@alfresco/adf-content-services';
host: { class: 'app-viewer' } host: { class: 'app-viewer' }
}) })
export class AcaViewerComponent implements OnInit, OnDestroy { export class AcaViewerComponent implements OnInit, OnDestroy {
_versionsApi: VersionsApi; private _versionsApi: VersionsApi;
get versionsApi(): VersionsApi { get versionsApi(): VersionsApi {
this._versionsApi = this._versionsApi ?? new VersionsApi(this.apiService.getInstance()); this._versionsApi = this._versionsApi ?? new VersionsApi(this.apiService.getInstance());
return this._versionsApi; return this._versionsApi;