AAE-36664 Cleanup deprecated AppConfigModule (#11016)

* cleanup deprecated AppConfigModule

* migrate factory to initializer

* add provideAppExtensions() api to allow deprecating ExtensionsModule in apps

* fix viewer render import

* use Angular control flow instead of NgIf

* use Angular control flow instead of NgSwitch
This commit is contained in:
Denys Vuika
2025-07-30 14:08:33 -04:00
committed by GitHub
parent 4c4dd195a4
commit d5c2e7c585
8 changed files with 126 additions and 146 deletions

View File

@@ -17,13 +17,12 @@
import { EventEmitter } from '@angular/core';
import { TestBed } from '@angular/core/testing';
import { AppConfigModule, AppConfigService, AppConfigServiceMock } from '@alfresco/adf-core';
import { AppConfigService, AppConfigServiceMock } from '@alfresco/adf-core';
import { UploadService } from './upload.service';
import { RepositoryInfo } from '@alfresco/js-api';
import { BehaviorSubject } from 'rxjs';
import { DiscoveryApiService } from '../../common/services/discovery-api.service';
import { FileModel, FileUploadStatus } from '../../common/models/file.model';
import { HttpClientTestingModule } from '@angular/common/http/testing';
import { AlfrescoApiService } from '../../services';
import { AlfrescoApiServiceMock } from '../../mock';
@@ -38,7 +37,7 @@ describe('UploadService', () => {
beforeEach(() => {
TestBed.configureTestingModule({
imports: [AppConfigModule, HttpClientTestingModule],
imports: [],
providers: [
UploadService,
{ provide: AlfrescoApiService, useClass: AlfrescoApiServiceMock },

View File

@@ -20,5 +20,4 @@ export * from './debug-app-config.service';
export * from './app-config.pipe';
export * from './app-config-storage-prefix.factory';
export * from './app-config.module';
export * from './provide-app-config';

View File

@@ -1,24 +1,26 @@
<div *ngIf="isLoading" class="adf-viewer-render-main-loader">
@if (isLoading) {
<div class="adf-viewer-render-main-loader">
<div class="adf-viewer-render-layout-content adf-viewer__fullscreen-container">
<div class="adf-viewer-render-content-container">
<div class="adf-viewer-render__loading-screen">
<h2 id="loading-spinner-label">{{ 'ADF_VIEWER.LOADING' | translate }}</h2>
<div>
<mat-spinner aria-labelledby="loading-spinner-label"
class="adf-viewer-render__loading-screen__spinner" />
<mat-spinner aria-labelledby="loading-spinner-label" class="adf-viewer-render__loading-screen__spinner" />
</div>
</div>
</div>
</div>
</div>
</div>
}
@if (urlFile || blobFile) {
<div [style.visibility]="isLoading ? 'hidden' : 'visible'" class="adf-viewer-render-main">
<div class="adf-viewer-render-layout-content adf-viewer__fullscreen-container">
<div class="adf-viewer-render-content-container" [ngSwitch]="viewerType">
<ng-container *ngSwitchCase="'external'">
<div class="adf-viewer-render-content-container">
@switch (viewerType) {
@case ('external') {
@if (!!externalViewer) {
<adf-preview-extension
*ngIf="!!externalViewer"
[id]="externalViewer.component"
[url]="urlFile"
[extension]="externalViewer.fileExtension"
@@ -26,9 +28,10 @@
[attr.data-automation-id]="externalViewer.component"
(contentLoaded)="markAsLoaded()"
/>
</ng-container>
}
}
<ng-container *ngSwitchCase="'pdf'">
@case ('pdf') {
<adf-pdf-viewer
[thumbnailsTemplate]="thumbnailsTemplate"
[allowThumbnails]="allowThumbnails"
@@ -40,9 +43,9 @@
(close)="onClose()"
(error)="onUnsupportedFile()"
/>
</ng-container>
}
<ng-container *ngSwitchCase="'image'">
@case ('image') {
<adf-img-viewer
[urlFile]="urlFile"
[readOnly]="readOnly"
@@ -54,9 +57,9 @@
(imageLoaded)="markAsLoaded()"
(isSaving)="isSaving.emit($event)"
/>
</ng-container>
}
<ng-container *ngSwitchCase="'media'">
@case ('media') {
<adf-media-player
id="adf-mdedia-player"
[urlFile]="urlFile"
@@ -67,16 +70,16 @@
(error)="onUnsupportedFile()"
(canPlay)="markAsLoaded()"
/>
</ng-container>
}
<ng-container *ngSwitchCase="'text'">
@case ('text') {
<adf-txt-viewer [urlFile]="urlFile" [blobFile]="blobFile" (contentLoaded)="markAsLoaded()" />
</ng-container>
}
<ng-container *ngSwitchCase="'custom'">
<ng-container *ngFor="let ext of viewerExtensions">
@case ('custom') {
@for (ext of viewerExtensions; track ext.id) {
@if (checkExtensions(ext.fileExtension)) {
<adf-preview-extension
*ngIf="checkExtensions(ext.fileExtension)"
[id]="ext.component"
[url]="urlFile"
[extension]="extension"
@@ -84,27 +87,32 @@
[attr.data-automation-id]="ext.component"
(contentLoaded)="markAsLoaded()"
/>
</ng-container>
}
}
<ng-container *ngFor="let extensionTemplate of extensionTemplates">
<span *ngIf="extensionTemplate.isVisible" class="adf-viewer-render-custom-content">
@if (extensionTemplate.isVisible) {
<span class="adf-viewer-render-custom-content">
<ng-template
[ngTemplateOutlet]="extensionTemplate.template"
[ngTemplateOutletContext]="{ urlFile: urlFile, extension: extension, markAsLoaded: markAsLoaded.bind(this) }"
/>
</span>
}
</ng-container>
</ng-container>
}
<ng-container *ngSwitchDefault>
@default {
<adf-viewer-unknown-format [customError]="customError" />
</ng-container>
}
}
</div>
</div>
</div>
}
<ng-container *ngIf="viewerTemplateExtensions">
@if (viewerTemplateExtensions) {
<ng-template [ngTemplateOutlet]="viewerTemplateExtensions"
[ngTemplateOutletContext]="{ urlFile: urlFile, extension: extension, markAsLoaded: markAsLoaded.bind(this) }"
[ngTemplateOutletInjector]="injector" />
</ng-container>
}

View File

@@ -15,8 +15,8 @@
* limitations under the License.
*/
import { AppExtensionService, ExtensionsModule, ViewerExtensionRef } from '@alfresco/adf-extensions';
import { NgForOf, NgIf, NgSwitch, NgSwitchCase, NgSwitchDefault, NgTemplateOutlet } from '@angular/common';
import { AppExtensionService, ExtensionsModule, ViewerExtensionRef, PreviewExtensionComponent } from '@alfresco/adf-extensions';
import { NgForOf, NgTemplateOutlet } from '@angular/common';
import { Component, EventEmitter, Injector, Input, OnChanges, OnInit, Output, TemplateRef, ViewEncapsulation } from '@angular/core';
import { MatDialog } from '@angular/material/dialog';
import { MatProgressSpinnerModule } from '@angular/material/progress-spinner';
@@ -38,9 +38,6 @@ import { UnknownFormatComponent } from '../unknown-format/unknown-format.compone
imports: [
TranslatePipe,
MatProgressSpinnerModule,
NgSwitch,
NgSwitchCase,
NgIf,
PdfViewerComponent,
ImgViewerComponent,
MediaPlayerComponent,
@@ -49,7 +46,7 @@ import { UnknownFormatComponent } from '../unknown-format/unknown-format.compone
UnknownFormatComponent,
ExtensionsModule,
NgForOf,
NgSwitchDefault
PreviewExtensionComponent
],
providers: [ViewUtilService]
})

View File

@@ -15,36 +15,26 @@
* limitations under the License.
*/
import { DynamicExtensionComponent } from './components/dynamic-component/dynamic.component';
import { DynamicTabComponent } from './components/dynamic-tab/dynamic-tab.component';
import { DynamicColumnComponent } from './components/dynamic-column/dynamic-column.component';
import { PreviewExtensionComponent } from './components/viewer/preview-extension.component';
import { NgModule, ModuleWithProviders, inject, provideAppInitializer } from '@angular/core';
import { AppExtensionService } from './services/app-extension.service';
import { setupExtensions } from './services/startup-extension-factory';
export const EXTENSION_DIRECTIVES = [DynamicExtensionComponent, DynamicTabComponent, DynamicColumnComponent, PreviewExtensionComponent] as const;
/** @deprecated import EXTENSION_DIRECTIVES or standalone components instead */
@NgModule({
imports: [...EXTENSION_DIRECTIVES],
exports: [...EXTENSION_DIRECTIVES]
})
/** @deprecated use provideAppExtensions() api instead */
@NgModule()
export class ExtensionsModule {
static forRoot(): ModuleWithProviders<ExtensionsModule> {
return {
ngModule: ExtensionsModule,
providers: [
provideAppInitializer(() => {
const initializerFn = setupExtensions(inject(AppExtensionService));
return initializerFn();
const appExtensionService = inject(AppExtensionService);
return appExtensionService.load();
})
]
};
}
/**
* @deprecated use `ExtensionsModule` instead, `EXTENSION_DIRECTIVES` or direct standalone components
* @deprecated use provideAppExtensions() api instead
* @returns Module with providers
*/
static forChild(): ModuleWithProviders<ExtensionsModule> {

View File

@@ -15,12 +15,18 @@
* limitations under the License.
*/
import { NgModule } from '@angular/core';
import { AppConfigPipe } from './app-config.pipe';
import { EnvironmentProviders, inject, provideAppInitializer, Provider } from '@angular/core';
import { AppExtensionService } from './services/app-extension.service';
/** @deprecated This module is deprecated, consider importing AppConfigPipe directly */
@NgModule({
imports: [AppConfigPipe],
exports: [AppConfigPipe]
})
export class AppConfigModule {}
/**
* Provides all necessary entries for the app extensibility
* @returns list of providers
*/
export function provideAppExtensions(): (Provider | EnvironmentProviders)[] {
return [
provideAppInitializer(() => {
const appExtensionService = inject(AppExtensionService);
return appExtensionService.load();
})
];
}

View File

@@ -1,20 +0,0 @@
/*!
* @license
* Copyright © 2005-2025 Hyland Software, Inc. and its affiliates. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import { AppExtensionService } from './app-extension.service';
export const setupExtensions = (appExtensionService: AppExtensionService) => () => appExtensionService.load();

View File

@@ -41,3 +41,4 @@ export * from './lib/store/states/repository.state';
export * from './lib/components/public-api';
export * from './lib/extensions.module';
export * from './lib/providers';