diff --git a/package-lock.json b/package-lock.json index a717fdf..3c0dc2e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,18 +8,18 @@ "name": "artcoded-backoffice", "version": "2024.0.3", "dependencies": { - "@angular/animations": "^17.1.0", - "@angular/cdk": "^17.1.0", - "@angular/common": "^17.1.0", - "@angular/compiler": "^17.1.0", - "@angular/core": "^17.1.0", - "@angular/forms": "^17.1.0", - "@angular/localize": "^17.1.0", - "@angular/platform-browser": "^17.1.0", - "@angular/platform-browser-dynamic": "^17.1.0", - "@angular/platform-server": "^17.1.0", - "@angular/router": "^17.1.0", - "@angular/service-worker": "^17.1.0", + "@angular/animations": "^17.1.1", + "@angular/cdk": "^17.1.1", + "@angular/common": "^17.1.1", + "@angular/compiler": "^17.1.1", + "@angular/core": "^17.1.1", + "@angular/forms": "^17.1.1", + "@angular/localize": "^17.1.1", + "@angular/platform-browser": "^17.1.1", + "@angular/platform-browser-dynamic": "^17.1.1", + "@angular/platform-server": "^17.1.1", + "@angular/router": "^17.1.1", + "@angular/service-worker": "^17.1.1", "@fortawesome/angular-fontawesome": "^0.14.1", "@fortawesome/fontawesome-svg-core": "^6.5.1", "@fortawesome/free-brands-svg-icons": "^6.5.1", @@ -50,15 +50,15 @@ "zone.js": "^0.14.2" }, "devDependencies": { - "@angular-devkit/build-angular": "^17.1.0", - "@angular-devkit/schematics": "^17.1.0", - "@angular-eslint/builder": "17.2.0", - "@angular-eslint/eslint-plugin": "17.2.0", - "@angular-eslint/eslint-plugin-template": "17.2.0", - "@angular-eslint/schematics": "17.2.0", - "@angular-eslint/template-parser": "17.2.0", - "@angular/cli": "^17.1.0", - "@angular/compiler-cli": "^17.1.0", + "@angular-devkit/build-angular": "^17.1.1", + "@angular-devkit/schematics": "^17.1.1", + "@angular-eslint/builder": "17.2.1", + "@angular-eslint/eslint-plugin": "17.2.1", + "@angular-eslint/eslint-plugin-template": "17.2.1", + "@angular-eslint/schematics": "17.2.1", + "@angular-eslint/template-parser": "17.2.1", + "@angular/cli": "^17.1.1", + "@angular/compiler-cli": "^17.1.1", "@types/bootstrap": "^5.2.8", "@types/node": "^18.11.9", "@typescript-eslint/eslint-plugin": "^6.10.0", @@ -92,12 +92,12 @@ } }, "node_modules/@angular-devkit/architect": { - "version": "0.1701.0", - "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1701.0.tgz", - "integrity": "sha512-VP6mjptKFn0HO2dn4bH0mFMe4CrexlWlgnTHyAUbL7ZFaV9w4VQuE/vXr60wMlQ+83NIGUeJImjt1QVNlIjJnQ==", + "version": "0.1701.1", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1701.1.tgz", + "integrity": "sha512-vT3ZRAIfNyIg0vJWT6umPbCKiKFCukNkxLe9kgOU0tinZKNr/LgWYaBZ92Rxxi6C3NrAnmAYjsih8x4zdyoRXw==", "dev": true, "dependencies": { - "@angular-devkit/core": "17.1.0", + "@angular-devkit/core": "17.1.1", "rxjs": "7.8.1" }, "engines": { @@ -107,15 +107,15 @@ } }, "node_modules/@angular-devkit/build-angular": { - "version": "17.1.0", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-17.1.0.tgz", - "integrity": "sha512-N9B2SlKewD48qKFgRPKDH1X2EvOGll1ocMlFxi95mT9aXuFd2d75JUYHzS1v3FQRU3peoAoFKxCV7OuIL/cmTA==", + "version": "17.1.1", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-17.1.1.tgz", + "integrity": "sha512-GchDM8H+RQNts731c+jnhDgOm0PnCS3YB12uVwRiGsaNsUMrqKnu3P0poh6AImDMPyXKnIvTWLDCMD8TDziR0A==", "dev": true, "dependencies": { "@ampproject/remapping": "2.2.1", - "@angular-devkit/architect": "0.1701.0", - "@angular-devkit/build-webpack": "0.1701.0", - "@angular-devkit/core": "17.1.0", + "@angular-devkit/architect": "0.1701.1", + "@angular-devkit/build-webpack": "0.1701.1", + "@angular-devkit/core": "17.1.1", "@babel/core": "7.23.7", "@babel/generator": "7.23.6", "@babel/helper-annotate-as-pure": "7.22.5", @@ -126,7 +126,7 @@ "@babel/preset-env": "7.23.7", "@babel/runtime": "7.23.7", "@discoveryjs/json-ext": "0.5.7", - "@ngtools/webpack": "17.1.0", + "@ngtools/webpack": "17.1.1", "@vitejs/plugin-basic-ssl": "1.0.2", "ansi-colors": "4.1.3", "autoprefixer": "10.4.16", @@ -169,7 +169,7 @@ "tree-kill": "1.2.2", "tslib": "2.6.2", "undici": "6.2.1", - "vite": "5.0.11", + "vite": "5.0.12", "watchpack": "2.4.0", "webpack": "5.89.0", "webpack-dev-middleware": "6.1.1", @@ -402,12 +402,12 @@ } }, "node_modules/@angular-devkit/build-webpack": { - "version": "0.1701.0", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.1701.0.tgz", - "integrity": "sha512-AUQbdnAXMdXKPj51RWr+0SusTh5M1EWEpXtEZgDSO5Vab6ak+xsX+k1IhjlEoliF0prHjD5WzBegr6WKCjZ30w==", + "version": "0.1701.1", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.1701.1.tgz", + "integrity": "sha512-YgNl/6xLmI0XdUCu/H4Jyi34BhrANCDP4N2Pz+tGwnz2+Vl8oZGLPGtKVbh/LKSAmEHk/B6GQUekSBpKWrPJoA==", "dev": true, "dependencies": { - "@angular-devkit/architect": "0.1701.0", + "@angular-devkit/architect": "0.1701.1", "rxjs": "7.8.1" }, "engines": { @@ -421,9 +421,9 @@ } }, "node_modules/@angular-devkit/core": { - "version": "17.1.0", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-17.1.0.tgz", - "integrity": "sha512-w7HeJjyM6YtjXrwFdmFIsp9lzDPAFJov8hVCD18DZaCwryRixz+o8egfw2SkpI4L8kuGAiGxpaCTRsTQtmR4/w==", + "version": "17.1.1", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-17.1.1.tgz", + "integrity": "sha512-b1wd1caegc1p18nTrfPhfHQAZW1GnWWKGldq5MZ8C/nkgJbjjN8SKb1Vw7GONkOnH6KxWDAXS4i93/wdQcz4Bg==", "dev": true, "dependencies": { "ajv": "8.12.0", @@ -482,12 +482,12 @@ } }, "node_modules/@angular-devkit/schematics": { - "version": "17.1.0", - "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-17.1.0.tgz", - "integrity": "sha512-7q4Bk3+ePBdzrmMWxWBnNdN4kmBe2jJwa3vAofaMqZiIBEor85YcOsrUJvcWM/3+/TusgZr4p/4+oJgiYDrj5A==", + "version": "17.1.1", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-17.1.1.tgz", + "integrity": "sha512-3AtEO7k0Znzg11o51ZqebkW8063QkZ7Y7BC96Oye+wSdpT3ow57P0w0UtOpUNesNKzj1iMuPWqqm4i+YqitjCw==", "dev": true, "dependencies": { - "@angular-devkit/core": "17.1.0", + "@angular-devkit/core": "17.1.1", "jsonc-parser": "3.2.0", "magic-string": "0.30.5", "ora": "5.4.1", @@ -500,9 +500,9 @@ } }, "node_modules/@angular-eslint/builder": { - "version": "17.2.0", - "resolved": "https://registry.npmjs.org/@angular-eslint/builder/-/builder-17.2.0.tgz", - "integrity": "sha512-xPxgCTPcnFRT8OYs9R5UZVAtzVouIIfdMOqTcB847Cev4H8kqRz0gO5aqkQiL+0erwnLf8D4nRzMTJjSBpQQNw==", + "version": "17.2.1", + "resolved": "https://registry.npmjs.org/@angular-eslint/builder/-/builder-17.2.1.tgz", + "integrity": "sha512-O30eaR0wCPiP+zKWvXj2JM8hVq30Wok2rp7zJMFm3PurjF9nWIIyexXkE5fa538DYZYxu8N3gQRqhpv5jvTXCg==", "dev": true, "dependencies": { "@nx/devkit": "17.2.8", @@ -514,19 +514,19 @@ } }, "node_modules/@angular-eslint/bundled-angular-compiler": { - "version": "17.2.0", - "resolved": "https://registry.npmjs.org/@angular-eslint/bundled-angular-compiler/-/bundled-angular-compiler-17.2.0.tgz", - "integrity": "sha512-uBvPbPE2JxqpdLs//Nd5+TRLgjxDxvTYgmGFTKI9Eo98krqps+rhSQCRSHWACukzc25X3Q4ITHfvjODQL8qQkg==", + "version": "17.2.1", + "resolved": "https://registry.npmjs.org/@angular-eslint/bundled-angular-compiler/-/bundled-angular-compiler-17.2.1.tgz", + "integrity": "sha512-puC0itsZv2QlrDOCcWtq1KZH+DvfrpV+mV78HHhi6+h25R5iIhr8ARKcl3EQxFjvrFq34jhG8pSupxKvFbHVfA==", "dev": true }, "node_modules/@angular-eslint/eslint-plugin": { - "version": "17.2.0", - "resolved": "https://registry.npmjs.org/@angular-eslint/eslint-plugin/-/eslint-plugin-17.2.0.tgz", - "integrity": "sha512-8A3hD/11N6QEchsAGggTPmNsa0GS5p44t930slMsxrTvdSlKAo56FzVdxwSkOcejKIJs57oWxoKvtK4UyLYkeA==", + "version": "17.2.1", + "resolved": "https://registry.npmjs.org/@angular-eslint/eslint-plugin/-/eslint-plugin-17.2.1.tgz", + "integrity": "sha512-9yA81BHpsaCUKRBtHGN3ieAy8HpIoffzPQMu34lYqZFT4yGHGhYmhQjNSQGBRbV2LD9dVv2U35rMHNmUcozXpw==", "dev": true, "dependencies": { - "@angular-eslint/utils": "17.2.0", - "@typescript-eslint/utils": "6.18.0" + "@angular-eslint/utils": "17.2.1", + "@typescript-eslint/utils": "6.19.0" }, "peerDependencies": { "eslint": "^7.20.0 || ^8.0.0", @@ -534,15 +534,15 @@ } }, "node_modules/@angular-eslint/eslint-plugin-template": { - "version": "17.2.0", - "resolved": "https://registry.npmjs.org/@angular-eslint/eslint-plugin-template/-/eslint-plugin-template-17.2.0.tgz", - "integrity": "sha512-CkcAOWWqNwX0FXeLwJu0Vctso8q/NPHJ95R2Cy8hjwuMyFF83/vDouyeIjYC+SRv6hbevmNa+BbdYXhQZinIHw==", + "version": "17.2.1", + "resolved": "https://registry.npmjs.org/@angular-eslint/eslint-plugin-template/-/eslint-plugin-template-17.2.1.tgz", + "integrity": "sha512-hl1hcHtcm90wyVL1OQGTz16oA0KHon+FFb3Qg0fLXObaXxA495Ecefd9ub5Xxg4JEOPRDi29bF1Y3YKpwflgeg==", "dev": true, "dependencies": { - "@angular-eslint/bundled-angular-compiler": "17.2.0", - "@angular-eslint/utils": "17.2.0", - "@typescript-eslint/type-utils": "6.18.0", - "@typescript-eslint/utils": "6.18.0", + "@angular-eslint/bundled-angular-compiler": "17.2.1", + "@angular-eslint/utils": "17.2.1", + "@typescript-eslint/type-utils": "6.19.0", + "@typescript-eslint/utils": "6.19.0", "aria-query": "5.3.0", "axobject-query": "4.0.0" }, @@ -552,13 +552,13 @@ } }, "node_modules/@angular-eslint/schematics": { - "version": "17.2.0", - "resolved": "https://registry.npmjs.org/@angular-eslint/schematics/-/schematics-17.2.0.tgz", - "integrity": "sha512-lV2+2H3Hf6FCJfM+cddJ/7ss3qc99OO2wuvTjGNH512mP75tvfLakV+e6TFFdzK0km+ceXvB2VqNXMSShB4PVQ==", + "version": "17.2.1", + "resolved": "https://registry.npmjs.org/@angular-eslint/schematics/-/schematics-17.2.1.tgz", + "integrity": "sha512-7ldtIePI4ZTp/TBpeOZkzfv30HSAn//4TgtFuqvojudI8n8batV5FqQ0VNm1e0zitl75t8Zwtr0KYT4I6vh59g==", "dev": true, "dependencies": { - "@angular-eslint/eslint-plugin": "17.2.0", - "@angular-eslint/eslint-plugin-template": "17.2.0", + "@angular-eslint/eslint-plugin": "17.2.1", + "@angular-eslint/eslint-plugin-template": "17.2.1", "@nx/devkit": "17.2.8", "ignore": "5.3.0", "nx": "17.2.8", @@ -570,12 +570,12 @@ } }, "node_modules/@angular-eslint/template-parser": { - "version": "17.2.0", - "resolved": "https://registry.npmjs.org/@angular-eslint/template-parser/-/template-parser-17.2.0.tgz", - "integrity": "sha512-Js9w1IXWPvXEjd05bWkZzRaLw0g0mJPztAWOj3DiU7H9LKkautQq0zZu02cAAnXZim2CsAagEh2GmGjhaYvoKg==", + "version": "17.2.1", + "resolved": "https://registry.npmjs.org/@angular-eslint/template-parser/-/template-parser-17.2.1.tgz", + "integrity": "sha512-WPQYFvRju0tCDXQ/pwrzC911pE07JvpeDgcN2elhzV6lxDHJEZpA5O9pnW9qgNA6J6XM9Q7dBkJ22ztAzC4WFw==", "dev": true, "dependencies": { - "@angular-eslint/bundled-angular-compiler": "17.2.0", + "@angular-eslint/bundled-angular-compiler": "17.2.1", "eslint-scope": "^8.0.0" }, "peerDependencies": { @@ -609,13 +609,13 @@ } }, "node_modules/@angular-eslint/utils": { - "version": "17.2.0", - "resolved": "https://registry.npmjs.org/@angular-eslint/utils/-/utils-17.2.0.tgz", - "integrity": "sha512-J7DsFKb5yxv8te8LQvChNn6MBvKulcBx+jtHX1uen+uuuv8XhZuVMZXS0rolUkdl1Q0mBeHpkuO2q6Vh17pqbQ==", + "version": "17.2.1", + "resolved": "https://registry.npmjs.org/@angular-eslint/utils/-/utils-17.2.1.tgz", + "integrity": "sha512-qQYTBXy90dWM7fhhpa5i9lTtqqhJisvRa+naCrQx9kBgR458JScLdkVIdcZ9D/rPiDCmKiVUfgcDISnjUeqTqg==", "dev": true, "dependencies": { - "@angular-eslint/bundled-angular-compiler": "17.2.0", - "@typescript-eslint/utils": "6.18.0" + "@angular-eslint/bundled-angular-compiler": "17.2.1", + "@typescript-eslint/utils": "6.19.0" }, "peerDependencies": { "eslint": "^7.20.0 || ^8.0.0", @@ -623,9 +623,9 @@ } }, "node_modules/@angular/animations": { - "version": "17.1.0", - "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-17.1.0.tgz", - "integrity": "sha512-EzyJsla/CnRX4ARmHe9J1m3Pl+J4m5hznzeQFyZpJehikaHKAGGJTGM/+DFAX9TuR1ZpCmS0z0oWsYzag2Q7RA==", + "version": "17.1.1", + "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-17.1.1.tgz", + "integrity": "sha512-85qm8b4fNKa5zx4YlvCvAb3lWGlRsEcClnpCuwSVP8pXG7n/cW8MsJOh8i/wOkQTr9Ac7vvAE+yFWMi2A/qlTg==", "dependencies": { "tslib": "^2.3.0" }, @@ -633,13 +633,13 @@ "node": "^18.13.0 || >=20.9.0" }, "peerDependencies": { - "@angular/core": "17.1.0" + "@angular/core": "17.1.1" } }, "node_modules/@angular/cdk": { - "version": "17.1.0", - "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-17.1.0.tgz", - "integrity": "sha512-a2+uqr1s2pCStFs78BM1ViVqi0GnxFHGKHo58hiR9pDV/pyg9cvy+d+rsci1HkuF9AC/UqV5Y6rGLfwayO183g==", + "version": "17.1.1", + "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-17.1.1.tgz", + "integrity": "sha512-Q5qC6VUyT7N/hj8eETdh0bkmBmsXm0JZikhXdBvcDUl8yPbhMPKQCkx4UJzBrZJg/+78XyI9FI/q8w/yQAJZJA==", "dependencies": { "tslib": "^2.3.0" }, @@ -653,15 +653,15 @@ } }, "node_modules/@angular/cli": { - "version": "17.1.0", - "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-17.1.0.tgz", - "integrity": "sha512-mZh8ibV94CqHls+GTHok9rF78UvrtKZx+o1QOcG50ZM1L5O5s2NYrBhf+QXVeTTmzhSH1wXQb7ueyuLNLVB/eA==", + "version": "17.1.1", + "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-17.1.1.tgz", + "integrity": "sha512-JG/Vf+PScR3PC6u7B+jFF4s5eBByzCpOfCfRFw98nlCqDAOxYOig7wi2Sbp5fnvILQH8vbc/NG8MzdgONrG6Hg==", "dev": true, "dependencies": { - "@angular-devkit/architect": "0.1701.0", - "@angular-devkit/core": "17.1.0", - "@angular-devkit/schematics": "17.1.0", - "@schematics/angular": "17.1.0", + "@angular-devkit/architect": "0.1701.1", + "@angular-devkit/core": "17.1.1", + "@angular-devkit/schematics": "17.1.1", + "@schematics/angular": "17.1.1", "@yarnpkg/lockfile": "1.1.0", "ansi-colors": "4.1.3", "ini": "4.1.1", @@ -702,9 +702,9 @@ } }, "node_modules/@angular/common": { - "version": "17.1.0", - "resolved": "https://registry.npmjs.org/@angular/common/-/common-17.1.0.tgz", - "integrity": "sha512-0Zg62iSynyRr2QslC8dVwSo46mkKrVENnwcBvsgTJ8rfGiuRdKMX8nWm5EUEm3ohKmYLfHvyEjsKDRn//UefVw==", + "version": "17.1.1", + "resolved": "https://registry.npmjs.org/@angular/common/-/common-17.1.1.tgz", + "integrity": "sha512-YMM2vImWJg7H3Yaej7ncGpFKT28V2Y6X9/rLpRdSKAiUbcbj7GeWtX/upfZGR9KmD08baYZw0YTNMR03Ubv/mg==", "dependencies": { "tslib": "^2.3.0" }, @@ -712,14 +712,14 @@ "node": "^18.13.0 || >=20.9.0" }, "peerDependencies": { - "@angular/core": "17.1.0", + "@angular/core": "17.1.1", "rxjs": "^6.5.3 || ^7.4.0" } }, "node_modules/@angular/compiler": { - "version": "17.1.0", - "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-17.1.0.tgz", - "integrity": "sha512-gF4i/WtPSiSvT4YNasTNnckOxdxuSNwi0EsncrtewwveBcCatjqaXNssUCiF5TgxlC2sKTmsPcMqDJrfX2LMpw==", + "version": "17.1.1", + "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-17.1.1.tgz", + "integrity": "sha512-lEQ5YNMJQm2iO2EZbGkwL3SqnxtE2ENfymgbS023F6ACsnP3kKB2DMwOnIbGgQY4+8r4sJFiMAIjEkj5c9kttg==", "dependencies": { "tslib": "^2.3.0" }, @@ -727,7 +727,7 @@ "node": "^18.13.0 || >=20.9.0" }, "peerDependencies": { - "@angular/core": "17.1.0" + "@angular/core": "17.1.1" }, "peerDependenciesMeta": { "@angular/core": { @@ -736,9 +736,9 @@ } }, "node_modules/@angular/compiler-cli": { - "version": "17.1.0", - "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-17.1.0.tgz", - "integrity": "sha512-WDpO4WvC5ItjaRexnpFpKPpT+cu+5GYkWF8h74iHhfxOgU+gaQiMWERHylWCqF25AzmhKu0iI3ZZtaIJ6qqwog==", + "version": "17.1.1", + "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-17.1.1.tgz", + "integrity": "sha512-d6Aev1P92q7wd5u3UcJifzNlU9svxaYI2Ts6MKoD4jY4/GPN/gPDqi20weDMujEgirrkcwGbsCXBRoEGkA5c9A==", "dependencies": { "@babel/core": "7.23.2", "@jridgewell/sourcemap-codec": "^1.4.14", @@ -758,14 +758,14 @@ "node": "^18.13.0 || >=20.9.0" }, "peerDependencies": { - "@angular/compiler": "17.1.0", + "@angular/compiler": "17.1.1", "typescript": ">=5.2 <5.4" } }, "node_modules/@angular/core": { - "version": "17.1.0", - "resolved": "https://registry.npmjs.org/@angular/core/-/core-17.1.0.tgz", - "integrity": "sha512-9OvRRZq+46S+ICZLRYIGVU2pknuPz23B+5V3jz7cDA5V43GVcMnfmAbMClPQxm7kRGnqtQ+yzBjn+HubCerE6g==", + "version": "17.1.1", + "resolved": "https://registry.npmjs.org/@angular/core/-/core-17.1.1.tgz", + "integrity": "sha512-JtNYM9eHr8eUSrGPq/kn0+/F+TSZ7EBWxZhM1ZndOlGu1gA4fGhrDid4ZXIHIs07DbM4NZjMn+LhRyx02YDsSA==", "dependencies": { "tslib": "^2.3.0" }, @@ -778,9 +778,9 @@ } }, "node_modules/@angular/forms": { - "version": "17.1.0", - "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-17.1.0.tgz", - "integrity": "sha512-JD9IAxa5gQnjzxYJXm3H+lBuyv/dCnPHl6fpvb/JGrxY6xi4gfndyI8AkAb/wOAQgZDsIPaq5s4eWDjhr7CpyA==", + "version": "17.1.1", + "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-17.1.1.tgz", + "integrity": "sha512-rqHVzaJDV8+VbnfC6mDgzX6ooa0X0hmnd+XfuOZaEJ7MtyOmqQ8qas2PAKXU7nMIImYXfYc4O4XWbSc1pRy1Hw==", "dependencies": { "tslib": "^2.3.0" }, @@ -788,16 +788,16 @@ "node": "^18.13.0 || >=20.9.0" }, "peerDependencies": { - "@angular/common": "17.1.0", - "@angular/core": "17.1.0", - "@angular/platform-browser": "17.1.0", + "@angular/common": "17.1.1", + "@angular/core": "17.1.1", + "@angular/platform-browser": "17.1.1", "rxjs": "^6.5.3 || ^7.4.0" } }, "node_modules/@angular/localize": { - "version": "17.1.0", - "resolved": "https://registry.npmjs.org/@angular/localize/-/localize-17.1.0.tgz", - "integrity": "sha512-GW+1F72lRnCwppu2GzGP04d3UhtdhqMHlCbBdZzQUbv8XQfU+22MOGZx/Ry8sXnanZDgH+u+2A4bvrKZPsVgZg==", + "version": "17.1.1", + "resolved": "https://registry.npmjs.org/@angular/localize/-/localize-17.1.1.tgz", + "integrity": "sha512-vZc+YhpE7eRWFzdZFOidSjZlTl6+8VH0x2m7WesaSgw2fu1IgOQffZFnaGveAQ8DXbMfgBb4exPNJFPYmNgoSQ==", "dependencies": { "@babel/core": "7.23.2", "@types/babel__core": "7.20.2", @@ -813,14 +813,14 @@ "node": "^18.13.0 || >=20.9.0" }, "peerDependencies": { - "@angular/compiler": "17.1.0", - "@angular/compiler-cli": "17.1.0" + "@angular/compiler": "17.1.1", + "@angular/compiler-cli": "17.1.1" } }, "node_modules/@angular/platform-browser": { - "version": "17.1.0", - "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-17.1.0.tgz", - "integrity": "sha512-Klq92ZUX0+ZsxLvbYtIEP3GtVEfMLYPxmBP0pWNZyYIeJCg/YxPS76QSvEhBaMqFelk4RzkDQEIfixC16UIgOA==", + "version": "17.1.1", + "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-17.1.1.tgz", + "integrity": "sha512-/80znuEkdDvsF6EX/fe03isQlLCUS9+ldCgB4n0ZL+qAkf2/lJlU3n97SyEN7rzb189U+K1fDe0fb1nDwbbcWQ==", "dependencies": { "tslib": "^2.3.0" }, @@ -828,9 +828,9 @@ "node": "^18.13.0 || >=20.9.0" }, "peerDependencies": { - "@angular/animations": "17.1.0", - "@angular/common": "17.1.0", - "@angular/core": "17.1.0" + "@angular/animations": "17.1.1", + "@angular/common": "17.1.1", + "@angular/core": "17.1.1" }, "peerDependenciesMeta": { "@angular/animations": { @@ -839,9 +839,9 @@ } }, "node_modules/@angular/platform-browser-dynamic": { - "version": "17.1.0", - "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-17.1.0.tgz", - "integrity": "sha512-rqPRZZx6VcSx81HIQr1XMBgb7fYSj6pOZNTJGZkn2KNxrz6hyU3A3qaom1VSVRK5vvNb1cFn35mg/zyOIliTIg==", + "version": "17.1.1", + "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-17.1.1.tgz", + "integrity": "sha512-UKI8966nwo+p01EjmQdkepLIeVLpPZTSDZAM4va7CfMO6lbCN5xFecDd/sVbut8J6ySIsbJxyDkP+SHMQjE+xg==", "dependencies": { "tslib": "^2.3.0" }, @@ -849,16 +849,16 @@ "node": "^18.13.0 || >=20.9.0" }, "peerDependencies": { - "@angular/common": "17.1.0", - "@angular/compiler": "17.1.0", - "@angular/core": "17.1.0", - "@angular/platform-browser": "17.1.0" + "@angular/common": "17.1.1", + "@angular/compiler": "17.1.1", + "@angular/core": "17.1.1", + "@angular/platform-browser": "17.1.1" } }, "node_modules/@angular/platform-server": { - "version": "17.1.0", - "resolved": "https://registry.npmjs.org/@angular/platform-server/-/platform-server-17.1.0.tgz", - "integrity": "sha512-UdP97SMIzNybss2GoFFAQNwSu0XdK0PbY992nDWVhwP8PAWO0aBKiVP6HyuPmw7REkKEd4gTqtQoPrcz+rAfsg==", + "version": "17.1.1", + "resolved": "https://registry.npmjs.org/@angular/platform-server/-/platform-server-17.1.1.tgz", + "integrity": "sha512-zZbJL56m1n/btwVV0TNc/YPqXYZp9rcnDEvl9HHFNfoinkQrcxHy6MHQUjEyQ1IAIv9Y0f73pmSbJ86BcloIAw==", "dependencies": { "tslib": "^2.3.0", "xhr2": "^0.2.0" @@ -867,17 +867,17 @@ "node": "^18.13.0 || >=20.9.0" }, "peerDependencies": { - "@angular/animations": "17.1.0", - "@angular/common": "17.1.0", - "@angular/compiler": "17.1.0", - "@angular/core": "17.1.0", - "@angular/platform-browser": "17.1.0" + "@angular/animations": "17.1.1", + "@angular/common": "17.1.1", + "@angular/compiler": "17.1.1", + "@angular/core": "17.1.1", + "@angular/platform-browser": "17.1.1" } }, "node_modules/@angular/router": { - "version": "17.1.0", - "resolved": "https://registry.npmjs.org/@angular/router/-/router-17.1.0.tgz", - "integrity": "sha512-VDeVLiiS4iEwqwgsLyL9hqA1djFW3yveMnhZIwviJlnp9vG2r/ggMKhNmdP1Hb2iaNgflyhyhwafJ0gi9SLi5A==", + "version": "17.1.1", + "resolved": "https://registry.npmjs.org/@angular/router/-/router-17.1.1.tgz", + "integrity": "sha512-pPIRX0v8agij2dRSU25iwj9qFy0S25cztsy7bGfZ+M510jwRCqu1JsitqXtQ85XSv/bdFqiNiFU0UbwVFl+QiQ==", "dependencies": { "tslib": "^2.3.0" }, @@ -885,16 +885,16 @@ "node": "^18.13.0 || >=20.9.0" }, "peerDependencies": { - "@angular/common": "17.1.0", - "@angular/core": "17.1.0", - "@angular/platform-browser": "17.1.0", + "@angular/common": "17.1.1", + "@angular/core": "17.1.1", + "@angular/platform-browser": "17.1.1", "rxjs": "^6.5.3 || ^7.4.0" } }, "node_modules/@angular/service-worker": { - "version": "17.1.0", - "resolved": "https://registry.npmjs.org/@angular/service-worker/-/service-worker-17.1.0.tgz", - "integrity": "sha512-JHuX44o7QWpmCElfjiYBJwO4ocuKMX7rMplKb6mFZpE5AbOWKs08dWaMh9mdWA4epQMAX6HZQZUVEtkXUaLdjg==", + "version": "17.1.1", + "resolved": "https://registry.npmjs.org/@angular/service-worker/-/service-worker-17.1.1.tgz", + "integrity": "sha512-/ggG10tY5LWsGvJYLGhE0gdL8r9fEmRrZ6i+UCdwG/+Ydyb5GBxLS7OGH6yy0R8WP19FDRmVoDVMFJMtc4JMAw==", "dependencies": { "tslib": "^2.3.0" }, @@ -905,8 +905,8 @@ "node": "^18.13.0 || >=20.9.0" }, "peerDependencies": { - "@angular/common": "17.1.0", - "@angular/core": "17.1.0" + "@angular/common": "17.1.1", + "@angular/core": "17.1.1" } }, "node_modules/@assemblyscript/loader": { @@ -3451,9 +3451,9 @@ } }, "node_modules/@ngtools/webpack": { - "version": "17.1.0", - "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-17.1.0.tgz", - "integrity": "sha512-FAp5Vh4Y4DFDnrxEitggEkeDwHCml7m6hZUgohvA6n6mwrMT0ZZXnk3MIrKRnT6A9cr1wcnxMW+jIXx/cJZGlw==", + "version": "17.1.1", + "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-17.1.1.tgz", + "integrity": "sha512-uPWEpRuAUmMBZhYMpkEHNbeI8QAgeVM5lnWM+02lK75u1+sgYy32ed+RcRvEI+8hRQcsCQ8HtR4QubgJb4TzCQ==", "dev": true, "engines": { "node": "^18.13.0 || >=20.9.0", @@ -4073,13 +4073,13 @@ ] }, "node_modules/@schematics/angular": { - "version": "17.1.0", - "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-17.1.0.tgz", - "integrity": "sha512-u9pCesRWb6mVtLnFLSfZ8R21TDz8YCebAxViefWsJlb0+p0yknesVL1nG/Oi9tgfhczS991HGIVsLT41bZthUw==", + "version": "17.1.1", + "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-17.1.1.tgz", + "integrity": "sha512-1Wqefy1W9Y63g48Fp7BscL95V4U1seDGgZawH6DcJnytJVW89hazao7YREzLYfdoediuw7lU+OHJksWYe4VQww==", "dev": true, "dependencies": { - "@angular-devkit/core": "17.1.0", - "@angular-devkit/schematics": "17.1.0", + "@angular-devkit/core": "17.1.1", + "@angular-devkit/schematics": "17.1.1", "jsonc-parser": "3.2.0" }, "engines": { @@ -4771,13 +4771,13 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "6.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.18.0.tgz", - "integrity": "sha512-ZeMtrXnGmTcHciJN1+u2CigWEEXgy1ufoxtWcHORt5kGvpjjIlK9MUhzHm4RM8iVy6dqSaZA/6PVkX6+r+ChjQ==", + "version": "6.19.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.19.0.tgz", + "integrity": "sha512-mcvS6WSWbjiSxKCwBcXtOM5pRkPQ6kcDds/juxcy/727IQr3xMEcwr/YLHW2A2+Fp5ql6khjbKBzOyjuPqGi/w==", "dev": true, "dependencies": { - "@typescript-eslint/typescript-estree": "6.18.0", - "@typescript-eslint/utils": "6.18.0", + "@typescript-eslint/typescript-estree": "6.19.0", + "@typescript-eslint/utils": "6.19.0", "debug": "^4.3.4", "ts-api-utils": "^1.0.1" }, @@ -4798,9 +4798,9 @@ } }, "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/types": { - "version": "6.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.18.0.tgz", - "integrity": "sha512-/RFVIccwkwSdW/1zeMx3hADShWbgBxBnV/qSrex6607isYjj05t36P6LyONgqdUrNLl5TYU8NIKdHUYpFvExkA==", + "version": "6.19.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.19.0.tgz", + "integrity": "sha512-lFviGV/vYhOy3m8BJ/nAKoAyNhInTdXpftonhWle66XHAtT1ouBlkjL496b5H5hb8dWXHwtypTqgtb/DEa+j5A==", "dev": true, "engines": { "node": "^16.0.0 || >=18.0.0" @@ -4811,13 +4811,13 @@ } }, "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/typescript-estree": { - "version": "6.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.18.0.tgz", - "integrity": "sha512-klNvl+Ql4NsBNGB4W9TZ2Od03lm7aGvTbs0wYaFYsplVPhr+oeXjlPZCDI4U9jgJIDK38W1FKhacCFzCC+nbIg==", + "version": "6.19.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.19.0.tgz", + "integrity": "sha512-o/zefXIbbLBZ8YJ51NlkSAt2BamrK6XOmuxSR3hynMIzzyMY33KuJ9vuMdFSXW+H0tVvdF9qBPTHA91HDb4BIQ==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.18.0", - "@typescript-eslint/visitor-keys": "6.18.0", + "@typescript-eslint/types": "6.19.0", + "@typescript-eslint/visitor-keys": "6.19.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -4839,12 +4839,12 @@ } }, "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/visitor-keys": { - "version": "6.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.18.0.tgz", - "integrity": "sha512-1wetAlSZpewRDb2h9p/Q8kRjdGuqdTAQbkJIOUMLug2LBLG+QOjiWoSj6/3B/hA9/tVTFFdtiKvAYoYnSRW/RA==", + "version": "6.19.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.19.0.tgz", + "integrity": "sha512-hZaUCORLgubBvtGpp1JEFEazcuEdfxta9j4iUwdSAr7mEsYYAp3EAUyCZk3VEEqGj6W+AV4uWyrDGtrlawAsgQ==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.18.0", + "@typescript-eslint/types": "6.19.0", "eslint-visitor-keys": "^3.4.1" }, "engines": { @@ -4950,17 +4950,17 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "6.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.18.0.tgz", - "integrity": "sha512-wiKKCbUeDPGaYEYQh1S580dGxJ/V9HI7K5sbGAVklyf+o5g3O+adnS4UNJajplF4e7z2q0uVBaTdT/yLb4XAVA==", + "version": "6.19.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.19.0.tgz", + "integrity": "sha512-QR41YXySiuN++/dC9UArYOg4X86OAYP83OWTewpVx5ct1IZhjjgTLocj7QNxGhWoTqknsgpl7L+hGygCO+sdYw==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", "@types/json-schema": "^7.0.12", "@types/semver": "^7.5.0", - "@typescript-eslint/scope-manager": "6.18.0", - "@typescript-eslint/types": "6.18.0", - "@typescript-eslint/typescript-estree": "6.18.0", + "@typescript-eslint/scope-manager": "6.19.0", + "@typescript-eslint/types": "6.19.0", + "@typescript-eslint/typescript-estree": "6.19.0", "semver": "^7.5.4" }, "engines": { @@ -4975,13 +4975,13 @@ } }, "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/scope-manager": { - "version": "6.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.18.0.tgz", - "integrity": "sha512-o/UoDT2NgOJ2VfHpfr+KBY2ErWvCySNUIX/X7O9g8Zzt/tXdpfEU43qbNk8LVuWUT2E0ptzTWXh79i74PP0twA==", + "version": "6.19.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.19.0.tgz", + "integrity": "sha512-dO1XMhV2ehBI6QN8Ufi7I10wmUovmLU0Oru3n5LVlM2JuzB4M+dVphCPLkVpKvGij2j/pHBWuJ9piuXx+BhzxQ==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.18.0", - "@typescript-eslint/visitor-keys": "6.18.0" + "@typescript-eslint/types": "6.19.0", + "@typescript-eslint/visitor-keys": "6.19.0" }, "engines": { "node": "^16.0.0 || >=18.0.0" @@ -4992,9 +4992,9 @@ } }, "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/types": { - "version": "6.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.18.0.tgz", - "integrity": "sha512-/RFVIccwkwSdW/1zeMx3hADShWbgBxBnV/qSrex6607isYjj05t36P6LyONgqdUrNLl5TYU8NIKdHUYpFvExkA==", + "version": "6.19.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.19.0.tgz", + "integrity": "sha512-lFviGV/vYhOy3m8BJ/nAKoAyNhInTdXpftonhWle66XHAtT1ouBlkjL496b5H5hb8dWXHwtypTqgtb/DEa+j5A==", "dev": true, "engines": { "node": "^16.0.0 || >=18.0.0" @@ -5005,13 +5005,13 @@ } }, "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/typescript-estree": { - "version": "6.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.18.0.tgz", - "integrity": "sha512-klNvl+Ql4NsBNGB4W9TZ2Od03lm7aGvTbs0wYaFYsplVPhr+oeXjlPZCDI4U9jgJIDK38W1FKhacCFzCC+nbIg==", + "version": "6.19.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.19.0.tgz", + "integrity": "sha512-o/zefXIbbLBZ8YJ51NlkSAt2BamrK6XOmuxSR3hynMIzzyMY33KuJ9vuMdFSXW+H0tVvdF9qBPTHA91HDb4BIQ==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.18.0", - "@typescript-eslint/visitor-keys": "6.18.0", + "@typescript-eslint/types": "6.19.0", + "@typescript-eslint/visitor-keys": "6.19.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -5033,12 +5033,12 @@ } }, "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/visitor-keys": { - "version": "6.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.18.0.tgz", - "integrity": "sha512-1wetAlSZpewRDb2h9p/Q8kRjdGuqdTAQbkJIOUMLug2LBLG+QOjiWoSj6/3B/hA9/tVTFFdtiKvAYoYnSRW/RA==", + "version": "6.19.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.19.0.tgz", + "integrity": "sha512-hZaUCORLgubBvtGpp1JEFEazcuEdfxta9j4iUwdSAr7mEsYYAp3EAUyCZk3VEEqGj6W+AV4uWyrDGtrlawAsgQ==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.18.0", + "@typescript-eslint/types": "6.19.0", "eslint-visitor-keys": "^3.4.1" }, "engines": { @@ -15276,9 +15276,9 @@ } }, "node_modules/vite": { - "version": "5.0.11", - "resolved": "https://registry.npmjs.org/vite/-/vite-5.0.11.tgz", - "integrity": "sha512-XBMnDjZcNAw/G1gEiskiM1v6yzM4GE5aMGvhWTlHAYYhxb7S3/V1s3m2LDHa8Vh6yIWYYB0iJwsEaS523c4oYA==", + "version": "5.0.12", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.0.12.tgz", + "integrity": "sha512-4hsnEkG3q0N4Tzf1+t6NdN9dg/L3BM+q8SWgbSPnJvrgH2kgdyzfVJwbR1ic69/4uMJJ/3dqDZZE5/WwqW8U1w==", "dev": true, "dependencies": { "esbuild": "^0.19.3", diff --git a/package.json b/package.json index 22d0285..085c651 100644 --- a/package.json +++ b/package.json @@ -12,18 +12,18 @@ }, "private": true, "dependencies": { - "@angular/animations": "^17.1.0", - "@angular/cdk": "^17.1.0", - "@angular/common": "^17.1.0", - "@angular/compiler": "^17.1.0", - "@angular/core": "^17.1.0", - "@angular/forms": "^17.1.0", - "@angular/localize": "^17.1.0", - "@angular/platform-browser": "^17.1.0", - "@angular/platform-browser-dynamic": "^17.1.0", - "@angular/platform-server": "^17.1.0", - "@angular/router": "^17.1.0", - "@angular/service-worker": "^17.1.0", + "@angular/animations": "^17.1.1", + "@angular/cdk": "^17.1.1", + "@angular/common": "^17.1.1", + "@angular/compiler": "^17.1.1", + "@angular/core": "^17.1.1", + "@angular/forms": "^17.1.1", + "@angular/localize": "^17.1.1", + "@angular/platform-browser": "^17.1.1", + "@angular/platform-browser-dynamic": "^17.1.1", + "@angular/platform-server": "^17.1.1", + "@angular/router": "^17.1.1", + "@angular/service-worker": "^17.1.1", "@fortawesome/angular-fontawesome": "^0.14.1", "@fortawesome/fontawesome-svg-core": "^6.5.1", "@fortawesome/free-brands-svg-icons": "^6.5.1", @@ -54,15 +54,15 @@ "zone.js": "^0.14.2" }, "devDependencies": { - "@angular-devkit/build-angular": "^17.1.0", - "@angular-devkit/schematics": "^17.1.0", - "@angular-eslint/builder": "17.2.0", - "@angular-eslint/eslint-plugin": "17.2.0", - "@angular-eslint/eslint-plugin-template": "17.2.0", - "@angular-eslint/schematics": "17.2.0", - "@angular-eslint/template-parser": "17.2.0", - "@angular/cli": "^17.1.0", - "@angular/compiler-cli": "^17.1.0", + "@angular-devkit/build-angular": "^17.1.1", + "@angular-devkit/schematics": "^17.1.1", + "@angular-eslint/builder": "17.2.1", + "@angular-eslint/eslint-plugin": "17.2.1", + "@angular-eslint/eslint-plugin-template": "17.2.1", + "@angular-eslint/schematics": "17.2.1", + "@angular-eslint/template-parser": "17.2.1", + "@angular/cli": "^17.1.1", + "@angular/compiler-cli": "^17.1.1", "@types/bootstrap": "^5.2.8", "@types/node": "^18.11.9", "@typescript-eslint/eslint-plugin": "^6.10.0", @@ -75,4 +75,4 @@ "tslib": "^2.4.1", "typescript": "~5.2.2" } -} +} \ No newline at end of file diff --git a/src/app/app-routing.module.ts b/src/app/app-routing.module.ts index d0d33d2..43e8e36 100644 --- a/src/app/app-routing.module.ts +++ b/src/app/app-routing.module.ts @@ -18,20 +18,21 @@ const routes: Routes = [ path: 'documents', loadChildren: () => import('./features/administrative-document/administrative-document.module').then( - (m) => m.AdministrativeDocumentModule + (m) => m.AdministrativeDocumentModule, ), }, { path: 'billable-clients', - loadChildren: () => - import('./features/billable-client/billable-client.module').then( - (m) => m.BillableClientModule - ), + loadChildren: () => import('./features/billable-client/billable-client.module').then((m) => m.BillableClientModule), }, { path: 'timesheets', loadChildren: () => import('./features/timesheet/timesheet.module').then((m) => m.TimesheetModule), }, + { + path: 'mails', + loadChildren: () => import('./features/mail/mail.module').then((m) => m.MailModule), + }, { path: 'services', loadChildren: () => import('./features/service/service.module').then((m) => m.ServiceModule), @@ -75,17 +76,16 @@ const routes: Routes = [ { path: '**', redirectTo: '404', - }, ]; @NgModule({ imports: [ RouterModule.forRoot(routes, { - useHash: false, - initialNavigation: 'enabledNonBlocking' -}), + useHash: false, + initialNavigation: 'enabledNonBlocking', + }), ], exports: [RouterModule], }) -export class AppRoutingModule {} +export class AppRoutingModule { } diff --git a/src/app/core/models/mail-request.ts b/src/app/core/models/mail-request.ts deleted file mode 100644 index 5382fc2..0000000 --- a/src/app/core/models/mail-request.ts +++ /dev/null @@ -1,9 +0,0 @@ -export interface MailRequest { - to: string[]; - subject: string; - body: string; - bcc: boolean; - uploadIds: string[]; - sendingDate?: string; -} -export type MailContextType = string | number | boolean; diff --git a/src/app/core/models/mail.ts b/src/app/core/models/mail.ts new file mode 100644 index 0000000..df1c7c1 --- /dev/null +++ b/src/app/core/models/mail.ts @@ -0,0 +1,21 @@ +export interface MailRequest { + to: string[]; + subject: string; + body: string; + bcc: boolean; + uploadIds: string[]; + sendingDate?: string; +} +export interface MailJob { + id: string; + createdDate: Date; + updatedDate?: Date; + sent: boolean; + sendingDate?: Date; + to: string[]; + subject: string; + body: string; + bcc: boolean; + uploadIds: string[]; +} +export type MailContextType = string | number | boolean; diff --git a/src/app/core/service/mail.service.ts b/src/app/core/service/mail.service.ts index c7972fe..a505cd9 100644 --- a/src/app/core/service/mail.service.ts +++ b/src/app/core/service/mail.service.ts @@ -2,7 +2,8 @@ import { HttpClient } from '@angular/common/http'; import { Injectable } from '@angular/core'; import { Observable } from 'rxjs'; import { ConfigInitService } from '@init/config-init.service'; -import { MailRequest } from '@core/models/mail-request'; +import { MailJob, MailRequest } from '@core/models/mail'; +import { Page } from '@core/models/page'; @Injectable({ providedIn: 'root', @@ -10,11 +11,19 @@ import { MailRequest } from '@core/models/mail-request'; export class MailService { basePath: string; - constructor(private http: HttpClient, configService: ConfigInitService) { + constructor( + private http: HttpClient, + configService: ConfigInitService, + ) { this.basePath = `${configService.getConfig()['BACKEND_URL']}/api/mail`; } send(data: MailRequest): Observable { return this.http.post(`${this.basePath}/send`, data); } + + findAll(pageNumber: number, pageSize: number): Observable> { + const url = `${this.basePath}/find-all?page=${pageNumber - 1}&size=${pageSize}&sort=creationDate,DESC`; + return this.http.get>(url); + } } diff --git a/src/app/features/administrative-document/document-result/document-result.component.ts b/src/app/features/administrative-document/document-result/document-result.component.ts index da6ceb7..b2f5051 100644 --- a/src/app/features/administrative-document/document-result/document-result.component.ts +++ b/src/app/features/administrative-document/document-result/document-result.component.ts @@ -17,7 +17,7 @@ import { NotificationService } from '@core/service/notification.service'; import { ArtcodedNotification } from '@core/models/artcoded.notification'; import { OnDestroy } from '@angular/core'; import { SplitPdfComponent } from '../split-pdf/split-pdf.component'; -import { MailContextType, MailRequest } from '@core/models/mail-request'; +import { MailContextType, MailRequest } from '@core/models/mail'; import { MailFormComponent } from '@shared/mail-form/mail-form.component'; import { ToastService } from '@core/service/toast.service'; import { MailService } from '@core/service/mail.service'; @@ -45,7 +45,7 @@ export class DocumentResultComponent implements OnInit, OnDestroy, OnApplication private toastService: ToastService, private mailService: MailService, private dossierService: DossierService, - private titleService: Title + private titleService: Title, ) { } ngOnInit() { @@ -83,13 +83,13 @@ export class DocumentResultComponent implements OnInit, OnDestroy, OnApplication .search(this.searchCriteria, event, this.pageSize) .pipe( tap((page) => { - const attachmentIds = page.content?.map(d => d.attachmentId); - this.fileService.findByIds(attachmentIds).subscribe(attachments => { - attachments.forEach(attachment => { - page.content.filter(d => d.attachmentId === attachment.id).forEach(d => d.attachment = attachment); + const attachmentIds = page.content?.map((d) => d.attachmentId); + this.fileService.findByIds(attachmentIds).subscribe((attachments) => { + attachments.forEach((attachment) => { + page.content.filter((d) => d.attachmentId === attachment.id).forEach((d) => (d.attachment = attachment)); }); }); - }) + }), ) .subscribe((data) => (this.adminDocuments = data)); } diff --git a/src/app/features/billable-client/billable-client-detail/billable-client-detail.component.ts b/src/app/features/billable-client/billable-client-detail/billable-client-detail.component.ts index 6b87af9..153b73f 100644 --- a/src/app/features/billable-client/billable-client-detail/billable-client-detail.component.ts +++ b/src/app/features/billable-client/billable-client-detail/billable-client-detail.component.ts @@ -3,7 +3,7 @@ import { UntypedFormBuilder, UntypedFormControl, UntypedFormGroup, Validators } import { BillableClient, ContractStatus, getAllDays } from '@core/models/billable-client'; import { RateType } from '@core/models/common'; import { FileUpload } from '@core/models/file-upload'; -import { MailContextType, MailRequest } from '@core/models/mail-request'; +import { MailContextType, MailRequest } from '@core/models/mail'; import { FileService } from '@core/service/file.service'; import { MailService } from '@core/service/mail.service'; import { ToastService } from '@core/service/toast.service'; @@ -44,7 +44,7 @@ export class BillableClientDetailComponent implements OnInit { private fb: UntypedFormBuilder, private modalService: NgbModal, private mailService: MailService, - private toastService: ToastService + private toastService: ToastService, ) { } ngOnInit(): void { @@ -67,7 +67,7 @@ export class BillableClientDetailComponent implements OnInit { value: this.client?.emailAddress, disabled: false, }, - [] + [], ), projectName: new UntypedFormControl({ value: this.client?.projectName, disabled: false }, [Validators.required]), defaultWorkingDays: new UntypedFormControl({ value: this.client?.defaultWorkingDays, disabled: false }, [ diff --git a/src/app/features/dossier/dossier-form/dossier-form.component.ts b/src/app/features/dossier/dossier-form/dossier-form.component.ts index d33c8bb..acd7e30 100644 --- a/src/app/features/dossier/dossier-form/dossier-form.component.ts +++ b/src/app/features/dossier/dossier-form/dossier-form.component.ts @@ -70,7 +70,7 @@ export class DossierFormComponent implements OnInit, OnDestroy { private invoiceService: InvoiceService, private documentService: AdministrativeDocumentService, private clientService: BillableClientService, - private fb: UntypedFormBuilder + private fb: UntypedFormBuilder, ) { } ngOnDestroy(): void { @@ -135,7 +135,7 @@ export class DossierFormComponent implements OnInit, OnDestroy { } this.dossier.invoices = invoices; this.dossier.invoices.sort( - (e1, e2) => new Date(e2.dateOfInvoice).getTime() - new Date(e1.dateOfInvoice).getTime() + (e1, e2) => new Date(e2.dateOfInvoice).getTime() - new Date(e1.dateOfInvoice).getTime(), ); } else { this.dossier.invoices = []; @@ -150,7 +150,7 @@ export class DossierFormComponent implements OnInit, OnDestroy { value: this.dossier.tvaDue, disabled: this.dossier.closed && !this.recallForModification, }, - [] + [], ), advancePayments: this.fb.array(this.createAdvancePayments(this.dossier.advancePayments)), dossierName: new UntypedFormControl({ value: this.dossier.name, disabled: this.dossier.closed }, [ @@ -165,14 +165,14 @@ export class DossierFormComponent implements OnInit, OnDestroy { value: this.dossier.creationDate ? formatDate(this.dossier.creationDate, 'dd/MM/yyyy HH:mm', 'de') : null, disabled: true, }, - [] + [], ), updatedDate: new UntypedFormControl( { value: this.dossier.updatedDate ? formatDate(this.dossier.updatedDate, 'dd/MM/yyyy HH:mm', 'de') : null, disabled: true, }, - [] + [], ), dossierClosed: new UntypedFormControl({ value: this.dossier.closed, disabled: true }, []), @@ -181,14 +181,14 @@ export class DossierFormComponent implements OnInit, OnDestroy { value: this.dossier.closedDate ? formatDate(this.dossier.closedDate, 'dd/MM/yyyy HH:mm', 'de') : null, disabled: true, }, - [] + [], ), dossierRecalledForModification: new UntypedFormControl( { value: this.dossier.recalledForModification, disabled: true, }, - [] + [], ), dossierRecalledForModificationDate: new UntypedFormControl( @@ -198,7 +198,7 @@ export class DossierFormComponent implements OnInit, OnDestroy { : null, disabled: true, }, - [] + [], ), }); } @@ -271,14 +271,14 @@ export class DossierFormComponent implements OnInit, OnDestroy { value: DateUtils.formatInputDate(DateUtils.toDateOrNow(tva.datePaid)), disabled: this.dossier.closed && !this.recallForModification, }, - [Validators.required] + [Validators.required], ), advance: new UntypedFormControl( { value: tva.advance, disabled: this.dossier.closed && !this.recallForModification, }, - [Validators.required, Validators.min(1)] + [Validators.required, Validators.min(1)], ), }); }; diff --git a/src/app/features/dossier/dossier-table-result/dossier-table-result.component.ts b/src/app/features/dossier/dossier-table-result/dossier-table-result.component.ts index e810d2c..ced32c9 100644 --- a/src/app/features/dossier/dossier-table-result/dossier-table-result.component.ts +++ b/src/app/features/dossier/dossier-table-result/dossier-table-result.component.ts @@ -13,7 +13,7 @@ import { DossierImportFormComponent } from '../dossier-import-form/dossier-impor import { Direction, Page, SortCriteria } from '@core/models/page'; import { MailService } from '@core/service/mail.service'; import { MailFormComponent } from '@shared/mail-form/mail-form.component'; -import { MailContextType, MailRequest } from '@core/models/mail-request'; +import { MailContextType, MailRequest } from '@core/models/mail'; import { firstValueFrom } from 'rxjs'; import { Invoice } from '@core/models/invoice'; import { AdministrativeDocument } from '@core/models/administrative-document'; @@ -44,7 +44,7 @@ export class DossierTableResultComponent implements OnInit { private toastService: ToastService, private windowRefService: WindowRefService, private modalService: NgbModal, - private mailService: MailService + private mailService: MailService, ) { } ngOnInit(): void { @@ -87,13 +87,13 @@ export class DossierTableResultComponent implements OnInit { } openDossier( doss: Dossier = { name: null, advancePayments: [] }, - recallForModification: boolean = false + recallForModification: boolean = false, ): NgbModalRef { const dossierUpdatedEmitter: EventEmitter = new EventEmitter(); const modalRef = this.modalService.open(DossierFormComponent, { size: 'xl', scrollable: true, - backdrop: 'static' + backdrop: 'static', }); modalRef.componentInstance.dossier = doss; @@ -168,7 +168,7 @@ export class DossierTableResultComponent implements OnInit { this.dossierService.closeActiveDossier().subscribe((d) => this.downloadArchive(d.dossierUploadId, () => { this.load(); - }) + }), ); } } diff --git a/src/app/features/fee/fee-table-result/fee-table-result.component.ts b/src/app/features/fee/fee-table-result/fee-table-result.component.ts index c307659..3c61675 100644 --- a/src/app/features/fee/fee-table-result/fee-table-result.component.ts +++ b/src/app/features/fee/fee-table-result/fee-table-result.component.ts @@ -18,7 +18,7 @@ import { firstValueFrom } from 'rxjs'; import { FileService } from '@core/service/file.service'; import { MailService } from '@core/service/mail.service'; import { MailFormComponent } from '@shared/mail-form/mail-form.component'; -import { MailRequest } from '@core/models/mail-request'; +import { MailRequest } from '@core/models/mail'; import { ToastService } from '@core/service/toast.service'; @Component({ @@ -50,7 +50,7 @@ export class FeeTableResultComponent implements OnInit, OnApplicationEvent { private feeService: FeeService, private fileService: FileService, private mailService: MailService, - private toastService: ToastService + private toastService: ToastService, ) { } ngOnInit(): void { @@ -133,7 +133,7 @@ export class FeeTableResultComponent implements OnInit, OnApplicationEvent { const modalRef = this.modalService.open(FeeDetailComponent, { size: 'xl', scrollable: true, - backdrop: 'static' + backdrop: 'static', }); modalRef.componentInstance.fee = f; modalRef.componentInstance.feeUpdated.subscribe((_f: any) => { diff --git a/src/app/features/invoice/invoice-detail/invoice-detail.component.ts b/src/app/features/invoice/invoice-detail/invoice-detail.component.ts index df46982..9eb2fec 100644 --- a/src/app/features/invoice/invoice-detail/invoice-detail.component.ts +++ b/src/app/features/invoice/invoice-detail/invoice-detail.component.ts @@ -1,5 +1,5 @@ import { Component, EventEmitter, Input, OnInit, Optional, Output } from '@angular/core'; -import { NgbActiveModal, NgbModal, } from '@ng-bootstrap/ng-bootstrap'; +import { NgbActiveModal, NgbModal } from '@ng-bootstrap/ng-bootstrap'; import { UntypedFormArray, UntypedFormBuilder, UntypedFormControl, UntypedFormGroup, Validators } from '@angular/forms'; import { BillTo, Invoice, InvoiceForm, InvoiceFreemarkerTemplate, InvoiceRow } from '@core/models/invoice'; import { RateType } from '@core/models/common'; @@ -11,7 +11,7 @@ import { FileService } from '@core/service/file.service'; import { PdfViewerComponent } from '@shared/pdf-viewer/pdf-viewer.component'; import { firstValueFrom } from 'rxjs'; import { MailFormComponent } from '@shared/mail-form/mail-form.component'; -import { MailContextType, MailRequest } from '@core/models/mail-request'; +import { MailContextType, MailRequest } from '@core/models/mail'; import { MailService } from '@core/service/mail.service'; import { ToastService } from '@core/service/toast.service'; @@ -41,7 +41,7 @@ export class InvoiceDetailComponent implements OnInit { private fileService: FileService, private mailService: MailService, private toastService: ToastService, - private formBuilder: UntypedFormBuilder + private formBuilder: UntypedFormBuilder, ) { } ngOnInit(): void { @@ -63,7 +63,8 @@ export class InvoiceDetailComponent implements OnInit { size: 'lg', }); ngbModalRef.componentInstance.context = context; - ngbModalRef.componentInstance.defaultSubject = `Invoice ${this.invoice.newInvoiceNumber || this.invoice.invoiceNumber}`; + ngbModalRef.componentInstance.defaultSubject = `Invoice ${this.invoice.newInvoiceNumber || this.invoice.invoiceNumber + }`; ngbModalRef.componentInstance.to = [this.invoice.billTo?.emailAddress]; ngbModalRef.componentInstance.attachments = [upload]; @@ -89,11 +90,11 @@ export class InvoiceDetailComponent implements OnInit { return this.formBuilder.group({ invoiceNumber: new UntypedFormControl( { value: this.invoice.invoiceNumber, disabled: true /* always disabled, coming from backend */ }, - [Validators.maxLength(9)] + [Validators.maxLength(9)], ), newInvoiceNumber: new UntypedFormControl( { value: this.invoice.newInvoiceNumber, disabled: true /* always disabled, coming from backend */ }, - [Validators.maxLength(9)] + [Validators.maxLength(9)], ), freemarkerTemplateId: new UntypedFormControl( @@ -103,14 +104,14 @@ export class InvoiceDetailComponent implements OnInit { : null, disabled: this.invoice.locked, }, - [Validators.required] + [Validators.required], ), selectedClient: new UntypedFormControl( { value: this.clients.find((c) => c.name === this.invoice.billTo?.clientName), disabled: this.invoice.locked, }, - [] + [], ), maxDaysToPay: new UntypedFormControl({ value: this.invoice.maxDaysToPay, disabled: this.invoice.locked }, [ Validators.min(1), @@ -121,7 +122,7 @@ export class InvoiceDetailComponent implements OnInit { value: DateUtils.formatInputDate(DateUtils.toDateOrNow(this.invoice.dateOfInvoice)), disabled: this.invoice.locked, }, - [Validators.required] + [Validators.required], ), taxRate: new UntypedFormControl({ value: this.invoice.taxRate, disabled: this.invoice.locked }, [ Validators.required, @@ -129,7 +130,7 @@ export class InvoiceDetailComponent implements OnInit { locked: new UntypedFormControl({ value: this.invoice.locked, disabled: true }, []), uploadedManually: new UntypedFormControl( { value: this.invoice.uploadedManually, disabled: this.invoice.locked }, - [] + [], ), logicalDelete: new UntypedFormControl({ value: this.invoice.logicalDelete, disabled: true }, []), billToVatNumber: new UntypedFormControl( @@ -137,14 +138,14 @@ export class InvoiceDetailComponent implements OnInit { value: this.invoice?.billTo?.vatNumber, disabled: this.invoice.locked, }, - [Validators.required] + [Validators.required], ), billToClientName: new UntypedFormControl( { value: this.invoice?.billTo?.clientName, disabled: this.invoice.locked, }, - [Validators.required] + [Validators.required], ), billToCity: new UntypedFormControl({ value: this.invoice?.billTo?.city, disabled: this.invoice.locked }, [ Validators.required, @@ -158,7 +159,7 @@ export class InvoiceDetailComponent implements OnInit { value: this.invoice?.billTo?.emailAddress, disabled: this.invoice.locked, }, - [Validators.required] + [Validators.required], ), invoiceTableForm: new UntypedFormArray(this.createInvoiceTable()), }); diff --git a/src/app/features/invoice/invoice-table-result/invoice-table-result.component.ts b/src/app/features/invoice/invoice-table-result/invoice-table-result.component.ts index d3d80c6..a8ce621 100644 --- a/src/app/features/invoice/invoice-table-result/invoice-table-result.component.ts +++ b/src/app/features/invoice/invoice-table-result/invoice-table-result.component.ts @@ -21,7 +21,7 @@ import { BillableClient, ContractStatus } from '@core/models/billable-client'; import { SortCriteria, Direction } from '@core/models/page'; import { MailFormComponent } from '@shared/mail-form/mail-form.component'; import { MailService } from '@core/service/mail.service'; -import { MailContextType, MailRequest } from '@core/models/mail-request'; +import { MailContextType, MailRequest } from '@core/models/mail'; @Component({ selector: 'app-invoice-table-result', templateUrl: './invoice-table-result.component.html', @@ -56,7 +56,7 @@ export class InvoiceTableResultComponent implements OnInit, OnApplicationEvent { private notificationService: NotificationService, private dossierService: DossierService, private fileService: FileService, - private mailService: MailService + private mailService: MailService, ) { } ngOnInit() { diff --git a/src/app/features/invoice/invoice.module.ts b/src/app/features/invoice/invoice.module.ts index 247b4ef..7fd2e79 100644 --- a/src/app/features/invoice/invoice.module.ts +++ b/src/app/features/invoice/invoice.module.ts @@ -6,19 +6,20 @@ import { SharedModule } from '@shared/shared.module'; import { FontAwesomeModule } from '@fortawesome/angular-fontawesome'; import { InvoiceDetailComponent } from './invoice-detail/invoice-detail.component'; import { FormsModule, ReactiveFormsModule } from '@angular/forms'; -import { NgbDatepickerModule, NgbDropdownModule, NgbPaginationModule, NgbNavModule, NgbTooltipModule } from '@ng-bootstrap/ng-bootstrap'; +import { + NgbDatepickerModule, + NgbDropdownModule, + NgbPaginationModule, + NgbNavModule, + NgbTooltipModule, +} from '@ng-bootstrap/ng-bootstrap'; import { InvoiceTableResultComponent } from './invoice-table-result/invoice-table-result.component'; import { NgxFileDropModule } from 'ngx-file-drop'; import { TemplateComponent } from './template/template.component'; import { AutosizeModule } from 'ngx-autosize'; @NgModule({ - declarations: [ - InvoicePageComponent, - InvoiceDetailComponent, - InvoiceTableResultComponent, - TemplateComponent, - ], + declarations: [InvoicePageComponent, InvoiceDetailComponent, InvoiceTableResultComponent, TemplateComponent], imports: [ CommonModule, SharedModule, @@ -36,4 +37,4 @@ import { AutosizeModule } from 'ngx-autosize'; ], providers: [{ provide: LOCALE_ID, useValue: 'de' }], }) -export class InvoiceModule {} +export class InvoiceModule { } diff --git a/src/app/features/layout/sidebar/fallback-menu.ts b/src/app/features/layout/sidebar/fallback-menu.ts index ed9d4d4..2fc9b38 100644 --- a/src/app/features/layout/sidebar/fallback-menu.ts +++ b/src/app/features/layout/sidebar/fallback-menu.ts @@ -256,6 +256,32 @@ export class FallbackMenu { show: true, numberOfTimesClicked: 0, }, + { + id: 'a39533c8-1a63-4453-b407-deeb1b17bfc2', + order: 21, + updatedDate: '2022-09-03T11:39:55.314+00:00', + title: 'Clients', + description: 'Billable clients', + routerLinkActiveOptions: { + exact: true, + }, + icon: ['fas', 'user'], + routerLink: ['billable-clients'], + show: true, + }, + { + id: '459d134a-6079-4309-8a33-70c53cf077fd', + order: 22, + updatedDate: '2024-01-25T21:39:55.314+00:00', + title: 'Mails', + description: 'Mails', + routerLinkActiveOptions: { + exact: true, + }, + icon: ['fas', 'mail-bulk'], + routerLink: ['mails'], + show: true, + }, ]; } } diff --git a/src/app/features/mail/mail-detail/mail-detail.component.html b/src/app/features/mail/mail-detail/mail-detail.component.html new file mode 100644 index 0000000..a858f67 --- /dev/null +++ b/src/app/features/mail/mail-detail/mail-detail.component.html @@ -0,0 +1,105 @@ + + + + diff --git a/src/app/features/mail/mail-detail/mail-detail.component.scss b/src/app/features/mail/mail-detail/mail-detail.component.scss new file mode 100644 index 0000000..118b035 --- /dev/null +++ b/src/app/features/mail/mail-detail/mail-detail.component.scss @@ -0,0 +1,4 @@ +::ng-deep .p-disabled, +.p-component:disabled { + opacity: 1; +} diff --git a/src/app/features/mail/mail-detail/mail-detail.component.ts b/src/app/features/mail/mail-detail/mail-detail.component.ts new file mode 100644 index 0000000..03a3f82 --- /dev/null +++ b/src/app/features/mail/mail-detail/mail-detail.component.ts @@ -0,0 +1,89 @@ +import { Component, Input, OnInit, Optional } from '@angular/core'; +import { NgbActiveModal, NgbModal } from '@ng-bootstrap/ng-bootstrap'; + +import { formatDate } from '@angular/common'; +import { MailJob } from '@core/models/mail'; +import { UntypedFormBuilder, UntypedFormControl, UntypedFormGroup } from '@angular/forms'; +import { FileService } from '@core/service/file.service'; +import { PdfViewerComponent } from '@shared/pdf-viewer/pdf-viewer.component'; +import { FileUpload } from '@core/models/file-upload'; +import { ImageViewerComponent } from '@shared/image-viewer/image-viewer.component'; +import { firstValueFrom } from 'rxjs'; +@Component({ + selector: 'app-mail-detail', + templateUrl: './mail-detail.component.html', + styleUrl: './mail-detail.component.scss', +}) +export class MailDetailComponent implements OnInit { + @Input() + mail: MailJob; + mailForm: UntypedFormGroup; + uploads: FileUpload[]; + constructor( + @Optional() public activeModal: NgbActiveModal, + private fileService: FileService, + private fb: UntypedFormBuilder, + private modalService: NgbModal, + ) { } + ngOnInit(): void { + this.load(); + } + openPdfViewer(upl: FileUpload) { + const ngbModalRef = this.modalService.open(PdfViewerComponent, { + size: 'xl', + scrollable: true, + }); + ngbModalRef.componentInstance.pdf = upl; + ngbModalRef.componentInstance.title = upl?.originalFilename; + } + downloadAttachment(evt: any, a: FileUpload) { + evt.stopPropagation(); + this.fileService.download(a); + } + openImageViewer(a: FileUpload) { + let ngbModalRef = this.modalService.open(ImageViewerComponent, { + size: 'xl', + scrollable: true, + }); + ngbModalRef.componentInstance.image = a; + ngbModalRef.componentInstance.title = a?.originalFilename; + } + isPdf(upl: FileUpload) { + return FileService.isPdf(upl?.contentType); + } + + isImage(upl: FileUpload) { + return FileService.isImage(upl?.contentType); + } + async load() { + this.uploads = await firstValueFrom(this.fileService.findByIds(this.mail.uploadIds)); + this.mailForm = this.fb.group({ + mailId: new UntypedFormControl({ value: this.mail.id, disabled: true }, []), + mailSubject: new UntypedFormControl({ value: this.mail.subject, disabled: true }, []), + mailTos: new UntypedFormControl({ value: this.mail.to, disabled: true }, []), + sent: new UntypedFormControl({ value: this.mail.sent, disabled: true }, []), + mailBody: new UntypedFormControl({ value: this.mail.body, disabled: true }, []), + creationDate: new UntypedFormControl( + { + value: this.mail.createdDate ? formatDate(this.mail.createdDate, 'dd/MM/yyyy HH:mm', 'de') : null, + disabled: true, + }, + [], + ), + sendingDate: new UntypedFormControl( + { + value: this.mail.sendingDate ? formatDate(this.mail.sendingDate, 'dd/MM/yyyy HH:mm', 'de') : null, + disabled: true, + }, + [], + ), + updatedDate: new UntypedFormControl( + { + value: this.mail.updatedDate ? formatDate(this.mail.updatedDate, 'dd/MM/yyyy HH:mm', 'de') : null, + disabled: true, + }, + [], + ), + }); + } +} diff --git a/src/app/features/mail/mail-page/mail-page.component.html b/src/app/features/mail/mail-page/mail-page.component.html new file mode 100644 index 0000000..cbc1024 --- /dev/null +++ b/src/app/features/mail/mail-page/mail-page.component.html @@ -0,0 +1,35 @@ + + +
+ + + + + + + + + + + + + + + + + + + + +
Sending DateSubjectToSent
{{ mail.sendingDate | date: 'dd/MM/yyyy' }}{{ mail.subject }} + {{ to }} + + +
No Content
+
+
+ + +
+
diff --git a/src/app/features/mail/mail-page/mail-page.component.scss b/src/app/features/mail/mail-page/mail-page.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/src/app/features/mail/mail-page/mail-page.component.ts b/src/app/features/mail/mail-page/mail-page.component.ts new file mode 100644 index 0000000..c8d90e8 --- /dev/null +++ b/src/app/features/mail/mail-page/mail-page.component.ts @@ -0,0 +1,45 @@ +import { Component, HostListener, OnInit } from '@angular/core'; +import { MailJob } from '@core/models/mail'; +import { Page } from '@core/models/page'; +import { MailService } from '@core/service/mail.service'; +import { NgbModal } from '@ng-bootstrap/ng-bootstrap'; +import { MailDetailComponent } from '../mail-detail/mail-detail.component'; + +@Component({ + selector: 'app-mail-page', + templateUrl: './mail-page.component.html', + styleUrl: './mail-page.component.scss', +}) +export class MailPageComponent implements OnInit { + pageSize: number = 5; + mails: Page; + fullScreen: boolean; + + @HostListener('document:keydown.escape', ['$event']) onKeydownHandler(_event: KeyboardEvent) { + if (!this.modalService.hasOpenModals()) { + this.fullScreen = false; + } + } + constructor( + private mailService: MailService, + private modalService: NgbModal, + ) { } + ngOnInit(): void { + this.load(); + } + + load(event: number = 1) { + this.mailService.findAll(event, this.pageSize).subscribe((invoices) => { + this.mails = invoices; + }); + } + openModal(mail: MailJob) { + const modalRef = this.modalService.open(MailDetailComponent, { + size: 'xl', + scrollable: true, + backdrop: 'static', + }); + + modalRef.componentInstance.mail = mail; + } +} diff --git a/src/app/features/mail/mail-routing.module.ts b/src/app/features/mail/mail-routing.module.ts new file mode 100644 index 0000000..da7602d --- /dev/null +++ b/src/app/features/mail/mail-routing.module.ts @@ -0,0 +1,20 @@ +import { NgModule } from '@angular/core'; +import { RouterModule, Routes } from '@angular/router'; +import { RoleGuard } from '@core/guards/role.guard'; +import { AuthGuard } from '@core/guards/auth.guard'; +import { MailPageComponent } from './mail-page/mail-page.component'; + +const routes: Routes = [ + { + path: '', + component: MailPageComponent, + canActivate: [AuthGuard, RoleGuard], + data: { expectedRole: ['ADMIN'] }, + }, +]; + +@NgModule({ + imports: [RouterModule.forChild(routes)], + exports: [RouterModule], +}) +export class MailRoutingModule { } diff --git a/src/app/features/mail/mail.module.ts b/src/app/features/mail/mail.module.ts new file mode 100644 index 0000000..3ac8daf --- /dev/null +++ b/src/app/features/mail/mail.module.ts @@ -0,0 +1,29 @@ +import { LOCALE_ID, NgModule } from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { SharedModule } from '@shared/shared.module'; +import { AutosizeModule } from 'ngx-autosize'; +import { NgbDropdownModule, NgbNavModule, NgbPaginationModule } from '@ng-bootstrap/ng-bootstrap'; +import { MailRoutingModule } from './mail-routing.module'; +import { FontAwesomeModule } from '@fortawesome/angular-fontawesome'; +import { MailPageComponent } from './mail-page/mail-page.component'; +import { MailDetailComponent } from './mail-detail/mail-detail.component'; +import { FormsModule, ReactiveFormsModule } from '@angular/forms'; +import { ChipsModule } from 'primeng/chips'; +@NgModule({ + declarations: [MailPageComponent, MailDetailComponent], + imports: [ + CommonModule, + SharedModule, + MailRoutingModule, + FontAwesomeModule, + AutosizeModule, + NgbDropdownModule, + NgbPaginationModule, + NgbNavModule, + ReactiveFormsModule, + FormsModule, + ChipsModule, + ], + providers: [{ provide: LOCALE_ID, useValue: 'de' }], +}) +export class MailModule { } diff --git a/src/app/features/timesheet/timesheet-detail/timesheet-detail.component.ts b/src/app/features/timesheet/timesheet-detail/timesheet-detail.component.ts index 14bf0b5..8e7b782 100644 --- a/src/app/features/timesheet/timesheet-detail/timesheet-detail.component.ts +++ b/src/app/features/timesheet/timesheet-detail/timesheet-detail.component.ts @@ -23,7 +23,7 @@ import { BillableClientService } from '@core/service/billable-client.service'; import { ToastService } from '@core/service/toast.service'; import { ContractStatus } from '@core/models/billable-client'; import { MailFormComponent } from '@shared/mail-form/mail-form.component'; -import { MailContextType, MailRequest } from '@core/models/mail-request'; +import { MailContextType, MailRequest } from '@core/models/mail'; import { MailService } from '@core/service/mail.service'; import { InvoiceDetailComponent } from '@feature/invoice/invoice-detail/invoice-detail.component'; import { InvoiceService } from '@core/service/invoice.service'; @@ -51,7 +51,7 @@ export class TimesheetDetailComponent implements OnInit, OnApplicationEvent { private fileService: FileService, private timesheetService: TimesheetService, private mailService: MailService, - private toastService: ToastService + private toastService: ToastService, ) { } ngOnInit() { @@ -181,7 +181,9 @@ export class TimesheetDetailComponent implements OnInit, OnApplicationEvent { ngbModalRef.componentInstance.attachments = [upload]; ngbModalRef.componentInstance.context = ctx; ngbModalRef.componentInstance.defaultSubject = 'Timesheet ' + ctx.get('Period'); - ngbModalRef.componentInstance.to = clients.filter(c => c.id == this.timesheet.clientId).map(c => c.emailAddress); + ngbModalRef.componentInstance.to = clients + .filter((c) => c.id == this.timesheet.clientId) + .map((c) => c.emailAddress); ngbModalRef.componentInstance.sendMail.subscribe(async (mailRequest: MailRequest) => { ngbModalRef.close(); await firstValueFrom(this.mailService.send(mailRequest)); diff --git a/src/app/shared/mail-form/mail-form.component.ts b/src/app/shared/mail-form/mail-form.component.ts index 42f4b42..94496c4 100644 --- a/src/app/shared/mail-form/mail-form.component.ts +++ b/src/app/shared/mail-form/mail-form.component.ts @@ -1,7 +1,7 @@ import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core'; import { UntypedFormBuilder, UntypedFormGroup, Validators } from '@angular/forms'; import { FileUpload } from '@core/models/file-upload'; -import { MailContextType, MailRequest } from '@core/models/mail-request'; +import { MailContextType, MailRequest } from '@core/models/mail'; import { DateUtils } from '@core/utils/date-utils'; import { EmailsValidator } from '@core/validators/emails.validator'; import { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap';