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 { EventEmitter } from '@angular/core';
import { TestBed } from '@angular/core/testing'; 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 { UploadService } from './upload.service';
import { RepositoryInfo } from '@alfresco/js-api'; import { RepositoryInfo } from '@alfresco/js-api';
import { BehaviorSubject } from 'rxjs'; import { BehaviorSubject } from 'rxjs';
import { DiscoveryApiService } from '../../common/services/discovery-api.service'; import { DiscoveryApiService } from '../../common/services/discovery-api.service';
import { FileModel, FileUploadStatus } from '../../common/models/file.model'; import { FileModel, FileUploadStatus } from '../../common/models/file.model';
import { HttpClientTestingModule } from '@angular/common/http/testing';
import { AlfrescoApiService } from '../../services'; import { AlfrescoApiService } from '../../services';
import { AlfrescoApiServiceMock } from '../../mock'; import { AlfrescoApiServiceMock } from '../../mock';
@@ -38,7 +37,7 @@ describe('UploadService', () => {
beforeEach(() => { beforeEach(() => {
TestBed.configureTestingModule({ TestBed.configureTestingModule({
imports: [AppConfigModule, HttpClientTestingModule], imports: [],
providers: [ providers: [
UploadService, UploadService,
{ provide: AlfrescoApiService, useClass: AlfrescoApiServiceMock }, { 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.pipe';
export * from './app-config-storage-prefix.factory'; export * from './app-config-storage-prefix.factory';
export * from './app-config.module';
export * from './provide-app-config'; 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-layout-content adf-viewer__fullscreen-container">
<div class="adf-viewer-render-content-container"> <div class="adf-viewer-render-content-container">
<div class="adf-viewer-render__loading-screen"> <div class="adf-viewer-render__loading-screen">
<h2 id="loading-spinner-label">{{ 'ADF_VIEWER.LOADING' | translate }}</h2> <h2 id="loading-spinner-label">{{ 'ADF_VIEWER.LOADING' | translate }}</h2>
<div> <div>
<mat-spinner aria-labelledby="loading-spinner-label" <mat-spinner aria-labelledby="loading-spinner-label" class="adf-viewer-render__loading-screen__spinner" />
class="adf-viewer-render__loading-screen__spinner" />
</div> </div>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
}
@if (urlFile || blobFile) { @if (urlFile || blobFile) {
<div [style.visibility]="isLoading ? 'hidden' : 'visible'" class="adf-viewer-render-main"> <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-layout-content adf-viewer__fullscreen-container">
<div class="adf-viewer-render-content-container" [ngSwitch]="viewerType"> <div class="adf-viewer-render-content-container">
<ng-container *ngSwitchCase="'external'"> @switch (viewerType) {
@case ('external') {
@if (!!externalViewer) {
<adf-preview-extension <adf-preview-extension
*ngIf="!!externalViewer"
[id]="externalViewer.component" [id]="externalViewer.component"
[url]="urlFile" [url]="urlFile"
[extension]="externalViewer.fileExtension" [extension]="externalViewer.fileExtension"
@@ -26,9 +28,10 @@
[attr.data-automation-id]="externalViewer.component" [attr.data-automation-id]="externalViewer.component"
(contentLoaded)="markAsLoaded()" (contentLoaded)="markAsLoaded()"
/> />
</ng-container> }
}
<ng-container *ngSwitchCase="'pdf'"> @case ('pdf') {
<adf-pdf-viewer <adf-pdf-viewer
[thumbnailsTemplate]="thumbnailsTemplate" [thumbnailsTemplate]="thumbnailsTemplate"
[allowThumbnails]="allowThumbnails" [allowThumbnails]="allowThumbnails"
@@ -40,9 +43,9 @@
(close)="onClose()" (close)="onClose()"
(error)="onUnsupportedFile()" (error)="onUnsupportedFile()"
/> />
</ng-container> }
<ng-container *ngSwitchCase="'image'"> @case ('image') {
<adf-img-viewer <adf-img-viewer
[urlFile]="urlFile" [urlFile]="urlFile"
[readOnly]="readOnly" [readOnly]="readOnly"
@@ -54,9 +57,9 @@
(imageLoaded)="markAsLoaded()" (imageLoaded)="markAsLoaded()"
(isSaving)="isSaving.emit($event)" (isSaving)="isSaving.emit($event)"
/> />
</ng-container> }
<ng-container *ngSwitchCase="'media'"> @case ('media') {
<adf-media-player <adf-media-player
id="adf-mdedia-player" id="adf-mdedia-player"
[urlFile]="urlFile" [urlFile]="urlFile"
@@ -67,16 +70,16 @@
(error)="onUnsupportedFile()" (error)="onUnsupportedFile()"
(canPlay)="markAsLoaded()" (canPlay)="markAsLoaded()"
/> />
</ng-container> }
<ng-container *ngSwitchCase="'text'"> @case ('text') {
<adf-txt-viewer [urlFile]="urlFile" [blobFile]="blobFile" (contentLoaded)="markAsLoaded()" /> <adf-txt-viewer [urlFile]="urlFile" [blobFile]="blobFile" (contentLoaded)="markAsLoaded()" />
</ng-container> }
<ng-container *ngSwitchCase="'custom'"> @case ('custom') {
<ng-container *ngFor="let ext of viewerExtensions"> @for (ext of viewerExtensions; track ext.id) {
@if (checkExtensions(ext.fileExtension)) {
<adf-preview-extension <adf-preview-extension
*ngIf="checkExtensions(ext.fileExtension)"
[id]="ext.component" [id]="ext.component"
[url]="urlFile" [url]="urlFile"
[extension]="extension" [extension]="extension"
@@ -84,27 +87,32 @@
[attr.data-automation-id]="ext.component" [attr.data-automation-id]="ext.component"
(contentLoaded)="markAsLoaded()" (contentLoaded)="markAsLoaded()"
/> />
</ng-container> }
}
<ng-container *ngFor="let extensionTemplate of extensionTemplates"> <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 <ng-template
[ngTemplateOutlet]="extensionTemplate.template" [ngTemplateOutlet]="extensionTemplate.template"
[ngTemplateOutletContext]="{ urlFile: urlFile, extension: extension, markAsLoaded: markAsLoaded.bind(this) }" [ngTemplateOutletContext]="{ urlFile: urlFile, extension: extension, markAsLoaded: markAsLoaded.bind(this) }"
/> />
</span> </span>
}
</ng-container> </ng-container>
</ng-container> }
<ng-container *ngSwitchDefault> @default {
<adf-viewer-unknown-format [customError]="customError" /> <adf-viewer-unknown-format [customError]="customError" />
</ng-container> }
}
</div> </div>
</div> </div>
</div> </div>
} }
<ng-container *ngIf="viewerTemplateExtensions">
@if (viewerTemplateExtensions) {
<ng-template [ngTemplateOutlet]="viewerTemplateExtensions" <ng-template [ngTemplateOutlet]="viewerTemplateExtensions"
[ngTemplateOutletContext]="{ urlFile: urlFile, extension: extension, markAsLoaded: markAsLoaded.bind(this) }" [ngTemplateOutletContext]="{ urlFile: urlFile, extension: extension, markAsLoaded: markAsLoaded.bind(this) }"
[ngTemplateOutletInjector]="injector" /> [ngTemplateOutletInjector]="injector" />
</ng-container> }

View File

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

View File

@@ -15,36 +15,26 @@
* limitations under the License. * 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 { NgModule, ModuleWithProviders, inject, provideAppInitializer } from '@angular/core';
import { AppExtensionService } from './services/app-extension.service'; 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 use provideAppExtensions() api instead */
@NgModule()
/** @deprecated import EXTENSION_DIRECTIVES or standalone components instead */
@NgModule({
imports: [...EXTENSION_DIRECTIVES],
exports: [...EXTENSION_DIRECTIVES]
})
export class ExtensionsModule { export class ExtensionsModule {
static forRoot(): ModuleWithProviders<ExtensionsModule> { static forRoot(): ModuleWithProviders<ExtensionsModule> {
return { return {
ngModule: ExtensionsModule, ngModule: ExtensionsModule,
providers: [ providers: [
provideAppInitializer(() => { provideAppInitializer(() => {
const initializerFn = setupExtensions(inject(AppExtensionService)); const appExtensionService = inject(AppExtensionService);
return initializerFn(); return appExtensionService.load();
}) })
] ]
}; };
} }
/** /**
* @deprecated use `ExtensionsModule` instead, `EXTENSION_DIRECTIVES` or direct standalone components * @deprecated use provideAppExtensions() api instead
* @returns Module with providers * @returns Module with providers
*/ */
static forChild(): ModuleWithProviders<ExtensionsModule> { static forChild(): ModuleWithProviders<ExtensionsModule> {

View File

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