[ACS-11417] lint enable angular eslint prefer inject rule default in ng20 for alfresco apps (#5111)

* [ACS-11417] Enable inject prefer eslint rule

* [ACS-11417] Added eslint rule for prefer readonly

* [ACS-11417] Fixed unit tests

* [ACS-11417] Addressed copilot comments
This commit is contained in:
AleksanderSklorz
2026-03-25 08:45:32 +01:00
committed by GitHub
parent 65c814d75b
commit 89a42b3de5
186 changed files with 929 additions and 938 deletions
@@ -76,6 +76,14 @@ import { MatToolbar } from '@angular/material/toolbar';
host: { class: 'aca-manage-rules' }
})
export class ManageRulesSmartComponent implements OnInit {
private readonly location = inject(Location);
private readonly folderRulesService = inject(FolderRulesService);
private readonly route = inject(ActivatedRoute);
private readonly matDialogService = inject(MatDialog);
private readonly notificationService = inject(NotificationService);
private readonly actionsService = inject(ActionsService);
private readonly folderRuleSetsService = inject(FolderRuleSetsService);
nodeId = '';
isInheritanceEnabled = true;
isInheritanceToggleDisabled = false;
@@ -98,16 +106,6 @@ export class ManageRulesSmartComponent implements OnInit {
private readonly destroyRef = inject(DestroyRef);
constructor(
private location: Location,
private folderRulesService: FolderRulesService,
private route: ActivatedRoute,
private matDialogService: MatDialog,
private notificationService: NotificationService,
private actionsService: ActionsService,
private folderRuleSetsService: FolderRuleSetsService
) {}
ngOnInit() {
this.mainRuleSet$ = this.folderRuleSetsService.mainRuleSet$;
this.inheritedRuleSets$ = this.folderRuleSetsService.inheritedRuleSets$;
@@ -73,6 +73,13 @@ import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
]
})
export class RuleActionUiComponent implements ControlValueAccessor, OnInit, OnChanges {
private readonly cardViewUpdateService = inject(CardViewUpdateService);
private readonly dialog = inject(MatDialog);
private readonly translate = inject(TranslateService);
private readonly tagService = inject(TagService);
private readonly categoryService = inject(CategoryService);
private readonly securityControlsService = inject(SecurityControlsService);
@Input()
nodeId = '';
@@ -121,15 +128,6 @@ export class RuleActionUiComponent implements ControlValueAccessor, OnInit, OnCh
private readonly destroyRef = inject(DestroyRef);
constructor(
private cardViewUpdateService: CardViewUpdateService,
private dialog: MatDialog,
private translate: TranslateService,
private tagService: TagService,
private categoryService: CategoryService,
private securityControlsService: SecurityControlsService
) {}
writeValue(action: RuleAction) {
this.form.setValue({
actionDefinitionId: action.actionDefinitionId
@@ -75,9 +75,9 @@ const AUTOCOMPLETE_OPTIONS_DEBOUNCE_TIME = 500;
]
})
export class RuleSimpleConditionUiComponent implements OnInit, ControlValueAccessor, OnChanges {
private appSettings = inject(AppSettingsService);
private categoryService = inject(CategoryService);
private tagService = inject(TagService);
private readonly appSettings = inject(AppSettingsService);
private readonly categoryService = inject(CategoryService);
private readonly tagService = inject(TagService);
form = new FormGroup({
field: new FormControl('cm:name'),
@@ -22,7 +22,7 @@
* from Hyland Software. If not, see <http://www.gnu.org/licenses/>.
*/
import { Component, EventEmitter, Inject, Output, ViewEncapsulation } from '@angular/core';
import { Component, EventEmitter, Output, ViewEncapsulation, inject } from '@angular/core';
import { MAT_DIALOG_DATA, MatDialogModule } from '@angular/material/dialog';
import { Rule } from '../model/rule.model';
import { Observable } from 'rxjs';
@@ -50,6 +50,8 @@ export interface EditRuleDialogOptions {
host: { class: 'aca-edit-rule-dialog' }
})
export class EditRuleDialogUiComponent {
data = inject<EditRuleDialogOptions>(MAT_DIALOG_DATA);
formValid = false;
model: Partial<Rule>;
nodeId = '';
@@ -60,7 +62,7 @@ export class EditRuleDialogUiComponent {
formValue: Partial<Rule>;
@Output() submitted = new EventEmitter<Partial<Rule>>();
constructor(@Inject(MAT_DIALOG_DATA) public data: EditRuleDialogOptions) {
constructor() {
this.model = this.data?.model || {};
this.nodeId = this.data?.nodeId;
this.actionDefinitions$ = this.data?.actionDefinitions$;
@@ -61,6 +61,8 @@ import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
host: { class: 'aca-rule-details' }
})
export class RuleDetailsUiComponent implements OnInit {
private readonly categoryService = inject(CategoryService);
@Input()
readOnly: boolean;
@@ -138,8 +140,6 @@ export class RuleDetailsUiComponent implements OnInit {
private readonly destroyRef = inject(DestroyRef);
constructor(private categoryService: CategoryService) {}
ngOnInit() {
const disabledCategory = !this.categoryService.areCategoriesEnabled();
this.actionDefinitions = this.actionDefinitions.filter((action) => !(disabledCategory && action.id === 'link-category'));
@@ -72,7 +72,7 @@ export class RuleSetPickerSmartComponent implements OnInit {
hasOwnedRules = false;
private selectedNodeId = '';
private folderLoading$ = new BehaviorSubject<boolean>(true);
private readonly folderLoading$ = new BehaviorSubject<boolean>(true);
public readonly data: RuleSetPickerOptions = inject(MAT_DIALOG_DATA);
public readonly folderRuleSetsService = inject(FolderRuleSetsService);
@@ -22,7 +22,7 @@
* from Hyland Software. If not, see <http://www.gnu.org/licenses/>.
*/
import { Injectable } from '@angular/core';
import { Injectable, inject } from '@angular/core';
import { ActionDefinition, ActionDefinitionEntry, ActionDefinitionList, ActionsApi } from '@alfresco/js-api';
import { AlfrescoApiService } from '@alfresco/adf-content-services';
import { BehaviorSubject, forkJoin, from, Observable, of } from 'rxjs';
@@ -32,11 +32,13 @@ import { ActionParameterConstraint, ConstraintValue } from '../model/action-para
@Injectable({ providedIn: 'root' })
export class ActionsService {
private actionDefinitionsListingSource = new BehaviorSubject<ActionDefinitionTransformed[]>([]);
private readonly apiService = inject(AlfrescoApiService);
private readonly actionDefinitionsListingSource = new BehaviorSubject<ActionDefinitionTransformed[]>([]);
actionDefinitionsListing$ = this.actionDefinitionsListingSource.asObservable();
private loadingSource = new BehaviorSubject<boolean>(false);
private readonly loadingSource = new BehaviorSubject<boolean>(false);
loading$ = this.loadingSource.asObservable();
private parameterConstraintsSource = new BehaviorSubject<ActionParameterConstraint[]>([]);
private readonly parameterConstraintsSource = new BehaviorSubject<ActionParameterConstraint[]>([]);
parameterConstraints$: Observable<ActionParameterConstraint[]> = this.parameterConstraintsSource.asObservable();
private _actionsApi: ActionsApi;
@@ -47,8 +49,6 @@ export class ActionsService {
return this._actionsApi;
}
constructor(private apiService: AlfrescoApiService) {}
loadActionDefinitions() {
this.loadingSource.next(true);
from(this.actionsApi.listActions())
@@ -22,7 +22,7 @@
* from Hyland Software. If not, see <http://www.gnu.org/licenses/>.
*/
import { Injectable } from '@angular/core';
import { Injectable, inject } from '@angular/core';
import { AlfrescoApiService } from '@alfresco/adf-content-services';
import { BehaviorSubject, combineLatest, from, Observable, of, startWith } from 'rxjs';
import { NodeInfo } from '@alfresco/aca-shared/store';
@@ -37,6 +37,10 @@ import { Rule } from '../model/rule.model';
providedIn: 'root'
})
export class FolderRuleSetsService {
private readonly apiService = inject(AlfrescoApiService);
private readonly contentApi = inject(ContentApiService);
private readonly folderRulesService = inject(FolderRulesService);
public static readonly MAX_RULE_SETS_PER_GET = 100;
static isOwnedRuleSet(ruleSet: RuleSet, nodeId: string): boolean {
@@ -57,11 +61,11 @@ export class FolderRuleSetsService {
private inheritedRuleSets: RuleSet[] = [];
private hasMoreRuleSets = true;
private mainRuleSetSource = new BehaviorSubject<RuleSet>(null);
private inheritedRuleSetsSource = new BehaviorSubject<RuleSet[]>([]);
private hasMoreRuleSetsSource = new BehaviorSubject<boolean>(true);
private folderInfoSource = new BehaviorSubject<NodeInfo>(null);
private isLoadingSource = new BehaviorSubject<boolean>(false);
private readonly mainRuleSetSource = new BehaviorSubject<RuleSet>(null);
private readonly inheritedRuleSetsSource = new BehaviorSubject<RuleSet[]>([]);
private readonly hasMoreRuleSetsSource = new BehaviorSubject<boolean>(true);
private readonly folderInfoSource = new BehaviorSubject<NodeInfo>(null);
private readonly isLoadingSource = new BehaviorSubject<boolean>(false);
mainRuleSet$: Observable<RuleSet> = this.mainRuleSetSource.asObservable();
inheritedRuleSets$: Observable<RuleSet[]> = this.inheritedRuleSetsSource.asObservable();
@@ -70,11 +74,7 @@ export class FolderRuleSetsService {
isLoading$: Observable<boolean> = this.isLoadingSource.asObservable();
selectedRuleSet$: Observable<RuleSet>;
constructor(
private readonly apiService: AlfrescoApiService,
private readonly contentApi: ContentApiService,
private readonly folderRulesService: FolderRulesService
) {
constructor() {
this.selectedRuleSet$ = this.folderRulesService.selectedRule$.pipe(
startWith(null),
map((rule: Rule) => {
@@ -22,7 +22,7 @@
* from Hyland Software. If not, see <http://www.gnu.org/licenses/>.
*/
import { Injectable } from '@angular/core';
import { Injectable, inject } from '@angular/core';
import { AlfrescoApiService } from '@alfresco/adf-content-services';
import { BehaviorSubject, from, Observable } from 'rxjs';
import { finalize, map } from 'rxjs/operators';
@@ -41,6 +41,9 @@ interface GetRulesResult {
providedIn: 'root'
})
export class FolderRulesService {
private readonly apiService = inject(AlfrescoApiService);
private readonly notificationService = inject(NotificationService);
public static readonly MAX_RULES_PER_GET = 100;
public static get emptyCompositeCondition(): RuleCompositeCondition {
@@ -85,17 +88,12 @@ export class FolderRulesService {
return value;
}
private selectedRuleSource = new BehaviorSubject<Rule>(null);
private deletedRuleIdSource = new BehaviorSubject<string>(null);
private readonly selectedRuleSource = new BehaviorSubject<Rule>(null);
private readonly deletedRuleIdSource = new BehaviorSubject<string>(null);
selectedRule$ = this.selectedRuleSource.asObservable();
deletedRuleId$: Observable<string> = this.deletedRuleIdSource.asObservable();
constructor(
private readonly apiService: AlfrescoApiService,
private readonly notificationService: NotificationService
) {}
private callApi(path: string, httpMethod: string, body: object = {}): Promise<any> {
// APIs used by this service are still private and not yet available for public use
const params = [{}, {}, {}, {}, body, ['application/json'], ['application/json']];