[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

View File

@@ -306,7 +306,9 @@
"selector": ":matches(Literal[value=/ng-reflect-/], TemplateElement[value.cooked=/ng-reflect-/])",
"message": "*ng-reflect-* attributes should not be used. Consider alternatives for proper selectors."
}
]
],
"@angular-eslint/prefer-inject": "error",
"@typescript-eslint/prefer-readonly": "error"
}
},
{

View File

@@ -22,7 +22,7 @@
* from Hyland Software. If not, see <http://www.gnu.org/licenses/>.
*/
import { Component, ViewEncapsulation } from '@angular/core';
import { Component, ViewEncapsulation, inject } from '@angular/core';
import { AppService } from '@alfresco/aca-shared';
import { MatIconRegistry } from '@angular/material/icon';
import { RouterOutlet } from '@angular/router';
@@ -36,10 +36,11 @@ import { RouterOutlet } from '@angular/router';
imports: [RouterOutlet]
})
export class AppComponent {
constructor(
private appService: AppService,
matIconRegistry: MatIconRegistry
) {
private readonly appService = inject(AppService);
constructor() {
const matIconRegistry = inject(MatIconRegistry);
this.appService.init();
matIconRegistry.setDefaultFontSetClass('material-icons-outlined');
}

204
package-lock.json generated
View File

@@ -50,11 +50,11 @@
"@angular-devkit/build-angular": "19.2.22",
"@angular-devkit/core": "19.2.18",
"@angular-devkit/schematics": "19.2.18",
"@angular-eslint/builder": "19.3.0",
"@angular-eslint/eslint-plugin": "19.3.0",
"@angular-eslint/eslint-plugin-template": "19.3.0",
"@angular-eslint/schematics": "19.3.0",
"@angular-eslint/template-parser": "19.3.0",
"@angular-eslint/builder": "19.8.1",
"@angular-eslint/eslint-plugin": "19.8.1",
"@angular-eslint/eslint-plugin-template": "19.8.1",
"@angular-eslint/schematics": "19.8.1",
"@angular-eslint/template-parser": "19.8.1",
"@angular/compiler-cli": "19.2.19",
"@angular/language-service": "19.2.18",
"@cspell/eslint-plugin": "^9.2.1",
@@ -149,6 +149,7 @@
"resolved": "https://registry.npmjs.org/@alfresco/adf-core/-/adf-core-8.5.0-23298028349.tgz",
"integrity": "sha512-jRi7qyK9Eas6S0mfPurm7vdrnXPgiQDF3b+/hKyqdatSIuIMF2p0Y+dxazqfd+/OzK26S/X4Ju9pBR8wlnDvmg==",
"license": "Apache-2.0",
"peer": true,
"dependencies": {
"angular-oauth2-oidc": "17.0.2",
"angular-oauth2-oidc-jwks": "17.0.2",
@@ -196,6 +197,7 @@
"resolved": "https://registry.npmjs.org/@alfresco/adf-extensions/-/adf-extensions-8.5.0-23298028349.tgz",
"integrity": "sha512-PXuUrxKMsWVCn1Ts++7aRzNgVUrzJ7FgcwVxgBzqM4YzXT/cZmrXHDRGIZl0e4R3MLpKR8axqnEFogec8ws4TQ==",
"license": "Apache-2.0",
"peer": true,
"dependencies": {
"tslib": "^2.3.0"
},
@@ -216,6 +218,7 @@
"resolved": "https://registry.npmjs.org/@alfresco/js-api/-/js-api-9.5.0-23298028349.tgz",
"integrity": "sha512-S5SQmpuSYsBsVCGUcEv1eQsqsPTMwFkACwGUFHu2iWKRKo4wk/0MdM2eKV7dIjswrMCACDcEPx1K3tvQ8zeYyQ==",
"license": "Apache-2.0",
"peer": true,
"dependencies": {
"eventemitter3": "^5.0.1",
"superagent": "^9.0.1",
@@ -729,9 +732,9 @@
}
},
"node_modules/@angular-eslint/builder": {
"version": "19.3.0",
"resolved": "https://registry.npmjs.org/@angular-eslint/builder/-/builder-19.3.0.tgz",
"integrity": "sha512-j9xNrzZJq29ONSG6EaeQHve0Squkm6u6Dm8fZgWP7crTFOrtLXn7Wxgxuyl9eddpbWY1Ov1gjFuwBVnxIdyAqg==",
"version": "19.8.1",
"resolved": "https://registry.npmjs.org/@angular-eslint/builder/-/builder-19.8.1.tgz",
"integrity": "sha512-NOMkw0xgDoDVCLkL5nkkvdd3ouDYkOGqtEmabTR7N4/kQnk1R4coOTWGCqAgMXCFdxlyjuxquDwuJ+yni81pRg==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -744,21 +747,21 @@
}
},
"node_modules/@angular-eslint/bundled-angular-compiler": {
"version": "19.3.0",
"resolved": "https://registry.npmjs.org/@angular-eslint/bundled-angular-compiler/-/bundled-angular-compiler-19.3.0.tgz",
"integrity": "sha512-63Zci4pvnUR1iSkikFlNbShF1tO5HOarYd8fvNfmOZwFfZ/1T3j3bCy9YbE+aM5SYrWqPaPP/OcwZ3wJ8WNvqA==",
"version": "19.8.1",
"resolved": "https://registry.npmjs.org/@angular-eslint/bundled-angular-compiler/-/bundled-angular-compiler-19.8.1.tgz",
"integrity": "sha512-WXi1YbSs7SIQo48u+fCcc5Nt14/T4QzYQPLZUnjtsUXPgQG7ZoahhcGf7PPQ+n0V3pSopHOlSHwqK+tSsYK87A==",
"dev": true,
"license": "MIT"
},
"node_modules/@angular-eslint/eslint-plugin": {
"version": "19.3.0",
"resolved": "https://registry.npmjs.org/@angular-eslint/eslint-plugin/-/eslint-plugin-19.3.0.tgz",
"integrity": "sha512-nBLslLI20KnVbqlfNW7GcnI9R6cYCvRGjOE2QYhzxM316ciAQ62tvQuXP9ZVnRBLSKDAVnMeC0eTq9O4ysrxrQ==",
"version": "19.8.1",
"resolved": "https://registry.npmjs.org/@angular-eslint/eslint-plugin/-/eslint-plugin-19.8.1.tgz",
"integrity": "sha512-wZEBMPwD2TRhifG751hcj137EMIEaFmsxRB2EI+vfINCgPnFGSGGOHXqi8aInn9fXqHs7VbXkAzXYdBsvy1m4Q==",
"dev": true,
"license": "MIT",
"dependencies": {
"@angular-eslint/bundled-angular-compiler": "19.3.0",
"@angular-eslint/utils": "19.3.0"
"@angular-eslint/bundled-angular-compiler": "19.8.1",
"@angular-eslint/utils": "19.8.1"
},
"peerDependencies": {
"@typescript-eslint/utils": "^7.11.0 || ^8.0.0",
@@ -767,18 +770,19 @@
}
},
"node_modules/@angular-eslint/eslint-plugin-template": {
"version": "19.3.0",
"resolved": "https://registry.npmjs.org/@angular-eslint/eslint-plugin-template/-/eslint-plugin-template-19.3.0.tgz",
"integrity": "sha512-WyouppTpOYut+wvv13wlqqZ8EHoDrCZxNfGKuEUYK1BPmQlTB8EIZfQH4iR1rFVS28Rw+XRIiXo1x3oC0SOfnA==",
"version": "19.8.1",
"resolved": "https://registry.npmjs.org/@angular-eslint/eslint-plugin-template/-/eslint-plugin-template-19.8.1.tgz",
"integrity": "sha512-0ZVQldndLrDfB0tzFe/uIwvkUcakw8qGxvkEU0l7kSbv/ngNQ/qrkRi7P64otB15inIDUNZI2jtmVat52dqSfQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"@angular-eslint/bundled-angular-compiler": "19.3.0",
"@angular-eslint/utils": "19.3.0",
"@angular-eslint/bundled-angular-compiler": "19.8.1",
"@angular-eslint/utils": "19.8.1",
"aria-query": "5.3.2",
"axobject-query": "4.1.0"
},
"peerDependencies": {
"@angular-eslint/template-parser": "19.8.1",
"@typescript-eslint/types": "^7.11.0 || ^8.0.0",
"@typescript-eslint/utils": "^7.11.0 || ^8.0.0",
"eslint": "^8.57.0 || ^9.0.0",
@@ -786,29 +790,43 @@
}
},
"node_modules/@angular-eslint/schematics": {
"version": "19.3.0",
"resolved": "https://registry.npmjs.org/@angular-eslint/schematics/-/schematics-19.3.0.tgz",
"integrity": "sha512-Wl5sFQ4t84LUb8mJ2iVfhYFhtF55IugXu7rRhPHtgIu9Ty5s1v3HGUx4LKv51m2kWhPPeFOTmjeBv1APzFlmnQ==",
"version": "19.8.1",
"resolved": "https://registry.npmjs.org/@angular-eslint/schematics/-/schematics-19.8.1.tgz",
"integrity": "sha512-MKzfO3puOCuQFgP8XDUkEr5eaqcCQLAdYLLMcywEO/iRs1eRHL46+rkW+SjDp1cUqlxKtu+rLiTYr0T/O4fi9Q==",
"dev": true,
"license": "MIT",
"dependencies": {
"@angular-devkit/core": ">= 19.0.0 < 20.0.0",
"@angular-devkit/schematics": ">= 19.0.0 < 20.0.0",
"@angular-eslint/eslint-plugin": "19.3.0",
"@angular-eslint/eslint-plugin-template": "19.3.0",
"ignore": "7.0.3",
"semver": "7.7.1",
"@angular-eslint/eslint-plugin": "19.8.1",
"@angular-eslint/eslint-plugin-template": "19.8.1",
"ignore": "7.0.5",
"semver": "7.7.2",
"strip-json-comments": "3.1.1"
}
},
"node_modules/@angular-eslint/schematics/node_modules/semver": {
"version": "7.7.2",
"resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz",
"integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==",
"dev": true,
"license": "ISC",
"bin": {
"semver": "bin/semver.js"
},
"engines": {
"node": ">=10"
}
},
"node_modules/@angular-eslint/template-parser": {
"version": "19.3.0",
"resolved": "https://registry.npmjs.org/@angular-eslint/template-parser/-/template-parser-19.3.0.tgz",
"integrity": "sha512-VxMNgsHXMWbbmZeBuBX5i8pzsSSEaoACVpaE+j8Muk60Am4Mxc0PytJm4n3znBSvI3B7Kq2+vStSRYPkOER4lA==",
"version": "19.8.1",
"resolved": "https://registry.npmjs.org/@angular-eslint/template-parser/-/template-parser-19.8.1.tgz",
"integrity": "sha512-pQiOg+se1AU/ncMlnJ9V6xYnMQ84qI1BGWuJpbU6A99VTXJg90scg0+T7DWmKssR1YjP5qmmBtrZfKsHEcLW/A==",
"dev": true,
"license": "MIT",
"peer": true,
"dependencies": {
"@angular-eslint/bundled-angular-compiler": "19.3.0",
"@angular-eslint/bundled-angular-compiler": "19.8.1",
"eslint-scope": "^8.0.2"
},
"peerDependencies": {
@@ -817,13 +835,13 @@
}
},
"node_modules/@angular-eslint/utils": {
"version": "19.3.0",
"resolved": "https://registry.npmjs.org/@angular-eslint/utils/-/utils-19.3.0.tgz",
"integrity": "sha512-ovvbQh96FIJfepHqLCMdKFkPXr3EbcvYc9kMj9hZyIxs/9/VxwPH7x25mMs4VsL6rXVgH2FgG5kR38UZlcTNNw==",
"version": "19.8.1",
"resolved": "https://registry.npmjs.org/@angular-eslint/utils/-/utils-19.8.1.tgz",
"integrity": "sha512-gVDKYWmAjeTPtaYmddT/HS03fCebXJtrk8G1MouQIviZbHqLjap6TbVlzlkBigRzaF0WnFnrDduQslkJzEdceA==",
"dev": true,
"license": "MIT",
"dependencies": {
"@angular-eslint/bundled-angular-compiler": "19.3.0"
"@angular-eslint/bundled-angular-compiler": "19.8.1"
},
"peerDependencies": {
"@typescript-eslint/utils": "^7.11.0 || ^8.0.0",
@@ -836,6 +854,7 @@
"resolved": "https://registry.npmjs.org/@angular/animations/-/animations-19.2.19.tgz",
"integrity": "sha512-XGChk+26XZpcwzIQUVjgLxGVC//m5TaDrogseQNIGs2Chzv6KYbo91HftL69fTiM5udRYjg6IV7XEzDNF/GVUw==",
"license": "MIT",
"peer": true,
"dependencies": {
"tslib": "^2.3.0"
},
@@ -852,6 +871,7 @@
"resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-19.2.19.tgz",
"integrity": "sha512-PCpJagurPBqciqcq4Z8+3OtKLb7rSl4w/qBJoIMua8CgnrjvA1i+SWawhdtfI1zlY8FSwhzLwXV0CmWWfFzQPg==",
"license": "MIT",
"peer": true,
"dependencies": {
"parse5": "^7.1.2",
"tslib": "^2.3.0"
@@ -867,6 +887,7 @@
"resolved": "https://registry.npmjs.org/@angular/common/-/common-19.2.19.tgz",
"integrity": "sha512-/JYo8jJZ6BAgw3IVYJpinAfGb+RbaZubrElFvaq450BWxDPInv7Z99HKEQ3qEBRsBeIAQ/WrKXDxoJSjy7QMNQ==",
"license": "MIT",
"peer": true,
"dependencies": {
"tslib": "^2.3.0"
},
@@ -883,6 +904,7 @@
"resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-19.2.19.tgz",
"integrity": "sha512-kWlqFW7ExvAqKv+X/6ZsWVW7YTmI1/3VUvADLC/6bkLTdKrHS8OtBHfsklXmHMNVbbFopTvoTeKkoqLGrW2lwg==",
"license": "MIT",
"peer": true,
"dependencies": {
"tslib": "^2.3.0"
},
@@ -896,6 +918,7 @@
"integrity": "sha512-vdMJX9E7wePN41T+6BYRQBA+XiR9a5DBhs20dqtv8YVireQktH6mxLZIg1pVxkL/gnao2gpl/lOvp0xmC7UN/Q==",
"dev": true,
"license": "MIT",
"peer": true,
"dependencies": {
"@babel/core": "7.26.9",
"@jridgewell/sourcemap-codec": "^1.4.14",
@@ -972,6 +995,7 @@
"resolved": "https://registry.npmjs.org/@angular/core/-/core-19.2.19.tgz",
"integrity": "sha512-VZAzpxBoQgyy7AOlhxbAHxPQWo0nk8xsnrD36PLCZeTZA/5GNzO3lLVaX2N5BCUgpgiCBjNBKq9kVo6ZkAls9g==",
"license": "MIT",
"peer": true,
"dependencies": {
"tslib": "^2.3.0"
},
@@ -988,6 +1012,7 @@
"resolved": "https://registry.npmjs.org/@angular/forms/-/forms-19.2.19.tgz",
"integrity": "sha512-J09++utTVaPs962y/adeDjIgqyhzNpnzAS7Nex+HNy/LnWPcTNW781cOh1EGS1X/+CmgnI8HWs5z4KGeBeU1aA==",
"license": "MIT",
"peer": true,
"dependencies": {
"tslib": "^2.3.0"
},
@@ -1015,6 +1040,7 @@
"resolved": "https://registry.npmjs.org/@angular/material/-/material-19.2.19.tgz",
"integrity": "sha512-auIE6JUzTIA3LyYklh9J/T7u64crmphxUBgAa0zcOMDog6SYfwbNe9YeLQqua5ek4OUAOdK/BHHfVl5W5iaUoQ==",
"license": "MIT",
"peer": true,
"dependencies": {
"tslib": "^2.3.0"
},
@@ -1032,6 +1058,7 @@
"resolved": "https://registry.npmjs.org/@angular/material-date-fns-adapter/-/material-date-fns-adapter-19.2.19.tgz",
"integrity": "sha512-So+jptG1uhLhdSA1NuCkbfPl5tf/PRJVdfSn/9R2HzmjZSV65RuvhwDvFK9CV/Zhj9s9h7rXyn7V5GtThjznGw==",
"license": "MIT",
"peer": true,
"dependencies": {
"tslib": "^2.3.0"
},
@@ -1046,6 +1073,7 @@
"resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-19.2.19.tgz",
"integrity": "sha512-bnQSmoJNI1LQxJnHnB01XQXqgOdgAtLAOsa24ZT6b2pWV3Vw0/7+V2dZsNZX/TJtejunvSgSDCEqgJhIQ5vBVg==",
"license": "MIT",
"peer": true,
"dependencies": {
"tslib": "^2.3.0"
},
@@ -1068,6 +1096,7 @@
"resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-19.2.19.tgz",
"integrity": "sha512-u8aYmIRGtx4yOXhmqgiRIm+DyH+05bAkzMHr6RE0JV/wxVJmAIKZnquHM6ItFvF0eV0pfMTPwArmRuHVWu7tQg==",
"license": "MIT",
"peer": true,
"dependencies": {
"tslib": "^2.3.0"
},
@@ -1086,6 +1115,7 @@
"resolved": "https://registry.npmjs.org/@angular/router/-/router-19.2.19.tgz",
"integrity": "sha512-zh40ihKgYOM5pjgUOLlUKdWYsGgEj7MQHgzdV1E9Zz6LBrQTp/PGS/UdCQn88H6KAshR0uXrkc/vP+tnB2jqdg==",
"license": "MIT",
"peer": true,
"dependencies": {
"tslib": "^2.3.0"
},
@@ -1143,6 +1173,7 @@
"integrity": "sha512-vMqyb7XCDMPvJFFOaT9kxtiRh42GwlZEg1/uIgtZshS5a/8OaduUfCi7kynKgc3Tw/6Uo2D+db9qBttghhmxwQ==",
"dev": true,
"license": "MIT",
"peer": true,
"dependencies": {
"@ampproject/remapping": "^2.2.0",
"@babel/code-frame": "^7.26.2",
@@ -3183,7 +3214,8 @@
"resolved": "https://registry.npmjs.org/@cspell/dict-css/-/dict-css-4.0.18.tgz",
"integrity": "sha512-EF77RqROHL+4LhMGW5NTeKqfUd/e4OOv6EDFQ/UQQiFyWuqkEKyEz0NDILxOFxWUEVdjT2GQ2cC7t12B6pESwg==",
"dev": true,
"license": "MIT"
"license": "MIT",
"peer": true
},
"node_modules/@cspell/dict-dart": {
"version": "2.3.1",
@@ -3323,14 +3355,16 @@
"resolved": "https://registry.npmjs.org/@cspell/dict-html/-/dict-html-4.0.13.tgz",
"integrity": "sha512-vHzk2xfqQYPvoXtQtywa6ekIonPrUEwe2uftjry3UNRNl89TtzLJVSkiymKJ3WMb+W/DwKXKIb1tKzcIS8ccIg==",
"dev": true,
"license": "MIT"
"license": "MIT",
"peer": true
},
"node_modules/@cspell/dict-html-symbol-entities": {
"version": "4.0.4",
"resolved": "https://registry.npmjs.org/@cspell/dict-html-symbol-entities/-/dict-html-symbol-entities-4.0.4.tgz",
"integrity": "sha512-afea+0rGPDeOV9gdO06UW183Qg6wRhWVkgCFwiO3bDupAoyXRuvupbb5nUyqSTsLXIKL8u8uXQlJ9pkz07oVXw==",
"dev": true,
"license": "MIT"
"license": "MIT",
"peer": true
},
"node_modules/@cspell/dict-java": {
"version": "5.0.12",
@@ -3528,7 +3562,8 @@
"resolved": "https://registry.npmjs.org/@cspell/dict-typescript/-/dict-typescript-3.2.3.tgz",
"integrity": "sha512-zXh1wYsNljQZfWWdSPYwQhpwiuW0KPW1dSd8idjMRvSD0aSvWWHoWlrMsmZeRl4qM4QCEAjua8+cjflm41cQBg==",
"dev": true,
"license": "MIT"
"license": "MIT",
"peer": true
},
"node_modules/@cspell/dict-vue": {
"version": "3.0.5",
@@ -3647,6 +3682,7 @@
}
],
"license": "MIT",
"peer": true,
"engines": {
"node": "^14 || ^16 || >=18"
},
@@ -3670,6 +3706,7 @@
}
],
"license": "MIT",
"peer": true,
"engines": {
"node": "^14 || ^16 || >=18"
}
@@ -5221,6 +5258,7 @@
"resolved": "https://registry.npmjs.org/@mat-datetimepicker/core/-/core-15.0.2.tgz",
"integrity": "sha512-2vyKub5uCSAWoKC7UlUbNFOwHrHu9gdaK1xluMiimj8GibkxuP0uh2AP1tRsYz2514CAFvsSkD39X6qy0kz7Iw==",
"license": "MIT",
"peer": true,
"dependencies": {
"tslib": "~2.8.1"
},
@@ -5341,6 +5379,7 @@
"integrity": "sha512-8PFQxtmXc6ukBC4CqGIoc96M2Ly9WVwCPu4Ffvt+K/SB6rGbeFeZoYAwREV1zGNMJ5v5ly6+AHIEOBxNuSnzSg==",
"dev": true,
"license": "MIT",
"peer": true,
"dependencies": {
"@module-federation/bridge-react-webpack-plugin": "0.21.6",
"@module-federation/cli": "0.21.6",
@@ -5679,6 +5718,7 @@
"integrity": "sha512-MfDNbQFvbfeQNdc2hvb85qBQ29aehs9NGVWXE0goDPLb4SJNPVMYXjrgiNx6Z0glud7rEnXdstRGsmLcRAOujA==",
"dev": true,
"license": "MIT",
"peer": true,
"dependencies": {
"@module-federation/runtime": "2.2.1",
"@module-federation/webpack-bundler-runtime": "2.2.1"
@@ -5794,6 +5834,7 @@
"integrity": "sha512-fnP+ZOZTFeBGiTAnxve+axGmiYn2D60h86nUISXjXClK3LUY1krUfPgf6MaD4YDJ4i51OGXZWPekeMe16pkd8Q==",
"dev": true,
"license": "MIT",
"peer": true,
"dependencies": {
"@module-federation/runtime": "0.21.6",
"@module-federation/webpack-bundler-runtime": "0.21.6"
@@ -6481,6 +6522,7 @@
"resolved": "https://registry.npmjs.org/@ngrx/store/-/store-19.2.1.tgz",
"integrity": "sha512-c5vQId7YoAhM0y4HASrz9mtLju+28vJspd6OBlhPbBlSae8GN8m9S/oav+8LaSY19yh95cZ5B/nMcLNNWgL/jA==",
"license": "MIT",
"peer": true,
"dependencies": {
"tslib": "^2.0.0"
},
@@ -6525,6 +6567,7 @@
"resolved": "https://registry.npmjs.org/@ngx-translate/core/-/core-17.0.0.tgz",
"integrity": "sha512-Rft2D5ns2pq4orLZjEtx1uhNuEBerUdpFUG1IcqtGuipj6SavgB8SkxtNQALNDA+EVlvsNCCjC2ewZVtUeN6rg==",
"license": "MIT",
"peer": true,
"dependencies": {
"tslib": "^2.3.0"
},
@@ -8426,6 +8469,7 @@
"integrity": "sha512-FolcIAH5FW4J2FET+qwjd1kNeFbCkd0VLuIHO0thyolEjaPSxw5qxG67DA7BZGm6PVcoiSgPLks1DL6eZ8c+fA==",
"dev": true,
"license": "MIT",
"peer": true,
"dependencies": {
"@module-federation/runtime-tools": "0.21.6",
"@rspack/binding": "1.6.8",
@@ -8638,7 +8682,6 @@
"integrity": "sha512-JZdvBNrWODBTLrmtUF6+UD26z5cENpV0X9liR1jPDT1O7taQqwRePSuCQcjRo1qXCjlNfBW7pGGVxVCRKK8EXw==",
"dev": true,
"license": "MIT",
"peer": true,
"dependencies": {
"@angular-devkit/core": "20.3.18",
"@angular-devkit/schematics": "20.3.18",
@@ -8656,7 +8699,6 @@
"integrity": "sha512-zGWMjMqE8qXYr8baYCs43k9HlKz9J4Gh3Yx+7XE0uS0Y1LXzzALevSoUw7GIPdSvOriQJAEgtWE6QKssqSGltQ==",
"dev": true,
"license": "MIT",
"peer": true,
"dependencies": {
"ajv": "8.18.0",
"ajv-formats": "3.0.1",
@@ -8685,7 +8727,6 @@
"integrity": "sha512-GRMEGl3YTL/qhQhaxYXLbSQxUTPTYMQ65IlxLQRq5+UKPomN9KVxxVdADXqs7Ss1uQcetr+jc+taVgxOqsAoxg==",
"dev": true,
"license": "MIT",
"peer": true,
"dependencies": {
"@angular-devkit/core": "20.3.18",
"jsonc-parser": "3.3.1",
@@ -8705,7 +8746,6 @@
"integrity": "sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==",
"dev": true,
"license": "MIT",
"peer": true,
"dependencies": {
"fast-deep-equal": "^3.1.3",
"fast-uri": "^3.0.1",
@@ -8723,7 +8763,6 @@
"integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==",
"dev": true,
"license": "MIT",
"peer": true,
"engines": {
"node": ">=12"
},
@@ -8737,7 +8776,6 @@
"integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==",
"dev": true,
"license": "MIT",
"peer": true,
"engines": {
"node": "^12.17.0 || ^14.13 || >=16.0.0"
},
@@ -8751,7 +8789,6 @@
"integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==",
"dev": true,
"license": "MIT",
"peer": true,
"engines": {
"node": ">=6"
},
@@ -8764,8 +8801,7 @@
"resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz",
"integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==",
"dev": true,
"license": "MIT",
"peer": true
"license": "MIT"
},
"node_modules/@schematics/angular/node_modules/is-interactive": {
"version": "2.0.0",
@@ -8773,7 +8809,6 @@
"integrity": "sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==",
"dev": true,
"license": "MIT",
"peer": true,
"engines": {
"node": ">=12"
},
@@ -8787,7 +8822,6 @@
"integrity": "sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==",
"dev": true,
"license": "MIT",
"peer": true,
"engines": {
"node": ">=18"
},
@@ -8801,7 +8835,6 @@
"integrity": "sha512-i24m8rpwhmPIS4zscNzK6MSEhk0DUWa/8iYQWxhffV8jkI4Phvs3F+quL5xvS0gdQR0FyTCMMH33Y78dDTzzIw==",
"dev": true,
"license": "MIT",
"peer": true,
"dependencies": {
"chalk": "^5.3.0",
"is-unicode-supported": "^1.3.0"
@@ -8819,7 +8852,6 @@
"integrity": "sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==",
"dev": true,
"license": "MIT",
"peer": true,
"engines": {
"node": ">=12"
},
@@ -8833,7 +8865,6 @@
"integrity": "sha512-weP+BZ8MVNnlCm8c0Qdc1WSWq4Qn7I+9CJGm7Qali6g44e/PUzbjNqJX5NJ9ljlNMosfJvg1fKEGILklK9cwnw==",
"dev": true,
"license": "MIT",
"peer": true,
"dependencies": {
"chalk": "^5.3.0",
"cli-cursor": "^5.0.0",
@@ -8858,7 +8889,6 @@
"integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==",
"dev": true,
"license": "MIT",
"peer": true,
"engines": {
"node": ">=12"
},
@@ -8872,7 +8902,6 @@
"integrity": "sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==",
"dev": true,
"license": "BSD-3-Clause",
"peer": true,
"engines": {
"node": ">= 12"
}
@@ -8883,7 +8912,6 @@
"integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==",
"dev": true,
"license": "MIT",
"peer": true,
"dependencies": {
"emoji-regex": "^10.3.0",
"get-east-asian-width": "^1.0.0",
@@ -8902,7 +8930,6 @@
"integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==",
"dev": true,
"license": "MIT",
"peer": true,
"dependencies": {
"ansi-regex": "^6.2.2"
},
@@ -9343,6 +9370,7 @@
"integrity": "sha512-dVd04UKsfpINUnK0yBoYHDF3xu7xVH4BuDotC/xGuycx4CgbP48X/KF/586bcObxT0HENHXEU8Nqtu6NR+eKhw==",
"dev": true,
"license": "MIT",
"peer": true,
"dependencies": {
"@types/body-parser": "*",
"@types/express-serve-static-core": "^4.17.33",
@@ -9464,6 +9492,7 @@
"integrity": "sha512-W609buLVRVmeW693xKfzHeIV6nJGGz98uCPfeXI1ELMLXVeKYZ9m15fAMSaUPBHYLGFsVRcMmSCksQOrZV9BYA==",
"dev": true,
"license": "MIT",
"peer": true,
"dependencies": {
"undici-types": "~7.16.0"
}
@@ -9882,6 +9911,7 @@
"integrity": "sha512-4Z+L8I2OqhZV8qA132M4wNL30ypZGYOQVBfMgxDH/K5UX0PNqTu1c6za9ST5r9+tavvHiTWmBnKzpCJ/GlVFtg==",
"dev": true,
"license": "BSD-2-Clause",
"peer": true,
"dependencies": {
"@typescript-eslint/scope-manager": "7.18.0",
"@typescript-eslint/types": "7.18.0",
@@ -10161,6 +10191,7 @@
"integrity": "sha512-+fZ3LZNeiELGmimrujsDCT4CRIbq5oXdHe7chLiW8qzqyPMnn1puNstCrMNVAqwcl2FdIxkuJ4tOs/RFDBVc/Q==",
"dev": true,
"license": "MIT",
"peer": true,
"engines": {
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
},
@@ -10244,6 +10275,7 @@
"integrity": "sha512-XDY4mXTez3Z1iRDI5mbRhH4DFSt46oaIFsLg+Zn97+sYrXACziXSQcSelMybnVZ5pa1P6xYkPr5cMJyunM1ZDA==",
"dev": true,
"license": "MIT",
"peer": true,
"dependencies": {
"@eslint-community/eslint-utils": "^4.9.1",
"@typescript-eslint/scope-manager": "8.53.0",
@@ -10722,6 +10754,7 @@
"integrity": "sha512-nrUSn7hzt7J6JWgWGz78ZYI8wj+gdIJdk0Ynjpp8l+trkn58Uqsf6RYrYkEK+3X18EX+TNdtJI0WxAtc+L84SQ==",
"dev": true,
"license": "MIT",
"peer": true,
"dependencies": {
"argparse": "^2.0.1"
},
@@ -10755,6 +10788,7 @@
"resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz",
"integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==",
"license": "MIT",
"peer": true,
"bin": {
"acorn": "bin/acorn"
},
@@ -10863,6 +10897,7 @@
"integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==",
"dev": true,
"license": "MIT",
"peer": true,
"dependencies": {
"fast-deep-equal": "^3.1.3",
"fast-uri": "^3.0.1",
@@ -11329,6 +11364,7 @@
"integrity": "sha512-ChTCHMouEe2kn713WHbQGcuYrr6fXTBiu460OTwWrWob16g1bXn4vtz07Ope7ewMozJAnEquLk5lWQWtBig9DQ==",
"dev": true,
"license": "MIT",
"peer": true,
"dependencies": {
"follow-redirects": "^1.15.11",
"form-data": "^4.0.5",
@@ -11729,6 +11765,7 @@
}
],
"license": "MIT",
"peer": true,
"dependencies": {
"baseline-browser-mapping": "^2.9.0",
"caniuse-lite": "^1.0.30001759",
@@ -12004,6 +12041,7 @@
"resolved": "https://registry.npmjs.org/chevrotain/-/chevrotain-11.1.1.tgz",
"integrity": "sha512-f0yv5CPKaFxfsPTBzX7vGuim4oIC1/gcS7LUGdBSwl2dU6+FON6LVUksdOo1qJjoUvXNn45urgh8C+0a24pACQ==",
"license": "Apache-2.0",
"peer": true,
"dependencies": {
"@chevrotain/cst-dts-gen": "11.1.1",
"@chevrotain/gast": "11.1.1",
@@ -12031,6 +12069,7 @@
"integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==",
"dev": true,
"license": "MIT",
"peer": true,
"dependencies": {
"readdirp": "^4.0.1"
},
@@ -13351,6 +13390,7 @@
"resolved": "https://registry.npmjs.org/cytoscape/-/cytoscape-3.33.1.tgz",
"integrity": "sha512-iJc4TwyANnOGR1OmWhsS9ayRS3s+XQ185FmuHObThD+5AeJCakAAbWv8KimMTt08xCCLNgneQwFp+JRJOr9qGQ==",
"license": "MIT",
"peer": true,
"engines": {
"node": ">=0.10"
}
@@ -13760,6 +13800,7 @@
"resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz",
"integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==",
"license": "ISC",
"peer": true,
"engines": {
"node": ">=12"
}
@@ -13913,6 +13954,7 @@
"resolved": "https://registry.npmjs.org/date-fns/-/date-fns-4.1.0.tgz",
"integrity": "sha512-Ukq0owbQXxa/U3EGtsdVBkR1w7KOQ5gIBqdH2hkvknzZPYvBxb/aa6E8L7tmjFtkwZBu3UXBbjIgPo/Ez4xaNg==",
"license": "MIT",
"peer": true,
"funding": {
"type": "github",
"url": "https://github.com/sponsors/kossnocorp"
@@ -14511,6 +14553,7 @@
"integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==",
"dev": true,
"license": "MIT",
"peer": true,
"dependencies": {
"iconv-lite": "^0.6.2"
}
@@ -14955,6 +14998,7 @@
"deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.",
"dev": true,
"license": "MIT",
"peer": true,
"dependencies": {
"@eslint-community/eslint-utils": "^4.2.0",
"@eslint-community/regexpp": "^4.6.1",
@@ -16287,6 +16331,7 @@
"integrity": "sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw==",
"dev": true,
"license": "MIT",
"peer": true,
"dependencies": {
"fast-deep-equal": "^3.1.1",
"fast-json-stable-stringify": "^2.0.0",
@@ -17555,9 +17600,9 @@
"license": "BSD-3-Clause"
},
"node_modules/ignore": {
"version": "7.0.3",
"resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.3.tgz",
"integrity": "sha512-bAH5jbK/F3T3Jls4I0SO1hmPR0dKU0a7+SY6n1yzRtG54FLO8d6w/nxLFX2Nb7dBu6cCWXPaAME6cYqFUMmuCA==",
"version": "7.0.5",
"resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz",
"integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==",
"dev": true,
"license": "MIT",
"engines": {
@@ -18507,7 +18552,8 @@
"resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-6.0.1.tgz",
"integrity": "sha512-gUtzV5ASR0MLBwDNqri4kBsgKNCcRQd9qOlNw/w/deavD0cl3JmWXXfH8JhKM4LTg6LPTt2IOQ4px3YYfgh2Xg==",
"dev": true,
"license": "MIT"
"license": "MIT",
"peer": true
},
"node_modules/jasmine-spec-reporter": {
"version": "5.0.2",
@@ -18654,6 +18700,7 @@
"integrity": "sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A==",
"dev": true,
"license": "MIT",
"peer": true,
"bin": {
"jiti": "lib/jiti-cli.mjs"
}
@@ -18796,6 +18843,7 @@
"integrity": "sha512-LrtUxbdvt1gOpo3gxG+VAJlJAEMhbWlM4YrFQgql98FwF7+K8K12LYO4hnDdUkNjeztYrOXEMqgTajSWgmtI/w==",
"dev": true,
"license": "MIT",
"peer": true,
"dependencies": {
"@colors/colors": "1.5.0",
"body-parser": "^1.19.0",
@@ -19503,6 +19551,7 @@
"integrity": "sha512-tkuLHQlvWUTeQ3doAqnHbNn8T6WX1KA8yvbKG9x4VtKtIjHsVKQZCH11zRgAfbDAXC2UNIg/K9BYAAcEzUIrNg==",
"dev": true,
"license": "Apache-2.0",
"peer": true,
"dependencies": {
"copy-anything": "^2.0.1",
"parse-node-version": "^1.0.1",
@@ -20967,6 +21016,7 @@
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.4.tgz",
"integrity": "sha512-oRjTw/97aTBN0RHbYCdtF1MQfvusSIBQM0IZEgzl6426+8jSC0nF1a/GmnVLpfB9yyr6g6FTqWqiZVbxrtaCIg==",
"license": "BlueOak-1.0.0",
"peer": true,
"dependencies": {
"brace-expansion": "^5.0.2"
},
@@ -21211,6 +21261,7 @@
"integrity": "sha512-dFuwFsDJMBSd1YtmLLcX5bNNUCQUlRqgf34aXA+79PmkOP+0eF8GP2949wq3+jMjmFTNm80Oo8IUYiSLwklKCQ==",
"dev": true,
"license": "MIT",
"peer": true,
"dependencies": {
"@rollup/plugin-json": "^6.1.0",
"@rollup/wasm-node": "^4.24.0",
@@ -21610,6 +21661,7 @@
"dev": true,
"hasInstallScript": true,
"license": "MIT",
"peer": true,
"dependencies": {
"@napi-rs/wasm-runtime": "0.2.4",
"@yarnpkg/lockfile": "^1.1.0",
@@ -21746,16 +21798,6 @@
"dev": true,
"license": "MIT"
},
"node_modules/nx/node_modules/ignore": {
"version": "7.0.5",
"resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz",
"integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">= 4"
}
},
"node_modules/nx/node_modules/is-docker": {
"version": "2.2.1",
"resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz",
@@ -22607,6 +22649,7 @@
"resolved": "https://registry.npmjs.org/pdfjs-dist/-/pdfjs-dist-5.4.449.tgz",
"integrity": "sha512-CegnUaT0QwAyQMS+7o2POr4wWUNNe8VaKKlcuoRHeYo98cVnqPpwOXNSx6Trl6szH02JrRcsPgletV6GmF3LtQ==",
"license": "Apache-2.0",
"peer": true,
"engines": {
"node": ">=20.16.0 || >=22.3.0"
},
@@ -22886,6 +22929,7 @@
}
],
"license": "MIT",
"peer": true,
"dependencies": {
"nanoid": "^3.3.8",
"picocolors": "^1.1.1",
@@ -23548,6 +23592,7 @@
"integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==",
"dev": true,
"license": "MIT",
"peer": true,
"dependencies": {
"cssesc": "^3.0.0",
"util-deprecate": "^1.0.2"
@@ -23612,6 +23657,7 @@
"integrity": "sha512-UOnG6LftzbdaHZcKoPFtOcCKztrQ57WkHDeRD9t/PTQtmT0NHSeWWepj6pS0z/N7+08BHFDQVUrfmfMRcZwbMg==",
"dev": true,
"license": "MIT",
"peer": true,
"bin": {
"prettier": "bin/prettier.cjs"
},
@@ -24858,6 +24904,7 @@
"integrity": "sha512-+VUy01yfDqNmIVMd/LLKl2TTtY0ovZN0rTonh+FhKr65mFwIYgU9WzgIZKS7U9/SPCQvWTsTGx9jyt+qRm/XFw==",
"dev": true,
"license": "MIT",
"peer": true,
"dependencies": {
"@bufbuild/protobuf": "^2.5.0",
"buffer-builder": "^0.2.0",
@@ -25317,8 +25364,7 @@
"resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz",
"integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==",
"dev": true,
"license": "MIT",
"peer": true
"license": "MIT"
},
"node_modules/schema-utils": {
"version": "4.3.3",
@@ -26331,7 +26377,6 @@
"integrity": "sha512-UhDfHmA92YAlNnCfhmq0VeNL5bDbiZGg7sZ2IvPsXubGkiNa9EC+tUTsjBRsYUAz87btI6/1wf4XoVvQ3uRnmQ==",
"dev": true,
"license": "MIT",
"peer": true,
"engines": {
"node": ">=18"
},
@@ -26672,6 +26717,7 @@
"integrity": "sha512-78O4c6IswZ9TzpcIiQJIN49K3qNoXTM8zEJzhaTE/xRTCZswaovSEVIa/uwbOltZrk16X4jAxjaOhzz/hTm1Kw==",
"dev": true,
"license": "MIT",
"peer": true,
"dependencies": {
"@csstools/css-parser-algorithms": "^2.3.1",
"@csstools/css-tokenizer": "^2.2.0",
@@ -27209,6 +27255,7 @@
"integrity": "sha512-LBAhFyLho16harJoWMg/nZsQYgTrg5jXOn2nCYjRUcZZEdE3qa2zb8QEDRUGVZBW4rlazf2fxkg8tztybTaqWw==",
"dev": true,
"license": "BSD-2-Clause",
"peer": true,
"dependencies": {
"@jridgewell/source-map": "^0.3.3",
"acorn": "^8.8.2",
@@ -27770,7 +27817,8 @@
"version": "2.8.1",
"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
"integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
"license": "0BSD"
"license": "0BSD",
"peer": true
},
"node_modules/tsscmp": {
"version": "1.0.6",
@@ -27952,6 +28000,7 @@
"integrity": "sha512-aJn6wq13/afZp/jT9QZmwEjDqqvSGp1VT5GVg+f/t6/oVyrgXM6BY1h9BRh/O5p3PlUPAe+WuiEZOmb/49RqoQ==",
"dev": true,
"license": "Apache-2.0",
"peer": true,
"bin": {
"tsc": "bin/tsc",
"tsserver": "bin/tsserver"
@@ -28484,6 +28533,7 @@
"integrity": "sha512-gX/dMkRQc7QOMzgTe6KsYFM7DxeIONQSui1s0n/0xht36HvrgbxtM1xBlgx596NbpHuQU8P7QpKwrZYwUX48nw==",
"dev": true,
"license": "MIT",
"peer": true,
"dependencies": {
"@types/eslint-scope": "^3.7.7",
"@types/estree": "^1.0.8",
@@ -28651,6 +28701,7 @@
"integrity": "sha512-QcQ72gh8a+7JO63TAx/6XZf/CWhgMzu5m0QirvPfGvptOusAxG12w2+aua1Jkjr7hzaWDnJ2n6JFeexMHI+Zjg==",
"dev": true,
"license": "MIT",
"peer": true,
"dependencies": {
"@types/bonjour": "^3.5.13",
"@types/connect-history-api-fallback": "^1.5.4",
@@ -29213,6 +29264,7 @@
"integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==",
"dev": true,
"license": "MIT",
"peer": true,
"engines": {
"node": ">=10.0.0"
},

View File

@@ -83,11 +83,11 @@
"@angular-devkit/build-angular": "19.2.22",
"@angular-devkit/core": "19.2.18",
"@angular-devkit/schematics": "19.2.18",
"@angular-eslint/builder": "19.3.0",
"@angular-eslint/eslint-plugin": "19.3.0",
"@angular-eslint/eslint-plugin-template": "19.3.0",
"@angular-eslint/schematics": "19.3.0",
"@angular-eslint/template-parser": "19.3.0",
"@angular-eslint/builder": "19.8.1",
"@angular-eslint/eslint-plugin": "19.8.1",
"@angular-eslint/eslint-plugin-template": "19.8.1",
"@angular-eslint/schematics": "19.8.1",
"@angular-eslint/template-parser": "19.8.1",
"@angular/compiler-cli": "19.2.19",
"@angular/language-service": "19.2.18",
"@cspell/eslint-plugin": "^9.2.1",

View File

@@ -42,10 +42,10 @@ import { MatButtonModule } from '@angular/material/button';
encapsulation: ViewEncapsulation.None
})
export class AboutComponent implements OnInit {
private authService = inject(AuthenticationService);
private appExtensions = inject(AppExtensionService);
private appSettings = inject(AppSettingsService);
private discovery = inject(DiscoveryApiService);
private readonly authService = inject(AuthenticationService);
private readonly appExtensions = inject(AppExtensionService);
private readonly appSettings = inject(AppSettingsService);
private readonly discovery = inject(DiscoveryApiService);
public packageJson? = inject(PACKAGE_JSON, { optional: true });
public dev = inject(DEV_MODE_TOKEN);

View File

@@ -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$;

View File

@@ -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

View File

@@ -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'),

View File

@@ -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$;

View File

@@ -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'));

View File

@@ -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);

View File

@@ -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())

View File

@@ -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) => {

View File

@@ -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']];

View File

@@ -24,7 +24,7 @@
/* cspell:disable */
import { AuthenticationService, NotificationService } from '@alfresco/adf-core';
import { Injectable } from '@angular/core';
import { Injectable, inject } from '@angular/core';
import { Node } from '@alfresco/js-api';
import { getFileExtension, supportedExtensions } from '@alfresco/aca-shared/rules';
import { AppSettingsService } from '@alfresco/aca-shared';
@@ -37,11 +37,9 @@ export interface IAosEditOnlineService {
providedIn: 'root'
})
export class AosEditOnlineService implements IAosEditOnlineService {
constructor(
private authenticationService: AuthenticationService,
private appSettings: AppSettingsService,
private notificationService: NotificationService
) {}
private readonly authenticationService = inject(AuthenticationService);
private readonly appSettings = inject(AppSettingsService);
private readonly notificationService = inject(NotificationService);
onActionEditOnlineAos(node: Node): void {
if (node && this.isFile(node) && node.properties) {

View File

@@ -31,8 +31,8 @@ import { AosEditOnlineService } from '../aos-extension.service';
@Injectable()
export class AosEffects {
private actions$ = inject(Actions);
private aosEditOnlineService = inject(AosEditOnlineService);
private readonly actions$ = inject(Actions);
private readonly aosEditOnlineService = inject(AosEditOnlineService);
openOffice$ = createEffect(
() =>

View File

@@ -48,9 +48,9 @@ import { NodeLocationReferencesComponent } from '../../../dialogs/node-location-
}
})
export class LocationLinkComponent implements OnInit {
private store = inject(Store);
private contentApi = inject(ContentApiService);
private translationService = inject(TranslationService);
private readonly store = inject(Store);
private readonly contentApi = inject(ContentApiService);
private readonly translationService = inject(TranslationService);
private _path: PathInfo;
private readonly dialogRef = inject(MatDialog);

View File

@@ -22,7 +22,7 @@
* from Hyland Software. If not, see <http://www.gnu.org/licenses/>.
*/
import { Component, ViewChild, ViewEncapsulation } from '@angular/core';
import { Component, ViewChild, ViewEncapsulation, inject } from '@angular/core';
import { Store } from '@ngrx/store';
import { SetSelectedNodesAction } from '@alfresco/aca-shared/store';
import { TranslatePipe } from '@ngx-translate/core';
@@ -42,7 +42,7 @@ import { LogoutDirective } from '@alfresco/adf-core';
encapsulation: ViewEncapsulation.None
})
export class LogoutComponent {
constructor(private store: Store) {}
private readonly store = inject(Store);
@ViewChild(MatMenuItem)
menuItem: MatMenuItem;

View File

@@ -25,9 +25,11 @@
import { ToggleSharedComponent } from './toggle-shared.component';
import { of } from 'rxjs';
import { TestBed } from '@angular/core/testing';
import { Store } from '@ngrx/store';
import { SelectionState } from '@alfresco/adf-extensions';
describe('ToggleSharedComponent', () => {
let component;
let component: ToggleSharedComponent;
let entry;
const storeMock: any = {
@@ -36,15 +38,21 @@ describe('ToggleSharedComponent', () => {
};
beforeEach(() => {
TestBed.configureTestingModule({
imports: [ToggleSharedComponent],
providers: [
{
provide: Store,
useValue: storeMock
}
]
});
entry = {
properties: {
'qshare:sharedId': null
}
};
TestBed.runInInjectionContext(() => {
component = new ToggleSharedComponent(storeMock);
});
component = TestBed.createComponent(ToggleSharedComponent).componentInstance;
});
it('should get Store selection entry on initialization', (done) => {
@@ -71,7 +79,7 @@ describe('ToggleSharedComponent', () => {
it('should dispatch `SHARE_NODE` action on share', () => {
component.ngOnInit();
component.editSharedNode({ first: { entry } });
component.editSharedNode({ first: { entry } } as SelectionState, undefined);
expect(storeMock.dispatch).toHaveBeenCalled();
});

View File

@@ -41,6 +41,8 @@ import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
encapsulation: ViewEncapsulation.None
})
export class ToggleSharedComponent implements OnInit {
private readonly store = inject<Store<AppStore>>(Store);
@Input()
data: {
iconButton?: string;
@@ -56,8 +58,6 @@ export class ToggleSharedComponent implements OnInit {
private readonly destroyRef = inject(DestroyRef);
constructor(private store: Store<AppStore>) {}
ngOnInit() {
this.selection$ = this.store.select(getAppSelection);
this.selection$.pipe(takeUntilDestroyed(this.destroyRef)).subscribe((selectionState) => {

View File

@@ -37,7 +37,7 @@ import { UserProfileService } from '@alfresco/aca-shared';
encapsulation: ViewEncapsulation.None
})
export class UserInfoComponent {
private userProfileService = inject(UserProfileService);
private readonly userProfileService = inject(UserProfileService);
@ViewChild(MatMenuItem)
menuItem: MatMenuItem;

View File

@@ -22,7 +22,7 @@
* from Hyland Software. If not, see <http://www.gnu.org/licenses/>.
*/
import { HostListener, ViewChild, Inject, Directive } from '@angular/core';
import { HostListener, ViewChild, Directive, inject } from '@angular/core';
import { MatMenuTrigger } from '@angular/material/menu';
import { ContentActionRef } from '@alfresco/adf-extensions';
import { ContextMenuOverlayRef } from './context-menu-overlay';
@@ -32,6 +32,10 @@ import { AppExtensionService } from '@alfresco/aca-shared';
@Directive()
export class BaseContextMenuDirective {
protected readonly contextMenuOverlayRef = inject(ContextMenuOverlayRef);
protected readonly extensions = inject(AppExtensionService);
readonly direction = inject<Direction>(CONTEXT_MENU_DIRECTION);
actions: Array<ContentActionRef> = [];
@ViewChild(MatMenuTrigger)
@@ -44,12 +48,6 @@ export class BaseContextMenuDirective {
}
}
constructor(
private readonly contextMenuOverlayRef: ContextMenuOverlayRef,
protected extensions: AppExtensionService,
@Inject(CONTEXT_MENU_DIRECTION) public direction: Direction
) {}
onClickOutsideEvent() {
if (this.contextMenuOverlayRef) {
this.contextMenuOverlayRef.close();

View File

@@ -22,7 +22,7 @@
* from Hyland Software. If not, see <http://www.gnu.org/licenses/>.
*/
import { Component, Input, ViewEncapsulation } from '@angular/core';
import { Component, Input, ViewEncapsulation, inject } from '@angular/core';
import { ContentActionRef, DynamicExtensionComponent } from '@alfresco/adf-extensions';
import { AppExtensionService } from '@alfresco/aca-shared';
import { CommonModule } from '@angular/common';
@@ -39,11 +39,11 @@ import { IconComponent } from '@alfresco/adf-core';
host: { class: 'app-context-menu-item' }
})
export class ContextMenuItemComponent {
private readonly extensions = inject(AppExtensionService);
@Input()
actionRef: ContentActionRef;
constructor(private extensions: AppExtensionService) {}
runAction() {
if (this.hasClickAction(this.actionRef)) {
this.extensions.runActionById(this.actionRef.actions.click);

View File

@@ -25,7 +25,7 @@
import { OverlayRef } from '@angular/cdk/overlay';
export class ContextMenuOverlayRef {
constructor(private overlayRef: OverlayRef) {}
constructor(private readonly overlayRef: OverlayRef) {}
close(): void {
this.overlayRef.dispose();

View File

@@ -22,13 +22,9 @@
* from Hyland Software. If not, see <http://www.gnu.org/licenses/>.
*/
import { AfterViewInit, Component, DestroyRef, inject, Inject, OnInit, QueryList, ViewChild, ViewChildren, ViewEncapsulation } from '@angular/core';
import { AfterViewInit, Component, DestroyRef, inject, OnInit, QueryList, ViewChild, ViewChildren, ViewEncapsulation } from '@angular/core';
import { MatMenu, MatMenuItem, MatMenuModule } from '@angular/material/menu';
import { ContentActionType, DynamicExtensionComponent } from '@alfresco/adf-extensions';
import { ContextMenuOverlayRef } from './context-menu-overlay';
import { CONTEXT_MENU_DIRECTION } from './direction.token';
import { Direction } from '@angular/cdk/bidi';
import { AppExtensionService } from '@alfresco/aca-shared';
import { CommonModule } from '@angular/common';
import { TranslatePipe } from '@ngx-translate/core';
import { MatDividerModule } from '@angular/material/divider';
@@ -69,10 +65,6 @@ export class ContextMenuComponent extends BaseContextMenuDirective implements On
private readonly destroyRef = inject(DestroyRef);
constructor(contextMenuOverlayRef: ContextMenuOverlayRef, extensions: AppExtensionService, @Inject(CONTEXT_MENU_DIRECTION) direction: Direction) {
super(contextMenuOverlayRef, extensions, direction);
}
ngOnInit() {
this.extensions
.getAllowedContextMenuActions()

View File

@@ -24,7 +24,6 @@
import { TestBed } from '@angular/core/testing';
import { Overlay } from '@angular/cdk/overlay';
import { Injector } from '@angular/core';
import { Store } from '@ngrx/store';
import { of } from 'rxjs';
import { NoopTranslateModule, UserPreferencesService, provideCoreAuthTesting } from '@alfresco/adf-core';
@@ -35,8 +34,6 @@ import { ContentActionRef, ContentActionType } from '@alfresco/adf-extensions';
describe('ContextMenuService', () => {
let contextMenuService: ContextMenuService;
let overlay: Overlay;
let injector: Injector;
let userPreferencesService: UserPreferencesService;
const customActionMock: ContentActionRef[] = [
@@ -66,31 +63,25 @@ describe('ContextMenuService', () => {
imports: [NoopTranslateModule, ContextMenuComponent],
providers: [provideCoreAuthTesting(), Overlay, { provide: Store, useValue: { select: () => of() } }, UserPreferencesService]
});
injector = TestBed.inject(Injector);
overlay = TestBed.inject(Overlay);
userPreferencesService = TestBed.inject(UserPreferencesService);
});
it('should create a custom overlay', () => {
contextMenuService = new ContextMenuService(injector, overlay, userPreferencesService);
contextMenuService = TestBed.inject(ContextMenuService);
contextMenuService.open(overlayConfig);
expect(document.querySelector('.test-panel')).not.toBe(null);
});
it('should render component', () => {
contextMenuService = new ContextMenuService(injector, overlay, userPreferencesService);
contextMenuService = TestBed.inject(ContextMenuService);
contextMenuService.open(overlayConfig);
expect(document.querySelector('aca-context-menu')).not.toBe(null);
});
it('should have default LTR direction value', () => {
contextMenuService = new ContextMenuService(injector, overlay, userPreferencesService);
contextMenuService = TestBed.inject(ContextMenuService);
contextMenuService.open(overlayConfig);
expect(document.body.querySelector('div[dir="ltr"]')).not.toEqual(null);
@@ -98,8 +89,7 @@ describe('ContextMenuService', () => {
it('should change direction on textOrientation event', () => {
spyOn(userPreferencesService, 'select').and.returnValue(of('rtl'));
contextMenuService = new ContextMenuService(injector, overlay, userPreferencesService);
contextMenuService = TestBed.inject(ContextMenuService);
contextMenuService.open(overlayConfig);
@@ -107,16 +97,14 @@ describe('ContextMenuService', () => {
});
it('should render custom context menu component', () => {
contextMenuService = new ContextMenuService(injector, overlay, userPreferencesService);
contextMenuService = TestBed.inject(ContextMenuService);
contextMenuService.open(overlayConfig, customActionMock);
expect(document.querySelector('aca-custom-context-menu')).not.toBe(null);
});
it('should not render custom context menu when no custom actions are provided', () => {
contextMenuService = new ContextMenuService(injector, overlay, userPreferencesService);
contextMenuService = TestBed.inject(ContextMenuService);
contextMenuService.open(overlayConfig, []);
expect(document.querySelector('aca-custom-context-menu')).toBe(null);

View File

@@ -22,7 +22,7 @@
* from Hyland Software. If not, see <http://www.gnu.org/licenses/>.
*/
import { ComponentRef, Injectable, Injector } from '@angular/core';
import { ComponentRef, Injectable, Injector, inject } from '@angular/core';
import { Overlay, OverlayConfig, OverlayRef } from '@angular/cdk/overlay';
import { ComponentPortal } from '@angular/cdk/portal';
import { ContextMenuOverlayRef } from './context-menu-overlay';
@@ -39,13 +39,13 @@ import { CustomContextMenuComponent } from './custom-context-menu.component';
providedIn: 'root'
})
export class ContextMenuService {
private readonly injector = inject(Injector);
private readonly overlay = inject(Overlay);
private readonly userPreferenceService = inject(UserPreferencesService);
private direction: Directionality;
constructor(
private readonly injector: Injector,
private readonly overlay: Overlay,
private readonly userPreferenceService: UserPreferencesService
) {
constructor() {
this.userPreferenceService.select('textOrientation').subscribe((textOrientation) => {
this.direction = textOrientation;
});

View File

@@ -22,11 +22,7 @@
* from Hyland Software. If not, see <http://www.gnu.org/licenses/>.
*/
import { AfterViewInit, Component, Inject, ViewEncapsulation } from '@angular/core';
import { Direction } from '@angular/cdk/bidi';
import { ContextMenuOverlayRef } from './context-menu-overlay';
import { AppExtensionService } from '@alfresco/aca-shared';
import { CONTEXT_MENU_DIRECTION } from './direction.token';
import { AfterViewInit, Component, ViewEncapsulation, inject } from '@angular/core';
import { ContentActionRef, DynamicExtensionComponent } from '@alfresco/adf-extensions';
import { CommonModule } from '@angular/common';
import { TranslatePipe } from '@ngx-translate/core';
@@ -58,13 +54,9 @@ import { BaseContextMenuDirective } from './base-context-menu.directive';
encapsulation: ViewEncapsulation.None
})
export class CustomContextMenuComponent extends BaseContextMenuDirective implements AfterViewInit {
constructor(
contextMenuOverlayRef: ContextMenuOverlayRef,
extensions: AppExtensionService,
@Inject(CONTEXT_MENU_DIRECTION) direction: Direction,
@Inject(CONTEXT_MENU_CUSTOM_ACTIONS) customActions: ContentActionRef[]
) {
super(contextMenuOverlayRef, extensions, direction);
constructor() {
super();
const customActions = inject(CONTEXT_MENU_CUSTOM_ACTIONS) as ContentActionRef[];
this.actions = customActions;
}

View File

@@ -22,7 +22,7 @@
* from Hyland Software. If not, see <http://www.gnu.org/licenses/>.
*/
import { Component, OnDestroy, OnInit, ViewEncapsulation } from '@angular/core';
import { Component, OnDestroy, OnInit, ViewEncapsulation, inject } from '@angular/core';
import { ActivatedRoute } from '@angular/router';
import { AppHookService, ContentApiService, PageComponent, PageLayoutComponent, ToolbarComponent } from '@alfresco/aca-shared';
import { NavigateToFolder, NavigateToPreviousPage, SetSelectedNodesAction } from '@alfresco/aca-shared/store';
@@ -63,6 +63,13 @@ import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
encapsulation: ViewEncapsulation.None
})
export class DetailsComponent extends PageComponent implements OnInit, OnDestroy {
private readonly route = inject(ActivatedRoute);
private readonly contentApi = inject(ContentApiService);
private readonly contentService = inject(ContentService);
private readonly nodesApiService = inject(NodesApiService);
private readonly appHookService = inject(AppHookService);
private readonly location = inject(Location);
nodeId: string;
isLoading: boolean;
activeTab = 1;
@@ -70,17 +77,6 @@ export class DetailsComponent extends PageComponent implements OnInit, OnDestroy
nodeIcon: string;
canManagePermissions = true;
constructor(
private readonly route: ActivatedRoute,
private readonly contentApi: ContentApiService,
private readonly contentService: ContentService,
private readonly nodesApiService: NodesApiService,
private readonly appHookService: AppHookService,
private readonly location: Location
) {
super();
}
ngOnInit(): void {
super.ngOnInit();
this.isLoading = true;

View File

@@ -40,14 +40,14 @@ import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
imports: [CommonModule, TranslatePipe, DynamicExtensionComponent, IconComponent]
})
export class DatatableCellBadgesComponent implements OnInit {
private readonly appExtensionService = inject(AppExtensionService);
@Input({ required: true }) node: NodeEntry;
badges: Badge[];
private readonly destroyRef = inject(DestroyRef);
constructor(private appExtensionService: AppExtensionService) {}
ngOnInit() {
this.appExtensionService
.getBadges(this.node)

View File

@@ -22,7 +22,7 @@
* from Hyland Software. If not, see <http://www.gnu.org/licenses/>.
*/
import { ChangeDetectorRef, Component, Input, OnInit, ViewEncapsulation } from '@angular/core';
import { ChangeDetectorRef, Component, Input, OnInit, ViewEncapsulation, inject } from '@angular/core';
import { TagNodeListComponent } from '@alfresco/adf-content-services';
@Component({
@@ -36,13 +36,13 @@ import { TagNodeListComponent } from '@alfresco/adf-content-services';
}
})
export class TagsColumnComponent implements OnInit {
private readonly cd = inject(ChangeDetectorRef);
@Input()
context: any;
nodeId: string;
constructor(private cd: ChangeDetectorRef) {}
ngOnInit(): void {
this.nodeId = this.context?.row?.id;
}

View File

@@ -34,7 +34,7 @@ import { MatIconModule } from '@angular/material/icon';
encapsulation: ViewEncapsulation.None
})
export class ThumbnailColumnComponent implements OnChanges {
private translation = inject(TranslationService);
private readonly translation = inject(TranslationService);
@Input()
context: any;

View File

@@ -22,7 +22,7 @@
* from Hyland Software. If not, see <http://www.gnu.org/licenses/>.
*/
import { ChangeDetectorRef, Component, OnInit, ViewEncapsulation } from '@angular/core';
import { ChangeDetectorRef, Component, OnInit, ViewEncapsulation, inject } from '@angular/core';
import { FavoritePaging, Pagination } from '@alfresco/js-api';
import { ContentApiService } from '@alfresco/aca-shared';
import { UserPreferencesService } from '@alfresco/adf-core';
@@ -37,6 +37,10 @@ import { LibrariesBaseComponent } from '../libraries-base/libraries-base.compone
encapsulation: ViewEncapsulation.None
})
export class FavoriteLibrariesComponent extends LibrariesBaseComponent implements OnInit {
private readonly contentApiService = inject(ContentApiService);
private readonly preferences = inject(UserPreferencesService);
private readonly changeDetectorRef = inject(ChangeDetectorRef);
pagination: Pagination = new Pagination({
skipCount: 0,
maxItems: 25,
@@ -46,14 +50,6 @@ export class FavoriteLibrariesComponent extends LibrariesBaseComponent implement
list: FavoritePaging = null;
columns: DocumentListPresetRef[] = [];
constructor(
private contentApiService: ContentApiService,
private preferences: UserPreferencesService,
private changeDetectorRef: ChangeDetectorRef
) {
super();
}
ngOnInit() {
super.ngOnInit();

View File

@@ -32,7 +32,7 @@ import {
ToolbarComponent
} from '@alfresco/aca-shared';
import { Node, NodeEntry, PathElement, PathInfo } from '@alfresco/js-api';
import { Component, OnInit, ViewEncapsulation } from '@angular/core';
import { Component, OnInit, ViewEncapsulation, inject } from '@angular/core';
import { debounceTime, map } from 'rxjs/operators';
import { DocumentListPresetRef, DynamicColumnComponent } from '@alfresco/adf-extensions';
import { CommonModule } from '@angular/common';
@@ -72,11 +72,9 @@ import { SearchAiInputContainerComponent } from '../knowledge-retrieval/search-a
selector: 'aca-favorites'
})
export class FavoritesComponent extends PageComponent implements OnInit {
columns: DocumentListPresetRef[] = [];
private readonly contentApi = inject(ContentApiService);
constructor(private contentApi: ContentApiService) {
super();
}
columns: DocumentListPresetRef[] = [];
ngOnInit() {
super.ngOnInit();

View File

@@ -29,7 +29,7 @@ import {
PaginationComponent,
ShowHeaderMode
} from '@alfresco/adf-core';
import { Component, OnDestroy, OnInit, ViewEncapsulation } from '@angular/core';
import { Component, OnDestroy, OnInit, ViewEncapsulation, inject } from '@angular/core';
import { ActivatedRoute, Params } from '@angular/router';
import { Node, NodeEntry, PathElement } from '@alfresco/js-api';
import { NodeActionsService } from '../../services/node-actions.service';
@@ -92,6 +92,11 @@ import { extractFiltersFromEncodedQuery } from '../../utils/aca-search-utils';
selector: 'aca-files'
})
export class FilesComponent extends PageComponent implements OnInit, OnDestroy {
private readonly contentApi = inject(ContentApiService);
private readonly nodeActionsService = inject(NodeActionsService);
private readonly route = inject(ActivatedRoute);
private readonly queryBuilderService = inject(SearchHeaderQueryBuilderService);
isValidPath = true;
isAdmin = false;
selectedNode: NodeEntry;
@@ -107,15 +112,6 @@ export class FilesComponent extends PageComponent implements OnInit, OnDestroy {
return this._errorTranslationKey;
}
constructor(
private readonly contentApi: ContentApiService,
private readonly nodeActionsService: NodeActionsService,
private readonly route: ActivatedRoute,
private readonly queryBuilderService: SearchHeaderQueryBuilderService
) {
super();
}
ngOnInit() {
super.ngOnInit();

View File

@@ -32,8 +32,8 @@ import { AppSettingsService } from '@alfresco/aca-shared';
encapsulation: ViewEncapsulation.None
})
export class HomeComponent implements OnInit {
private appSettings = inject(AppSettingsService);
private router = inject(Router);
private readonly appSettings = inject(AppSettingsService);
private readonly router = inject(Router);
ngOnInit() {
this.router.navigateByUrl(this.appSettings.landingPage);

View File

@@ -22,7 +22,7 @@
* from Hyland Software. If not, see <http://www.gnu.org/licenses/>.
*/
import { Component, Input, OnInit, Optional, ViewEncapsulation } from '@angular/core';
import { Component, Input, OnInit, ViewEncapsulation, inject } from '@angular/core';
import { Node } from '@alfresco/js-api';
import { isLocked, NodePermissionService } from '@alfresco/aca-shared';
import { MatCardModule } from '@angular/material/card';
@@ -40,16 +40,14 @@ import { ExternalNodePermissionCommentsTabService } from './external-node-permis
styleUrls: ['./comments-tab.component.scss']
})
export class CommentsTabComponent implements OnInit {
private readonly permission = inject(NodePermissionService);
private readonly externalPermissionNodeService = inject(ExternalNodePermissionCommentsTabService, { optional: true });
@Input()
node: Node;
canUpdateNode = false;
constructor(
private readonly permission: NodePermissionService,
@Optional() private readonly externalPermissionNodeService: ExternalNodePermissionCommentsTabService
) {}
ngOnInit(): void {
if (!this.node) {
this.canUpdateNode = false;

View File

@@ -77,6 +77,10 @@ export class InstantErrorStateMatcher implements ErrorStateMatcher {
encapsulation: ViewEncapsulation.None
})
export class LibraryMetadataFormComponent implements OnInit, OnChanges {
private readonly alfrescoApiService = inject(AlfrescoApiService);
protected readonly store = inject<Store<AppStore>>(Store);
private readonly appHookService = inject(AppHookService);
private _titleErrorTranslationKey: string;
@LazyApi((self: LibraryMetadataFormComponent) => new QueriesApi(self.alfrescoApiService.getInstance()))
@@ -112,12 +116,6 @@ export class LibraryMetadataFormComponent implements OnInit, OnChanges {
private readonly libraryNameInput: ElementRef<HTMLInputElement>;
private readonly destroyRef = inject(DestroyRef);
constructor(
private readonly alfrescoApiService: AlfrescoApiService,
protected readonly store: Store<AppStore>,
private readonly appHookService: AppHookService
) {}
toggleEdit() {
if (this.form.enabled) {
this.form.disable({

View File

@@ -61,6 +61,17 @@ import { ExtensionService } from '@alfresco/adf-extensions';
host: { class: 'app-metadata-tab' }
})
export class MetadataTabComponent implements OnInit {
private readonly permission = inject(NodePermissionService);
protected readonly extensions = inject(AppExtensionService);
private readonly appConfig = inject(AppConfigService);
private readonly notificationService = inject(NotificationService);
private readonly contentMetadataService = inject(ContentMetadataService);
private readonly actions$ = inject(Actions);
private readonly tagService = inject(TagService);
private readonly categoryService = inject(CategoryService);
private readonly store = inject<Store<AppStore>>(Store);
private readonly extensionService = inject(ExtensionService);
private _displayCategories = true;
private _displayTags = true;
@@ -80,18 +91,7 @@ export class MetadataTabComponent implements OnInit {
private readonly destroyRef = inject(DestroyRef);
constructor(
private readonly permission: NodePermissionService,
protected readonly extensions: AppExtensionService,
private readonly appConfig: AppConfigService,
private readonly notificationService: NotificationService,
private readonly contentMetadataService: ContentMetadataService,
private readonly actions$: Actions,
private readonly tagService: TagService,
private readonly categoryService: CategoryService,
private readonly store: Store<AppStore>,
private readonly extensionService: ExtensionService
) {
constructor() {
if (this.extensions.contentMetadata) {
this.appConfig.config['content-metadata'].presets = this.extensions.contentMetadata.presets;
}

View File

@@ -47,6 +47,13 @@ import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
host: { class: 'aca-agents-button' }
})
export class AgentsButtonComponent implements OnInit {
private readonly store = inject<Store<AppStore>>(Store);
private readonly notificationService = inject(NotificationService);
private readonly searchAiService = inject(SearchAiService);
private readonly agentService = inject(AgentService);
private readonly translateService = inject(TranslateService);
private readonly cd = inject(ChangeDetectorRef);
@Input()
data: { trigger: string };
@@ -74,15 +81,6 @@ export class AgentsButtonComponent implements OnInit {
private readonly destroyRef = inject(DestroyRef);
constructor(
private store: Store<AppStore>,
private notificationService: NotificationService,
private searchAiService: SearchAiService,
private agentService: AgentService,
private translateService: TranslateService,
private cd: ChangeDetectorRef
) {}
ngOnInit(): void {
this.store
.select(getAppSelection)

View File

@@ -22,7 +22,7 @@
* from Hyland Software. If not, see <http://www.gnu.org/licenses/>.
*/
import { Component, Input, OnInit, ViewEncapsulation } from '@angular/core';
import { Component, Input, OnInit, ViewEncapsulation, inject } from '@angular/core';
import { MatButtonModule } from '@angular/material/button';
import { MatIconModule } from '@angular/material/icon';
import { SearchAiInputComponent } from '../search-ai-input/search-ai-input.component';
@@ -42,6 +42,10 @@ import { Router } from '@angular/router';
encapsulation: ViewEncapsulation.None
})
export class SearchAiInputContainerComponent implements OnInit {
private readonly searchAiService = inject(SearchAiService);
private readonly searchNavigationService = inject(SearchAiNavigationService);
private readonly router = inject(Router);
@Input()
placeholder = 'KNOWLEDGE_RETRIEVAL.SEARCH.SEARCH_INPUT.DEFAULT_PLACEHOLDER';
@Input()
@@ -52,12 +56,6 @@ export class SearchAiInputContainerComponent implements OnInit {
inputState$: Observable<SearchAiInputState>;
isKnowledgeRetrievalPage = false;
constructor(
private readonly searchAiService: SearchAiService,
private searchNavigationService: SearchAiNavigationService,
private router: Router
) {}
ngOnInit(): void {
this.isKnowledgeRetrievalPage = this.router.url.startsWith('/knowledge-retrieval');
this.inputState$ = this.searchAiService.toggleSearchAiInput$;

View File

@@ -77,6 +77,14 @@ const MatTooltipOptions: MatTooltipDefaultOptions = {
providers: [{ provide: MAT_TOOLTIP_DEFAULT_OPTIONS, useValue: MatTooltipOptions }]
})
export class SearchAiInputComponent implements OnInit {
private readonly store = inject<Store<AppStore>>(Store);
private readonly searchAiService = inject(SearchAiService);
private readonly notificationService = inject(NotificationService);
private readonly agentService = inject(AgentService);
private readonly userPreferencesService = inject(UserPreferencesService);
private readonly translateService = inject(TranslateService);
private readonly modalAiService = inject(ModalAiService);
@Input()
placeholder: string;
@@ -91,10 +99,10 @@ export class SearchAiInputComponent implements OnInit {
private readonly storedNodesKey = 'knowledgeRetrievalNodes';
private _agentControl = new FormControl<Agent>(null);
private readonly _agentControl = new FormControl<Agent>(null);
private _agents: Agent[] = [];
private selectedNodesState: SelectionState;
private _queryControl = new FormControl('');
private readonly _queryControl = new FormControl('');
private _initialsByAgentId: { [key: string]: string } = {};
get agentControl(): FormControl<Agent> {
@@ -115,16 +123,6 @@ export class SearchAiInputComponent implements OnInit {
private readonly destroyRef = inject(DestroyRef);
constructor(
private store: Store<AppStore>,
private searchAiService: SearchAiService,
private notificationService: NotificationService,
private agentService: AgentService,
private userPreferencesService: UserPreferencesService,
private translateService: TranslateService,
private modalAiService: ModalAiService
) {}
ngOnInit(): void {
const queryValue = this.usedInAiResultsPage ? '' : this.searchTerm || '';
this.queryControl.setValue(queryValue);

View File

@@ -22,7 +22,7 @@
* from Hyland Software. If not, see <http://www.gnu.org/licenses/>.
*/
import { Component, ElementRef, OnInit, ViewEncapsulation } from '@angular/core';
import { Component, ElementRef, OnInit, ViewEncapsulation, inject } from '@angular/core';
import { ActivatedRoute } from '@angular/router';
import { PageComponent, PageLayoutComponent, ContentApiService } from '@alfresco/aca-shared';
import { catchError, delay, filter, finalize, map, retry, shareReplay, switchMap, tap } from 'rxjs/operators';
@@ -74,6 +74,16 @@ import { searchAiMarkedOptions } from './search-ai-marked-options';
host: { class: 'aca-search-ai-results' }
})
export class SearchAiResultsComponent extends PageComponent implements OnInit {
private readonly route = inject(ActivatedRoute);
private readonly clipboardService = inject(ClipboardService);
private readonly thumbnailService = inject(ThumbnailService);
private readonly translateService = inject(TranslateService);
private readonly unsavedChangesGuard = inject(UnsavedChangesGuard);
private readonly modalAiService = inject(ModalAiService);
private readonly viewerService = inject(ViewerService);
private readonly elementRef = inject(ElementRef);
private readonly contentApi = inject(ContentApiService);
private static readonly MERMAID_BLOCK_REGEX = /```mermaid([\s\S]*?)```/g;
private static readonly LATEX_BLOCK_REGEX = /```latex([\s\S]*?)```/g;
@@ -124,20 +134,6 @@ export class SearchAiResultsComponent extends PageComponent implements OnInit {
return this._hasReferencesLoadingError;
}
constructor(
private readonly route: ActivatedRoute,
private readonly clipboardService: ClipboardService,
private readonly thumbnailService: ThumbnailService,
private readonly translateService: TranslateService,
private readonly unsavedChangesGuard: UnsavedChangesGuard,
private readonly modalAiService: ModalAiService,
private readonly viewerService: ViewerService,
private readonly elementRef: ElementRef,
private readonly contentApi: ContentApiService
) {
super();
}
ngOnInit(): void {
this.viewerService.customNodesOrder = JSON.parse(this.userPreferencesService.get('aiReferences', '[]'));
this.route.queryParams

View File

@@ -22,7 +22,7 @@
* from Hyland Software. If not, see <http://www.gnu.org/licenses/>.
*/
import { ChangeDetectorRef, Component, OnInit, ViewEncapsulation } from '@angular/core';
import { ChangeDetectorRef, Component, OnInit, ViewEncapsulation, inject } from '@angular/core';
import { Pagination, SitePaging } from '@alfresco/js-api';
import { UserPreferencesService } from '@alfresco/adf-core';
import { SitesService } from '@alfresco/adf-content-services';
@@ -36,6 +36,10 @@ import { LibrariesBaseComponent } from '../libraries-base/libraries-base.compone
encapsulation: ViewEncapsulation.None
})
export class LibraryListComponent extends LibrariesBaseComponent implements OnInit {
private readonly preferences = inject(UserPreferencesService);
private readonly changeDetectorRef = inject(ChangeDetectorRef);
private readonly sitesService = inject(SitesService);
pagination = new Pagination({
skipCount: 0,
maxItems: 25,
@@ -44,14 +48,6 @@ export class LibraryListComponent extends LibrariesBaseComponent implements OnIn
isLoading = false;
list: SitePaging = null;
constructor(
private readonly preferences: UserPreferencesService,
private readonly changeDetectorRef: ChangeDetectorRef,
private readonly sitesService: SitesService
) {
super();
}
ngOnInit() {
super.ngOnInit();

View File

@@ -24,7 +24,7 @@
import { SearchQueryBuilderService } from '@alfresco/adf-content-services';
import { SearchSortingDefinition } from '@alfresco/adf-content-services/lib/search/models/search-sorting-definition.interface';
import { Component, EventEmitter, OnInit, Output, ViewEncapsulation } from '@angular/core';
import { Component, EventEmitter, OnInit, Output, ViewEncapsulation, inject } from '@angular/core';
import { CommonModule } from '@angular/common';
import { TranslatePipe } from '@ngx-translate/core';
import { MatMenuModule } from '@angular/material/menu';
@@ -38,13 +38,13 @@ import { MatButtonModule } from '@angular/material/button';
encapsulation: ViewEncapsulation.None
})
export class SearchActionMenuComponent implements OnInit {
private readonly queryBuilder = inject(SearchQueryBuilderService);
@Output()
sortingSelected: EventEmitter<SearchSortingDefinition> = new EventEmitter();
options: SearchSortingDefinition[] = [];
constructor(private queryBuilder: SearchQueryBuilderService) {}
ngOnInit(): void {
this.options = this.queryBuilder.getSortingOptions();
}

View File

@@ -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 { Store } from '@ngrx/store';
import { AppStore, SearchByTermAction } from '@alfresco/aca-shared/store';
import { SearchQueryBuilderService } from '@alfresco/adf-content-services';
@@ -32,13 +32,11 @@ import { SearchLibrariesQueryBuilderService } from './search-libraries-results/s
@Injectable({ providedIn: 'root' })
export class SearchExecutionService {
constructor(
private readonly store: Store<AppStore>,
private readonly queryBuilder: SearchQueryBuilderService,
private readonly queryLibrariesBuilder: SearchLibrariesQueryBuilderService,
private readonly filterService: SearchFilterService,
private readonly searchNavigationService: SearchNavigationService
) {}
private readonly store = inject<Store<AppStore>>(Store);
private readonly queryBuilder = inject(SearchQueryBuilderService);
private readonly queryLibrariesBuilder = inject(SearchLibrariesQueryBuilderService);
private readonly filterService = inject(SearchFilterService);
private readonly searchNavigationService = inject(SearchNavigationService);
execute(searchedWord: string) {
if (!searchedWord?.trim()) {

View File

@@ -22,13 +22,15 @@
* from Hyland Software. If not, see <http://www.gnu.org/licenses/>.
*/
import { Injectable } from '@angular/core';
import { Injectable, inject } from '@angular/core';
import { SearchQueryBuilderService } from '@alfresco/adf-content-services';
import { SearchOptionIds, SearchOptionModel } from '@alfresco/aca-shared/store';
import { isOperator } from '../../utils/aca-search-utils';
@Injectable({ providedIn: 'root' })
export class SearchFilterService {
private readonly queryBuilder = inject(SearchQueryBuilderService);
searchInMode: 'content' | 'libraries' = 'content';
filesChecked = true;
foldersChecked = true;
@@ -54,8 +56,6 @@ export class SearchFilterService {
}
];
constructor(private readonly queryBuilder: SearchQueryBuilderService) {}
isFilesChecked(): boolean {
return this.getOptionValue(SearchOptionIds.Files);
}

View File

@@ -52,6 +52,15 @@ import { extractSearchedWordFromEncodedQuery } from '../../../utils/aca-search-u
host: { class: 'aca-search-input' }
})
export class SearchInputComponent implements OnInit, OnDestroy {
private readonly queryBuilder = inject(SearchQueryBuilderService);
private readonly config = inject(AppConfigService);
private readonly router = inject(Router);
private readonly route = inject(ActivatedRoute);
private readonly appHookService = inject(AppHookService);
private readonly filterService = inject(SearchFilterService);
private readonly searchExecutionService = inject(SearchExecutionService);
readonly searchNavigationService = inject(SearchNavigationService);
has400LibraryError = false;
searchOnChange: boolean;
searchedWord: string = null;
@@ -62,16 +71,7 @@ export class SearchInputComponent implements OnInit, OnDestroy {
private readonly destroyRef = inject(DestroyRef);
constructor(
private readonly queryBuilder: SearchQueryBuilderService,
private readonly config: AppConfigService,
private readonly router: Router,
private readonly route: ActivatedRoute,
private readonly appHookService: AppHookService,
private readonly filterService: SearchFilterService,
private readonly searchExecutionService: SearchExecutionService,
public readonly searchNavigationService: SearchNavigationService
) {
constructor() {
this.searchOnChange = this.config.get<boolean>('search.aca:triggeredOnChange', true);
}

View File

@@ -40,7 +40,7 @@ describe('SearchLibrariesQueryBuilderService', () => {
apiService = TestBed.inject(AlfrescoApiService);
apiService.reset();
builder = new SearchLibrariesQueryBuilderService(apiService);
builder = TestBed.inject(SearchLibrariesQueryBuilderService);
queriesApi = builder['queriesApi'];
});

View File

@@ -23,7 +23,7 @@
*/
import { AlfrescoApiService } from '@alfresco/adf-content-services';
import { Injectable } from '@angular/core';
import { Injectable, inject } from '@angular/core';
import { QueriesApi, SitePaging, LazyApi } from '@alfresco/js-api';
import { Subject } from 'rxjs';
@@ -39,6 +39,8 @@ export interface LibrarySearchQuery {
providedIn: 'root'
})
export class SearchLibrariesQueryBuilderService {
private readonly alfrescoApiService = inject(AlfrescoApiService);
private _userQuery = '';
@LazyApi((self: SearchLibrariesQueryBuilderService) => new QueriesApi(self.alfrescoApiService.getInstance()))
@@ -58,8 +60,6 @@ export class SearchLibrariesQueryBuilderService {
this._userQuery = value ? value.trim() : '';
}
constructor(private alfrescoApiService: AlfrescoApiService) {}
update(): void {
const query = this.buildQuery();
if (query) {

View File

@@ -24,7 +24,7 @@
import { NavigateLibraryAction } from '@alfresco/aca-shared/store';
import { NodePaging, Pagination, SiteEntry } from '@alfresco/js-api';
import { Component, OnInit, ViewEncapsulation } from '@angular/core';
import { Component, OnInit, ViewEncapsulation, inject } from '@angular/core';
import { ActivatedRoute, Params } from '@angular/router';
import { SearchLibrariesQueryBuilderService } from './search-libraries-query-builder.service';
import {
@@ -72,6 +72,10 @@ import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
encapsulation: ViewEncapsulation.None
})
export class SearchLibrariesResultsComponent extends PageComponent implements OnInit {
private readonly librariesQueryBuilder = inject(SearchLibrariesQueryBuilderService);
private readonly route = inject(ActivatedRoute);
private readonly appHookService = inject(AppHookService);
searchedWord: string;
queryParamName = 'q';
data: NodePaging;
@@ -79,12 +83,9 @@ export class SearchLibrariesResultsComponent extends PageComponent implements On
isLoading = false;
columns: DocumentListPresetRef[] = [];
constructor(
private readonly librariesQueryBuilder: SearchLibrariesQueryBuilderService,
private readonly route: ActivatedRoute,
private readonly appHookService: AppHookService
) {
constructor() {
super();
const librariesQueryBuilder = this.librariesQueryBuilder;
librariesQueryBuilder.paging = {
skipCount: 0,

View File

@@ -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 { PRIMARY_OUTLET, Router, UrlSegment, UrlSegmentGroup, UrlTree } from '@angular/router';
import { extractSearchedWordFromEncodedQuery } from '../../utils/aca-search-utils';
@@ -30,6 +30,8 @@ import { extractSearchedWordFromEncodedQuery } from '../../utils/aca-search-util
providedIn: 'root'
})
export class SearchNavigationService {
private readonly router = inject(Router);
private _previousRoute = '';
get previousRoute(): string {
@@ -44,8 +46,6 @@ export class SearchNavigationService {
return !this.onLibrariesSearchResults && this.router?.url.indexOf('/search') === 0;
}
constructor(private router: Router) {}
saveRoute(route: string): void {
this._previousRoute = route;
}

View File

@@ -46,7 +46,12 @@ import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
host: { class: 'aca-search-results-row' }
})
export class SearchResultsRowComponent implements OnInit {
private settings = inject(AppSettingsService);
private readonly store = inject<Store<any>>(Store);
private readonly nodesApiService = inject(NodesApiService);
private readonly router = inject(Router);
private readonly autoDownloadService = inject(AutoDownloadService);
private readonly settings = inject(AppSettingsService);
private readonly highlightPrefix = `<span class="aca-highlight">`;
private readonly highlightPostfix = `</span>`;
@@ -80,13 +85,6 @@ export class SearchResultsRowComponent implements OnInit {
private readonly destroyRef = inject(DestroyRef);
constructor(
private store: Store<any>,
private nodesApiService: NodesApiService,
private router: Router,
private autoDownloadService: AutoDownloadService
) {}
ngOnInit() {
this.updateValues();

View File

@@ -132,7 +132,13 @@ import { SavedSearchesContextService } from '../../../services/saved-searches-co
styleUrls: ['./search-results.component.scss']
})
export class SearchResultsComponent extends PageComponent implements OnInit, OnDestroy {
private notificationService = inject(NotificationService);
private readonly queryBuilder = inject(SearchQueryBuilderService);
private readonly changeDetectorRef = inject(ChangeDetectorRef);
private readonly route = inject(ActivatedRoute);
private readonly translationService = inject(TranslationService);
private readonly savedSearchesService = inject(SavedSearchesContextService);
private readonly notificationService = inject(NotificationService);
infoDrawerPreview$ = this.store.select(infoDrawerPreview);
@@ -156,15 +162,11 @@ export class SearchResultsComponent extends PageComponent implements OnInit, OnD
this.isSmallScreen = window.innerWidth < 320;
};
constructor(
tagsService: TagService,
private readonly queryBuilder: SearchQueryBuilderService,
private readonly changeDetectorRef: ChangeDetectorRef,
private readonly route: ActivatedRoute,
private readonly translationService: TranslationService,
private readonly savedSearchesService: SavedSearchesContextService
) {
constructor() {
const tagsService = inject(TagService);
super();
const queryBuilder = this.queryBuilder;
this.isTagsEnabled = tagsService.areTagsEnabled();

View File

@@ -22,7 +22,7 @@
* from Hyland Software. If not, see <http://www.gnu.org/licenses/>.
*/
import { Component, Inject, ViewEncapsulation } from '@angular/core';
import { Component, ViewEncapsulation, inject } from '@angular/core';
import { AutoFocusDirective, SavedSearch } from '@alfresco/adf-content-services';
import { MAT_DIALOG_DATA, MatDialogModule, MatDialogRef } from '@angular/material/dialog';
import { take } from 'rxjs/operators';
@@ -42,14 +42,12 @@ import { SavedSearchesContextService } from '../../../../../services/saved-searc
host: { class: 'aca-saved-search-delete-dialog' }
})
export class SavedSearchDeleteDialogComponent {
isLoading = false;
private readonly dialog = inject<MatDialogRef<SavedSearchDeleteDialogComponent>>(MatDialogRef);
private readonly notificationService = inject(NotificationService);
private readonly savedSearchesService = inject(SavedSearchesContextService);
private readonly data = inject<SavedSearch>(MAT_DIALOG_DATA);
constructor(
private readonly dialog: MatDialogRef<SavedSearchDeleteDialogComponent>,
private readonly notificationService: NotificationService,
private readonly savedSearchesService: SavedSearchesContextService,
@Inject(MAT_DIALOG_DATA) private readonly data: SavedSearch
) {}
isLoading = false;
onSubmit() {
if (this.isLoading) {

View File

@@ -22,7 +22,7 @@
* from Hyland Software. If not, see <http://www.gnu.org/licenses/>.
*/
import { Component, Inject, ViewEncapsulation } from '@angular/core';
import { Component, ViewEncapsulation, inject } from '@angular/core';
import { AutoFocusDirective, forbidOnlySpaces, SavedSearch } from '@alfresco/adf-content-services';
import { MAT_DIALOG_DATA, MatDialogModule, MatDialogRef } from '@angular/material/dialog';
import { take } from 'rxjs/operators';
@@ -57,16 +57,16 @@ import { SavedSearchesContextService } from '../../../../../services/saved-searc
host: { class: 'aca-saved-search-edit-dialog' }
})
export class SavedSearchEditDialogComponent {
private readonly dialog = inject<MatDialogRef<SavedSearchEditDialogComponent>>(MatDialogRef);
private readonly notificationService = inject(NotificationService);
private readonly savedSearchesService = inject(SavedSearchesContextService);
private readonly uniqueSearchNameValidator = inject(UniqueSearchNameValidator);
private readonly data = inject<SavedSearch>(MAT_DIALOG_DATA);
form: FormGroup<SavedSearchForm>;
isLoading = false;
constructor(
private readonly dialog: MatDialogRef<SavedSearchEditDialogComponent>,
private readonly notificationService: NotificationService,
private readonly savedSearchesService: SavedSearchesContextService,
private readonly uniqueSearchNameValidator: UniqueSearchNameValidator,
@Inject(MAT_DIALOG_DATA) private readonly data: SavedSearch
) {
constructor() {
this.form = new FormGroup({
name: new FormControl('', {
validators: [Validators.required, forbidOnlySpaces],

View File

@@ -22,7 +22,7 @@
* from Hyland Software. If not, see <http://www.gnu.org/licenses/>.
*/
import { Component, Inject, ViewEncapsulation } from '@angular/core';
import { Component, ViewEncapsulation, inject } from '@angular/core';
import { MatMenuModule } from '@angular/material/menu';
import { CommonModule } from '@angular/common';
import { TranslatePipe } from '@ngx-translate/core';
@@ -63,16 +63,18 @@ import { SavedSearchesContextService } from '../../../../services/saved-searches
host: { class: 'aca-save-search-dialog' }
})
export class SaveSearchDialogComponent {
private readonly dialog = inject<MatDialogRef<SaveSearchDialogComponent>>(MatDialogRef);
private readonly notificationService = inject(NotificationService);
private readonly savedSearchesService = inject(SavedSearchesContextService);
private readonly uniqueSearchNameValidator = inject(UniqueSearchNameValidator);
private readonly data = inject<{
searchUrl: string;
}>(MAT_DIALOG_DATA);
form: FormGroup<SavedSearchForm>;
disableSubmitButton = false;
constructor(
private readonly dialog: MatDialogRef<SaveSearchDialogComponent>,
private readonly notificationService: NotificationService,
private readonly savedSearchesService: SavedSearchesContextService,
private readonly uniqueSearchNameValidator: UniqueSearchNameValidator,
@Inject(MAT_DIALOG_DATA) private readonly data: { searchUrl: string }
) {
constructor() {
this.form = new FormGroup({
name: new FormControl('', {
validators: [Validators.required, forbidOnlySpaces],

View File

@@ -22,14 +22,14 @@
* from Hyland Software. If not, see <http://www.gnu.org/licenses/>.
*/
import { Injectable } from '@angular/core';
import { Injectable, inject } from '@angular/core';
import { AbstractControl, AsyncValidator, ValidationErrors } from '@angular/forms';
import { catchError, map, Observable, of } from 'rxjs';
import { SavedSearchesContextService } from '../../../../services/saved-searches-context.service';
@Injectable({ providedIn: 'root' })
export class UniqueSearchNameValidator implements AsyncValidator {
constructor(private readonly savedSearchesService: SavedSearchesContextService) {}
private readonly savedSearchesService = inject(SavedSearchesContextService);
validate(control: AbstractControl): Observable<ValidationErrors | null> {
return this.savedSearchesService.getSavedSearches().pipe(

View File

@@ -34,6 +34,8 @@ import { SaveSearchDirectiveDialogData } from '../dialog/save-search-directive-d
standalone: true
})
export class SaveSearchDirective {
private readonly overlayContainer = inject(OverlayContainer);
/** Encoded search query */
@Input()
acaSaveSearchQuery: string;
@@ -46,8 +48,6 @@ export class SaveSearchDirective {
private readonly dialogRef = inject(MatDialog);
private readonly elementRef = inject(ElementRef<HTMLElement>);
constructor(private readonly overlayContainer: OverlayContainer) {}
@HostListener('click', ['$event'])
onClick(event: MouseEvent) {
event.preventDefault();

View File

@@ -22,7 +22,7 @@
* from Hyland Software. If not, see <http://www.gnu.org/licenses/>.
*/
import { Component, OnInit, ViewEncapsulation } from '@angular/core';
import { Component, OnInit, ViewEncapsulation, inject } from '@angular/core';
import { debounceTime } from 'rxjs/operators';
import { NodeEntry } from '@alfresco/js-api';
import {
@@ -72,11 +72,9 @@ import { DocumentListComponent } from '@alfresco/adf-content-services';
selector: 'aca-shared-files'
})
export class SharedFilesComponent extends PageComponent implements OnInit {
columns: DocumentListPresetRef[] = [];
private readonly appHookService = inject(AppHookService);
constructor(private appHookService: AppHookService) {
super();
}
columns: DocumentListPresetRef[] = [];
ngOnInit() {
super.ngOnInit();

View File

@@ -45,22 +45,20 @@ import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
host: { class: 'app-shared-link-view' }
})
export class SharedLinkViewComponent implements OnInit {
private readonly route = inject(ActivatedRoute);
private readonly store = inject<Store<AppStore>>(Store);
private readonly extensions = inject(AppExtensionService);
private readonly alfrescoApiService = inject(AlfrescoApiService);
private readonly appService = inject(AppService);
sharedLinkId: string = null;
viewerToolbarActions: Array<ContentActionRef> = [];
@LazyApi((self: SharedLinkViewComponent) => new SharedlinksApi(self.alfrescoApiService.getInstance()))
declare private sharedLinksApi: SharedlinksApi;
declare private readonly sharedLinksApi: SharedlinksApi;
private readonly destroyRef = inject(DestroyRef);
constructor(
private route: ActivatedRoute,
private store: Store<AppStore>,
private extensions: AppExtensionService,
private alfrescoApiService: AlfrescoApiService,
private appService: AppService
) {}
ngOnInit() {
this.route.params
.pipe(

View File

@@ -22,7 +22,7 @@
* from Hyland Software. If not, see <http://www.gnu.org/licenses/>.
*/
import { ChangeDetectorRef, Component, Input, OnInit, ViewEncapsulation } from '@angular/core';
import { ChangeDetectorRef, Component, Input, OnInit, ViewEncapsulation, inject } from '@angular/core';
import { OverlayContainer } from '@angular/cdk/overlay';
import { NavBarLinkRef } from '@alfresco/adf-extensions';
import { CommonModule } from '@angular/common';
@@ -42,13 +42,13 @@ import { MenuPanelDirective } from '../directives/menu-panel.directive';
encapsulation: ViewEncapsulation.None
})
export class ButtonMenuComponent implements OnInit {
private readonly cd = inject(ChangeDetectorRef);
private readonly overlayContainer = inject(OverlayContainer);
@Input({ required: true })
item: NavBarLinkRef;
constructor(
private readonly cd: ChangeDetectorRef,
private readonly overlayContainer: OverlayContainer
) {
constructor() {
this.overlayContainer.getContainerElement().classList.add('aca-menu-panel');
}

View File

@@ -22,7 +22,7 @@
* from Hyland Software. If not, see <http://www.gnu.org/licenses/>.
*/
import { ChangeDetectorRef, Component, EventEmitter, Input, OnInit, Output, ViewEncapsulation } from '@angular/core';
import { ChangeDetectorRef, Component, EventEmitter, Input, OnInit, Output, ViewEncapsulation, inject } from '@angular/core';
import { NavBarLinkRef } from '@alfresco/adf-extensions';
import { CommonModule } from '@angular/common';
import { TranslatePipe } from '@ngx-translate/core';
@@ -40,14 +40,14 @@ import { MatExpansionModule } from '@angular/material/expansion';
host: { class: 'app-expand-menu' }
})
export class ExpandMenuComponent implements OnInit {
private readonly cd = inject(ChangeDetectorRef);
@Input({ required: true })
item: NavBarLinkRef;
@Output()
actionClicked = new EventEmitter<NavBarLinkRef>();
constructor(private cd: ChangeDetectorRef) {}
ngOnInit() {
this.cd.detectChanges();
}

View File

@@ -38,8 +38,8 @@ import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
host: { class: 'app-sidenav-header' }
})
export class SidenavHeaderComponent implements OnInit {
private appSettings = inject(AppSettingsService);
private appExtensions = inject(AppExtensionService);
private readonly appSettings = inject(AppSettingsService);
private readonly appExtensions = inject(AppExtensionService);
private readonly destroyRef = inject(DestroyRef);

View File

@@ -37,12 +37,12 @@ describe('ActionDirective', () => {
beforeEach(() => {
TestBed.configureTestingModule({
imports: [ActionDirective],
providers: [provideRouter([]), provideMockStore()]
providers: [ActionDirective, provideRouter([]), provideMockStore()]
});
store = TestBed.inject(Store);
router = TestBed.inject(Router);
directive = new ActionDirective(router, store);
directive = TestBed.inject(ActionDirective);
});
it('should navigate if action is route', () => {

View File

@@ -22,7 +22,7 @@
* from Hyland Software. If not, see <http://www.gnu.org/licenses/>.
*/
import { Directive, EventEmitter, HostListener, Input, Output } from '@angular/core';
import { Directive, EventEmitter, HostListener, Input, Output, inject } from '@angular/core';
import { Params, PRIMARY_OUTLET, Router } from '@angular/router';
import { Store } from '@ngrx/store';
import { AppStore } from '@alfresco/aca-shared/store';
@@ -35,6 +35,9 @@ import { NavBarLinkRef } from '@alfresco/adf-extensions';
exportAs: 'action'
})
export class ActionDirective {
private readonly router = inject(Router);
private readonly store = inject<Store<AppStore>>(Store);
@Input() action;
@Output() actionClicked = new EventEmitter<NavBarLinkRef>();
@@ -51,11 +54,6 @@ export class ActionDirective {
}
this.actionClicked.next(this.action);
}
constructor(
private router: Router,
private store: Store<AppStore>
) {}
private getNavigationCommands(url: string): any[] {
const urlTree = this.router.parseUrl(url);
const urlSegmentGroup = urlTree.root.children[PRIMARY_OUTLET];

View File

@@ -42,7 +42,7 @@ class TestComponent {
}
class MockRouter {
private subject = new Subject();
private readonly subject = new Subject();
events = this.subject.asObservable();
url = '';

View File

@@ -22,19 +22,7 @@
* from Hyland Software. If not, see <http://www.gnu.org/licenses/>.
*/
import {
AfterContentInit,
ContentChildren,
DestroyRef,
Directive,
ElementRef,
inject,
Input,
OnInit,
Optional,
QueryList,
Renderer2
} from '@angular/core';
import { AfterContentInit, ContentChildren, DestroyRef, Directive, ElementRef, inject, Input, OnInit, QueryList, Renderer2 } from '@angular/core';
import { NavigationEnd, Router } from '@angular/router';
import { filter } from 'rxjs/operators';
import { ActionDirective } from './action.directive';
@@ -46,6 +34,11 @@ import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
exportAs: 'acaActiveLink'
})
export class ActiveLinkDirective implements OnInit, AfterContentInit {
private readonly router = inject(Router);
private readonly element = inject(ElementRef);
private readonly renderer = inject(Renderer2);
private readonly action = inject(ActionDirective, { optional: true });
@Input() acaActiveLink;
@ContentChildren(ActionDirective, { descendants: true })
links: QueryList<ActionDirective>;
@@ -53,13 +46,6 @@ export class ActiveLinkDirective implements OnInit, AfterContentInit {
private readonly destroyRef = inject(DestroyRef);
constructor(
private router: Router,
private element: ElementRef,
private renderer: Renderer2,
@Optional() private action?: ActionDirective
) {}
ngOnInit() {
this.router.events
.pipe(

View File

@@ -22,14 +22,16 @@
* from Hyland Software. If not, see <http://www.gnu.org/licenses/>.
*/
import { NavigationEnd } from '@angular/router';
import { NavigationEnd, Router } from '@angular/router';
import { ExpansionPanelDirective } from './expansion-panel.directive';
import { Subject } from 'rxjs';
import { TestBed } from '@angular/core/testing';
import { Store } from '@ngrx/store';
import { MatExpansionPanel } from '@angular/material/expansion';
class RouterStub {
url;
private subject = new Subject();
private readonly subject = new Subject();
events = this.subject.asObservable();
constructor(url = 'some-url') {
@@ -59,16 +61,31 @@ describe('AcaExpansionPanel', () => {
children: []
};
beforeEach(() => {
TestBed.configureTestingModule({
imports: [ExpansionPanelDirective],
providers: [
ExpansionPanelDirective,
{
provide: Store,
useValue: mockStore
},
{
provide: MatExpansionPanel,
useValue: mockMatExpansionPanel
}
]
});
});
describe('hasActiveLinks()', () => {
it('should return true if child is active route', () => {
const router: any = new RouterStub('dummy-route-2');
const item = {
children: [{ url: 'dummy-route-1' }, { url: 'dummy-route-2' }]
};
let directive: ExpansionPanelDirective;
TestBed.runInInjectionContext(() => {
directive = new ExpansionPanelDirective(mockStore, router, mockMatExpansionPanel);
});
TestBed.overrideProvider(Router, { useValue: router });
const directive = TestBed.inject(ExpansionPanelDirective);
directive.acaExpansionPanel = item;
@@ -79,10 +96,8 @@ describe('AcaExpansionPanel', () => {
const item = {
children: [{ url: 'dummy-route-1' }, { url: 'dummy-route-2' }]
};
let directive: ExpansionPanelDirective;
TestBed.runInInjectionContext(() => {
directive = new ExpansionPanelDirective(mockStore, router, mockMatExpansionPanel);
});
TestBed.overrideProvider(Router, { useValue: router });
const directive = TestBed.inject(ExpansionPanelDirective);
directive.acaExpansionPanel = item;
@@ -100,10 +115,8 @@ describe('AcaExpansionPanel', () => {
mockMatExpansionPanel.expanded = true;
let directive: ExpansionPanelDirective;
TestBed.runInInjectionContext(() => {
directive = new ExpansionPanelDirective(mockStore, router, mockMatExpansionPanel);
});
TestBed.overrideProvider(Router, { useValue: router });
const directive = TestBed.inject(ExpansionPanelDirective);
directive.acaExpansionPanel = item;
@@ -119,10 +132,8 @@ describe('AcaExpansionPanel', () => {
children: [{ url: 'dummy-route-1' }, { url: 'dummy-route-2' }]
};
let directive: ExpansionPanelDirective;
TestBed.runInInjectionContext(() => {
directive = new ExpansionPanelDirective(mockStore, router, mockMatExpansionPanel);
});
TestBed.overrideProvider(Router, { useValue: router });
const directive = TestBed.inject(ExpansionPanelDirective);
directive.acaExpansionPanel = item;
mockMatExpansionPanel.expanded = true;
@@ -142,10 +153,8 @@ describe('AcaExpansionPanel', () => {
}
};
let directive: ExpansionPanelDirective;
TestBed.runInInjectionContext(() => {
directive = new ExpansionPanelDirective(mockStore, router, mockMatExpansionPanel);
});
TestBed.overrideProvider(Router, { useValue: router });
const directive = TestBed.inject(ExpansionPanelDirective);
directive.acaExpansionPanel = item;
mockMatExpansionPanel.expanded = true;

View File

@@ -35,6 +35,10 @@ import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
exportAs: 'acaExpansionPanel'
})
export class ExpansionPanelDirective implements OnInit {
private readonly store = inject<Store<any>>(Store);
private readonly router = inject(Router);
private readonly expansionPanel = inject(MatExpansionPanel);
@Input() acaExpansionPanel;
public hasActiveChildren = false;
@@ -55,12 +59,6 @@ export class ExpansionPanelDirective implements OnInit {
private readonly destroyRef = inject(DestroyRef);
constructor(
private store: Store<any>,
private router: Router,
private expansionPanel: MatExpansionPanel
) {}
hasActiveLinks() {
if (this.acaExpansionPanel?.children) {
return this.acaExpansionPanel.children.some((child) => this.router.url.startsWith(child.url || child.action.payload));

View File

@@ -22,14 +22,15 @@
* from Hyland Software. If not, see <http://www.gnu.org/licenses/>.
*/
import { NavigationEnd } from '@angular/router';
import { NavigationEnd, Router } from '@angular/router';
import { MenuPanelDirective } from './menu-panel.directive';
import { Subject } from 'rxjs';
import { TestBed } from '@angular/core/testing';
import { Store } from '@ngrx/store';
class RouterStub {
url;
private subject = new Subject();
private readonly subject = new Subject();
events = this.subject.asObservable();
constructor(url = 'some-url') {
@@ -59,16 +60,27 @@ describe('MenuPanelDirective', () => {
children: []
};
beforeEach(() => {
TestBed.configureTestingModule({
imports: [MenuPanelDirective],
providers: [
MenuPanelDirective,
{
provide: Store,
useValue: mockStore
}
]
});
});
describe('hasActiveLinks()', () => {
it('should return true if child is active route', () => {
const router: any = new RouterStub('dummy-route-2');
const item = {
children: [{ url: 'dummy-route-1' }, { url: 'dummy-route-2' }]
};
let directive: MenuPanelDirective;
TestBed.runInInjectionContext(() => {
directive = new MenuPanelDirective(mockStore, router);
});
TestBed.overrideProvider(Router, { useValue: router });
const directive = TestBed.inject(MenuPanelDirective);
directive.acaMenuPanel = item;
@@ -79,10 +91,8 @@ describe('MenuPanelDirective', () => {
const item = {
children: [{ url: 'dummy-route-1' }, { url: 'dummy-route-2' }]
};
let directive: MenuPanelDirective;
TestBed.runInInjectionContext(() => {
directive = new MenuPanelDirective(mockStore, router);
});
TestBed.overrideProvider(Router, { useValue: router });
const directive = TestBed.inject(MenuPanelDirective);
directive.acaMenuPanel = item;
@@ -100,10 +110,8 @@ describe('MenuPanelDirective', () => {
mockMatExpansionPanel.expanded = true;
let directive: MenuPanelDirective;
TestBed.runInInjectionContext(() => {
directive = new MenuPanelDirective(mockStore, router);
});
TestBed.overrideProvider(Router, { useValue: router });
const directive = TestBed.inject(MenuPanelDirective);
directive.acaMenuPanel = item;
@@ -119,10 +127,8 @@ describe('MenuPanelDirective', () => {
children: [{ url: 'dummy-route-1' }, { url: 'dummy-route-2' }]
};
let directive: MenuPanelDirective;
TestBed.runInInjectionContext(() => {
directive = new MenuPanelDirective(mockStore, router);
});
TestBed.overrideProvider(Router, { useValue: router });
const directive = TestBed.inject(MenuPanelDirective);
directive.acaMenuPanel = item;
mockMatExpansionPanel.expanded = true;

View File

@@ -34,6 +34,9 @@ import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
exportAs: 'acaMenuPanel'
})
export class MenuPanelDirective implements OnInit {
private readonly store = inject<Store<any>>(Store);
private readonly router = inject(Router);
@Input() acaMenuPanel;
hasActiveChildren = false;
@@ -54,11 +57,6 @@ export class MenuPanelDirective implements OnInit {
private readonly destroyRef = inject(DestroyRef);
constructor(
private store: Store<any>,
private router: Router
) {}
hasActiveLinks() {
if (this.acaMenuPanel?.children) {
return this.acaMenuPanel.children.some((child) => this.router.url.startsWith(child.url || child.action.payload));

View File

@@ -46,6 +46,11 @@ import { TranslatePipe } from '@ngx-translate/core';
host: { class: 'app-sidenav' }
})
export class SidenavComponent implements OnInit {
private readonly store = inject<Store<AppStore>>(Store);
private readonly extensions = inject(AppExtensionService);
private readonly appService = inject(AppService);
private readonly navigationHistoryService = inject(NavigationHistoryService);
@Input()
data: {
layout?: SidenavLayoutComponent;
@@ -56,13 +61,6 @@ export class SidenavComponent implements OnInit {
private readonly destroyRef = inject(DestroyRef);
constructor(
private store: Store<AppStore>,
private extensions: AppExtensionService,
private appService: AppService,
private navigationHistoryService: NavigationHistoryService
) {}
ngOnInit() {
this.store
.select(getSideNavState)

View File

@@ -39,7 +39,7 @@ import { ToolbarMenuItemComponent, UserProfileService } from '@alfresco/aca-shar
host: { class: 'aca-user-menu' }
})
export class UserMenuComponent implements OnInit, AfterViewInit {
private userProfileService = inject(UserProfileService);
private readonly userProfileService = inject(UserProfileService);
user$ = this.userProfileService.userProfile$;

View File

@@ -47,24 +47,22 @@ import { MatIconModule } from '@angular/material/icon';
host: { class: 'app-toggle-edit-offline' }
})
export class ToggleEditOfflineComponent implements OnInit {
private readonly store = inject<Store<AppStore>>(Store);
private readonly alfrescoApiService = inject(AlfrescoApiService);
private readonly extensions = inject(AppExtensionService);
@ViewChild(MatMenuItem)
menuItem: MatMenuItem;
private notificationService = inject(NotificationService);
private readonly notificationService = inject(NotificationService);
@LazyApi((self: ToggleEditOfflineComponent) => new NodesApi(self.alfrescoApiService.getInstance()))
declare private nodesApi: NodesApi;
declare private readonly nodesApi: NodesApi;
selection: NodeEntry;
nodeTitle = '';
isNodeLocked = false;
constructor(
private store: Store<AppStore>,
private alfrescoApiService: AlfrescoApiService,
private extensions: AppExtensionService
) {}
ngOnInit() {
this.store.select(getAppSelection).subscribe(({ file }) => {
this.selection = file;

View File

@@ -54,6 +54,10 @@ import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
host: { class: 'app-toggle-favorite-library' }
})
export class ToggleFavoriteLibraryComponent implements OnInit {
private readonly store = inject<Store<AppStore>>(Store);
private readonly appHookService = inject(AppHookService);
private readonly router = inject(Router);
library;
@Input() data: { focusAfterClosed?: string };
@@ -63,12 +67,6 @@ export class ToggleFavoriteLibraryComponent implements OnInit {
private readonly destroyRef = inject(DestroyRef);
constructor(
private store: Store<AppStore>,
private appHookService: AppHookService,
private router: Router
) {}
ngOnInit() {
const isFavoriteLibraries = this.router.url.startsWith('/favorite/libraries');

View File

@@ -47,7 +47,10 @@ import { MatMenuItem, MatMenuModule } from '@angular/material/menu';
host: { class: 'app-toggle-favorite' }
})
export class ToggleFavoriteComponent implements OnInit {
private documentListService = inject(DocumentListService);
private readonly store = inject<Store<AppStore>>(Store);
private readonly router = inject(Router);
private readonly documentListService = inject(DocumentListService);
@Input() data: any;
selection$: Observable<SelectionState>;
@@ -56,10 +59,7 @@ export class ToggleFavoriteComponent implements OnInit {
@ViewChild(MatMenuItem)
menuItem: MatMenuItem;
constructor(
private store: Store<AppStore>,
private router: Router
) {
constructor() {
this.selection$ = this.store.select(getAppSelection);
}

View File

@@ -22,7 +22,7 @@
* from Hyland Software. If not, see <http://www.gnu.org/licenses/>.
*/
import { Component, ViewEncapsulation } from '@angular/core';
import { Component, ViewEncapsulation, inject } from '@angular/core';
import { Observable } from 'rxjs';
import { Store } from '@ngrx/store';
import { isInfoDrawerOpened, ToggleInfoDrawerAction } from '@alfresco/aca-shared/store';
@@ -60,9 +60,11 @@ import { MatIconModule } from '@angular/material/icon';
host: { class: 'app-toggle-info-drawer' }
})
export class ToggleInfoDrawerComponent {
private readonly store = inject<Store<any>>(Store);
infoDrawerOpened$: Observable<boolean>;
constructor(private store: Store<any>) {
constructor() {
this.infoDrawerOpened$ = this.store.select(isInfoDrawerOpened);
}

View File

@@ -61,10 +61,10 @@ export class ToggleJoinLibraryButtonComponent {
@ViewChild(MatMenuItem)
menuItem: MatMenuItem;
private userProfileService = inject(UserProfileService);
private notificationService = inject(NotificationService);
private appHookService = inject(AppHookService);
private store = inject(Store<AppStore>);
private readonly userProfileService = inject(UserProfileService);
private readonly notificationService = inject(NotificationService);
private readonly appHookService = inject(AppHookService);
private readonly store = inject(Store<AppStore>);
selection$: Observable<SelectionState>;
profile$ = this.userProfileService.userProfile$;

View File

@@ -59,20 +59,18 @@ import { MatDialogModule } from '@angular/material/dialog';
host: { class: 'app-view-node' }
})
export class ViewNodeComponent {
private settings = inject(AppSettingsService);
private readonly store = inject<Store<AppStore>>(Store);
private readonly router = inject(Router);
private readonly autoDownloadService = inject(AutoDownloadService);
private readonly activatedRoute = inject(ActivatedRoute);
private readonly settings = inject(AppSettingsService);
@Input() data: { title?: string; menuButton?: boolean; iconButton?: boolean };
@ViewChild(MatMenuItem)
menuItem: MatMenuItem;
constructor(
private store: Store<AppStore>,
private router: Router,
private autoDownloadService: AutoDownloadService,
private activatedRoute: ActivatedRoute
) {}
onClick() {
this.store
.select(getAppSelection)

View File

@@ -65,7 +65,7 @@ import { DocumentListComponent } from '@alfresco/adf-content-services';
encapsulation: ViewEncapsulation.None
})
export class TrashcanComponent extends PageComponent implements OnInit {
private userProfileService = inject(UserProfileService);
private readonly userProfileService = inject(UserProfileService);
user$ = this.userProfileService.userProfile$;
columns: DocumentListPresetRef[] = [];

View File

@@ -22,7 +22,7 @@
* from Hyland Software. If not, see <http://www.gnu.org/licenses/>.
*/
import { Component, ViewEncapsulation } from '@angular/core';
import { Component, ViewEncapsulation, inject } from '@angular/core';
import { Observable } from 'rxjs';
import { delay } from 'rxjs/operators';
import { Store } from '@ngrx/store';
@@ -38,9 +38,11 @@ import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
encapsulation: ViewEncapsulation.None
})
export class UploadFilesDialogComponent {
private readonly store = inject<Store<AppStore>>(Store);
showFileUploadingDialog$: Observable<boolean>;
constructor(private store: Store<AppStore>) {
constructor() {
this.showFileUploadingDialog$ = this.store.select(getFileUploadingDialog).pipe(delay(0), takeUntilDestroyed());
}
}

View File

@@ -24,7 +24,7 @@
import { AlfrescoApiService } from '@alfresco/adf-content-services';
import { PeopleApi, Person, LazyApi } from '@alfresco/js-api';
import { Component, OnInit, ViewEncapsulation } from '@angular/core';
import { Component, OnInit, ViewEncapsulation, inject } from '@angular/core';
import { FormControl, FormGroup, ReactiveFormsModule, Validators } from '@angular/forms';
import { Router } from '@angular/router';
import { Observable, take, throwError } from 'rxjs';
@@ -57,6 +57,11 @@ import { MatInputModule } from '@angular/material/input';
encapsulation: ViewEncapsulation.None
})
export class ViewProfileComponent implements OnInit {
private readonly router = inject(Router);
private readonly apiService = inject(AlfrescoApiService);
private readonly appService = inject(AppService);
private readonly extensionService = inject(AppExtensionService);
@LazyApi((self: ViewProfileComponent) => new PeopleApi(self.apiService.getInstance()))
declare peopleApi: PeopleApi;
profileForm = new FormGroup({
@@ -88,12 +93,9 @@ export class ViewProfileComponent implements OnInit {
return `APP.TOOLTIPS.${this.contactSectionExpanded ? 'COLLAPSE' : 'EXPAND'}_SECTION`;
}
constructor(
private router: Router,
private readonly apiService: AlfrescoApiService,
private readonly appService: AppService,
private readonly extensionService: AppExtensionService
) {
constructor() {
const appService = this.appService;
this.appNavNarMode$ = appService.appNavNarMode$.pipe(takeUntilDestroyed());
}

View File

@@ -22,7 +22,7 @@
* from Hyland Software. If not, see <http://www.gnu.org/licenses/>.
*/
import { Component, ViewEncapsulation, Inject, OnInit } from '@angular/core';
import { Component, ViewEncapsulation, OnInit, inject } from '@angular/core';
import { MatDialogRef, MAT_DIALOG_DATA, MatDialogModule } from '@angular/material/dialog';
import { Node } from '@alfresco/js-api';
import { UntypedFormBuilder, UntypedFormGroup, Validators, UntypedFormControl, ValidationErrors, ReactiveFormsModule } from '@angular/forms';
@@ -43,18 +43,16 @@ import { MatButtonModule } from '@angular/material/button';
encapsulation: ViewEncapsulation.None
})
export class CreateFromTemplateDialogComponent implements OnInit {
private readonly translationService = inject(TranslationService);
private readonly store = inject<Store<AppStore>>(Store);
private readonly formBuilder = inject(UntypedFormBuilder);
private readonly dialogRef = inject<MatDialogRef<CreateFromTemplateDialogComponent>>(MatDialogRef);
data = inject<Node>(MAT_DIALOG_DATA);
public form: UntypedFormGroup;
title = '';
constructor(
private translationService: TranslationService,
private store: Store<AppStore>,
private formBuilder: UntypedFormBuilder,
private dialogRef: MatDialogRef<CreateFromTemplateDialogComponent>,
@Inject(MAT_DIALOG_DATA) public data: Node
) {}
ngOnInit() {
this.form = this.formBuilder.group({
name: [this.data.name, [Validators.required, this.forbidEndingDot, this.forbidOnlySpaces, this.forbidSpecialCharacters]],

View File

@@ -26,6 +26,10 @@ import { DocumentListDirective } from './document-list.directive';
import { Subject } from 'rxjs';
import { SetSelectedNodesAction } from '@alfresco/aca-shared/store';
import { TestBed } from '@angular/core/testing';
import { Store } from '@ngrx/store';
import { DocumentListComponent, DocumentListService } from '@alfresco/adf-content-services';
import { UserPreferencesService } from '@alfresco/adf-core';
import { ActivatedRoute, Router } from '@angular/router';
describe('DocumentListDirective', () => {
let documentListDirective: DocumentListDirective;
@@ -77,16 +81,37 @@ describe('DocumentListDirective', () => {
};
beforeEach(() => {
TestBed.runInInjectionContext(() => {
documentListDirective = new DocumentListDirective(
storeMock,
documentListMock,
userPreferencesServiceMock,
mockRoute,
mockRouter,
documentListServiceMock as any
);
TestBed.configureTestingModule({
imports: [DocumentListDirective],
providers: [
DocumentListDirective,
{
provide: Store,
useValue: storeMock
},
{
provide: DocumentListComponent,
useValue: documentListMock
},
{
provide: UserPreferencesService,
useValue: userPreferencesServiceMock
},
{
provide: ActivatedRoute,
useValue: mockRoute
},
{
provide: Router,
useValue: mockRouter
},
{
provide: DocumentListService,
useValue: documentListServiceMock
}
]
});
documentListDirective = TestBed.inject(DocumentListDirective);
});
afterEach(() => {

View File

@@ -37,6 +37,13 @@ import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
selector: '[acaDocumentList]'
})
export class DocumentListDirective implements OnInit {
private readonly store = inject<Store<any>>(Store);
private readonly documentList = inject(DocumentListComponent);
private readonly preferences = inject(UserPreferencesService);
private readonly route = inject(ActivatedRoute);
private readonly router = inject(Router);
private readonly documentListService = inject(DocumentListService);
private isLibrary = false;
selectedNode: NodeEntry;
@@ -46,15 +53,6 @@ export class DocumentListDirective implements OnInit {
private readonly destroyRef = inject(DestroyRef);
constructor(
private store: Store<any>,
private documentList: DocumentListComponent,
private preferences: UserPreferencesService,
private route: ActivatedRoute,
private router: Router,
private documentListService: DocumentListService
) {}
ngOnInit() {
this.documentList.stickyHeader = true;
this.documentList.includeFields = ['isFavorite', 'aspectNames', 'definition'];

View File

@@ -23,7 +23,7 @@
*/
import { AppExtensionService } from '@alfresco/aca-shared';
import { Pipe, PipeTransform } from '@angular/core';
import { Pipe, PipeTransform, inject } from '@angular/core';
import { AppStore, getRepositoryStatus } from '@alfresco/aca-shared/store';
import { Store } from '@ngrx/store';
import { filter, map, Observable } from 'rxjs';
@@ -32,10 +32,8 @@ import { filter, map, Observable } from 'rxjs';
name: 'isFeatureSupportedInCurrentAcs'
})
export class IsFeatureSupportedInCurrentAcsPipe implements PipeTransform {
constructor(
private readonly appExtensionsService: AppExtensionService,
private readonly store: Store<AppStore>
) {}
private readonly appExtensionsService = inject(AppExtensionService);
private readonly store = inject<Store<AppStore>>(Store);
transform(evaluatorId: string): Observable<boolean> {
return this.store.select(getRepositoryStatus).pipe(

View File

@@ -29,9 +29,9 @@ import { MatDialog } from '@angular/material/dialog';
@Injectable({ providedIn: 'root' })
export class ModalAiService {
private route = inject(ActivatedRoute);
private dialog = inject(MatDialog);
private userPreferencesService = inject(UserPreferencesService);
private readonly route = inject(ActivatedRoute);
private readonly dialog = inject(MatDialog);
private readonly userPreferencesService = inject(UserPreferencesService);
openUnsavedChangesModal(callback: () => void): void {
const hasPreviousSearch = this.route.snapshot?.queryParams?.query?.length > 0;

View File

@@ -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 { MatDialog } from '@angular/material/dialog';
import { Observable, Subject, of, zip, from } from 'rxjs';
import { ThumbnailService, TranslationService } from '@alfresco/adf-core';
@@ -56,6 +56,14 @@ type BatchOperationType = Extract<NodeAction, 'COPY' | 'MOVE'>;
providedIn: 'root'
})
export class NodeActionsService {
private readonly contentService = inject(ContentService);
private readonly contentApi = inject(ContentApiService);
private readonly dialog = inject(MatDialog);
private readonly documentListService = inject(DocumentListService);
private readonly apiService = inject(AlfrescoApiService);
private readonly translation = inject(TranslationService);
private readonly thumbnailService = inject(ThumbnailService);
contentCopied: Subject<NodeEntry[]> = new Subject<NodeEntry[]>();
contentMoved: Subject<any> = new Subject<any>();
moveDeletedEntries: any[] = [];
@@ -64,16 +72,6 @@ export class NodeActionsService {
@LazyApi((self: NodeActionsService) => new NodesApi(self.apiService.getInstance()))
declare nodesApi: NodesApi;
constructor(
private contentService: ContentService,
private contentApi: ContentApiService,
private dialog: MatDialog,
private documentListService: DocumentListService,
private apiService: AlfrescoApiService,
private translation: TranslationService,
private thumbnailService: ThumbnailService
) {}
/**
* Copy node list
*

View File

@@ -46,10 +46,10 @@ export interface TemplateDialogConfig {
providedIn: 'root'
})
export class NodeTemplateService {
private alfrescoApiService = inject(AlfrescoApiService);
private notificationService = inject(NotificationService);
private translation = inject(TranslationService);
private dialog = inject(MatDialog);
private readonly alfrescoApiService = inject(AlfrescoApiService);
private readonly notificationService = inject(NotificationService);
private readonly translation = inject(TranslationService);
private readonly dialog = inject(MatDialog);
private currentTemplateConfig: TemplateDialogConfig = null;
private rootNode: ResultNode;

View File

@@ -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 { Observable, ReplaySubject, switchMap, take } from 'rxjs';
import { NodeEntry } from '@alfresco/js-api';
import { SavedSearch, SavedSearchesLegacyService, SavedSearchesService, SavedSearchStrategy } from '@alfresco/adf-content-services';
@@ -33,15 +33,16 @@ import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
providedIn: 'root'
})
export class SavedSearchesContextService implements SavedSearchStrategy {
private readonly legacyService = inject(SavedSearchesLegacyService);
private readonly modernService = inject(SavedSearchesService);
currentContextSavedSearch: SavedSearch;
private readonly strategy$ = new ReplaySubject<SavedSearchStrategy>(1);
constructor(
private readonly legacyService: SavedSearchesLegacyService,
private readonly modernService: SavedSearchesService,
isFeatureSupported: IsFeatureSupportedInCurrentAcsPipe
) {
constructor() {
const isFeatureSupported = inject(IsFeatureSupportedInCurrentAcsPipe);
isFeatureSupported
.transform('isPreferencesApiAvailable')
.pipe(takeUntilDestroyed())

View File

@@ -22,21 +22,19 @@
* from Hyland Software. If not, see <http://www.gnu.org/licenses/>.
*/
import { Injectable } from '@angular/core';
import { Injectable, inject } from '@angular/core';
import { Params, Router } from '@angular/router';
import { SearchAiService } from '@alfresco/adf-content-services';
@Injectable({ providedIn: 'root' })
export class SearchAiNavigationService {
private readonly router = inject(Router);
private readonly searchAiService = inject(SearchAiService);
private readonly knowledgeRetrievalRoute = '/knowledge-retrieval';
private previousRoute = '';
constructor(
private router: Router,
private searchAiService: SearchAiService
) {}
navigateToPreviousRouteOrCloseInput(): void {
if (this.router.url.includes(this.knowledgeRetrievalRoute)) {
void this.router.navigateByUrl(this.previousRoute || '/personal-files');

View File

@@ -35,11 +35,11 @@ import { ContentUrlService } from '../../services/content-url.service';
@Injectable()
export class DownloadEffects {
private store = inject(Store<AppStore>);
private actions$ = inject(Actions);
private contentApi = inject(ContentApiService);
private dialog = inject(MatDialog);
private contentUrlService = inject(ContentUrlService);
private readonly store = inject(Store<AppStore>);
private readonly actions$ = inject(Actions);
private readonly contentApi = inject(ContentApiService);
private readonly dialog = inject(MatDialog);
private readonly contentUrlService = inject(ContentUrlService);
downloadNode$ = createEffect(
() =>

View File

@@ -31,9 +31,9 @@ import { ContentManagementService } from '../../services/content-management.serv
@Injectable()
export class FavoriteEffects {
private store = inject(Store<AppStore>);
private actions$ = inject(Actions);
private content = inject(ContentManagementService);
private readonly store = inject(Store<AppStore>);
private readonly actions$ = inject(Actions);
private readonly content = inject(ContentManagementService);
addFavorite$ = createEffect(
() =>

View File

@@ -45,11 +45,11 @@ import { HttpErrorResponse } from '@angular/common/http';
@Injectable()
export class LibraryEffects {
private notificationService = inject(NotificationService);
private store = inject(Store<AppStore>);
private actions$ = inject(Actions);
private content = inject(ContentManagementService);
private contentApi = inject(ContentApiService);
private readonly notificationService = inject(NotificationService);
private readonly store = inject(Store<AppStore>);
private readonly actions$ = inject(Actions);
private readonly content = inject(ContentManagementService);
private readonly contentApi = inject(ContentApiService);
deleteLibrary$ = createEffect(
() =>

View File

@@ -32,9 +32,9 @@ import { Params } from '@angular/router';
@Injectable()
export class SearchAiEffects {
private actions$ = inject(Actions);
private searchNavigationService = inject(SearchAiNavigationService);
private searchAiService = inject(SearchAiService);
private readonly actions$ = inject(Actions);
private readonly searchNavigationService = inject(SearchAiNavigationService);
private readonly searchAiService = inject(SearchAiService);
searchByTerm$ = createEffect(
() =>
this.actions$.pipe(

View File

@@ -44,8 +44,8 @@ import { AlfrescoApiService, DocumentListService } from '@alfresco/adf-content-s
@Injectable()
export class TemplateEffects {
private notificationService = inject(NotificationService);
private documentListService = inject(DocumentListService);
private readonly notificationService = inject(NotificationService);
private readonly documentListService = inject(DocumentListService);
@LazyApi((self: TemplateEffects) => new NodesApi(self.apiService.getInstance()))
declare nodesApi: NodesApi;

View File

@@ -43,7 +43,7 @@ import { FileModel, UploadService } from '@alfresco/adf-content-services';
@Injectable()
export class UploadEffects {
private notificationService = inject(NotificationService);
private readonly notificationService = inject(NotificationService);
private readonly fileInput: HTMLInputElement;
private readonly folderInput: HTMLInputElement;

View File

@@ -48,11 +48,11 @@ export const fileToPreview = createSelector(getAppSelection, getCurrentFolder, (
@Injectable()
export class ViewerEffects {
private store = inject(Store<AppStore>);
private actions$ = inject(Actions);
private router = inject(Router);
private extensions = inject(AppExtensionService);
private dialog = inject(MatDialog);
private readonly store = inject(Store<AppStore>);
private readonly actions$ = inject(Actions);
private readonly router = inject(Router);
private readonly extensions = inject(AppExtensionService);
private readonly dialog = inject(MatDialog);
fullscreenViewer$ = createEffect(
() =>

View File

@@ -22,7 +22,7 @@
* from Hyland Software. If not, see <http://www.gnu.org/licenses/>.
*/
import { Component, HostListener, OnInit, ViewEncapsulation } from '@angular/core';
import { Component, HostListener, OnInit, ViewEncapsulation, inject } from '@angular/core';
import { CommonModule, Location } from '@angular/common';
import { ActivatedRoute, PRIMARY_OUTLET, UrlSegment, UrlSegmentGroup, UrlTree } from '@angular/router';
import { debounceTime, map } from 'rxjs/operators';
@@ -52,6 +52,14 @@ import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
host: { class: 'app-preview' }
})
export class PreviewComponent extends PageComponent implements OnInit {
private readonly actions$ = inject(Actions);
private readonly appHookService = inject(AppHookService);
private readonly contentApi = inject(ContentApiService);
private readonly location = inject(Location);
private readonly nodesApiService = inject(NodesApiService);
private readonly route = inject(ActivatedRoute);
private readonly viewerService = inject(ViewerService);
folderId: string = null;
navigateBackAsClose = false;
navigateMultiple = false;
@@ -66,19 +74,7 @@ export class PreviewComponent extends PageComponent implements OnInit {
showRightSide = false;
simplestMode = false;
private containersSkipNavigation = ['adf-viewer__sidebar', 'cdk-overlay-container', 'adf-image-viewer'];
constructor(
private actions$: Actions,
private appHookService: AppHookService,
private contentApi: ContentApiService,
private location: Location,
private nodesApiService: NodesApiService,
private route: ActivatedRoute,
private viewerService: ViewerService
) {
super();
}
private readonly containersSkipNavigation = ['adf-viewer__sidebar', 'cdk-overlay-container', 'adf-image-viewer'];
ngOnInit() {
super.ngOnInit();

Some files were not shown because too many files have changed in this diff Show More